2014-10-13 4 views
6

UISplitViewController을 윈도우의 루트로 사용하는 앱으로 작업하고 있습니다. 마스터 뷰와 디테일 뷰 컨트롤러가 모두 UITableViewControllerUINavigationController이고 UIToolbar이 보이기를 바랍니다. 표시된 바와 같이 가로로 일정한 크기의 너비, 이는 잘 작동 :세부보기 컨트롤러를 표시 할 때 iOS8 UIToolbar가 사라짐

iPad 2

문제는 UISplitViewControllerUINavigationController 같은 스택에 상세보기 제어기를 추진 수평 소형 클래스에 상기 세부 정보가 표시 될 때 도구 모음이 사라지고 세부 정보가 완전히 표시되면 다시 나타납니다 (아래 참조). 툴바가 정상적인 내비게이션 컨트롤러와 마찬가지로 제자리에 남아 있기를 바랍니다.

enter image description here

샘플 프로젝트는 here을 업로드했습니다.

답변

6

(초기) 내비게이션 컨트롤러는 화면 상에 하나의 툴바를 사용할 수없고 스크린 상에 다른 항목을 슬라이딩 할 수 없기 때문에 Apple은 마스터 툴바를 숨기기로 선택했다고 생각합니다. Apple의 Mail 앱을 보면, 보시는 것처럼 푸시 애니메이션 중에 주 도구 모음이 사라집니다.

흥미롭게도, 캘린더 앱은 요일 및 이벤트보기 컨트롤러 전환 사이의 멋진 멋진 도구 모음 crossFade를 사용합니다. 애니메이션을 보면 두 번째 툴바가 첫 번째 툴바 위에 움직이는 대신 두 개의 뷰에 대해 하나의 툴바임을 알 수 있습니다.

crossFade는 UINavigationController에 의해 비공개로 지원되지만 Apple은이 특정보기 컨트롤러 애니메이션에 대해 개인적으로 지원하지 않습니다. _shouldCrossFadeBottomBars은 NO를 반환하고 delegateShouldCrossFadeBottomBars 탐색 컨트롤러 플래그에 대한 설정자가 없습니다.

통합 스토리 보드 하단 막대 애니메이션 UISplitViewController에 대한 지원 요청과 함께 버그 보고서를 제출합니다. 나는 애플이 아이폰의 분할 뷰 컨트롤러 기능을 향상시킬 것이라고 생각한다.

한편, 기본 탐색 컨트롤러의 도구 모음을 숨기고 마스터보기 컨트롤러의 스토리 보드에 도구 모음을 추가하여이를 처리 할 수 ​​있습니다. 이렇게하면 마스터보기 컨트롤러 자체의 도구 모음이 화면 상에 표시되고 상세보기 컨트롤러의 도구 모음 항목은 슬라이드됩니다.

이렇게하면 주인의 UITableViewControllerUIViewController으로 변경됩니다. UIToolbar 및 제약 조건을 추가하십시오. 테이블의 경우 UITableView에 넣거나 컨테이너보기를 사용하여 UITableviewController에 연결할 수 있습니다.

세부보기의 도구 모음을 DetailViewController에 설치하십시오. 뷰가 나타나기 전에

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // Do any additional setup after loading the view, typically from a nib. 

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] init ...]; 
    self.toolbarItems = @[barButtonItem]; 

    [self configureView]; 
} 

내비게이션 제어기 (뷰가로드 된 후) 툴바 항목을 설정 한 것이며, 툴바의 상세보기와 함께 스크린 상에 푸시한다.

궁금한 점이 있다면 수평 컴팩트 사이즈 클래스의 상세보기 도구 모음에서 계속 진행되는 것으로 알고 있습니다. 보조 탐색 컨트롤러 인 이 아닌 세부보기 컨트롤러가 기본 탐색 컨트롤러 스택으로 푸시됩니다.기본 탐색 컨트롤러는 보조 탐색 컨트롤러에서 해당보기 (자세히)보기 컨트롤러에 속한 navigationItems (및 toolbarItems)과 함께 해당 장식을 선택합니다.

불행히도 분할보기의 보조 (내비게이션) 컨트롤러를 접는 장면의 속임수는 기본 탐색 컨트롤러가 보조 탐색 컨트롤러가 처리하는 것이었기 때문에 툴바에 영향을 미칩니다.

보조 탐색기 컨트롤러에서 세부보기 컨트롤러로 보조 도구 모음을 이동하면 보조 탐색 컨트롤러가 밀릴 때 주 탐색 컨트롤러가 자세히보기 컨트롤러의 도구 모음 애니메이션을 처리 할 수 ​​있습니다.

향후 업데이트에서 분할보기 컨트롤러가 스토리 보드 도구 모음을 애니메이션으로 만들 수는 있지만 현재로서는 코드 작성 방법을 알고있는 유일한 방법입니다.

+0

아주 좋은 설명; 분명하고 심오합니다. "그것은 기본 탐색 컨트롤러 스택에 밀어 넣어지는 디테일 뷰 컨트롤러가 아닌 보조 탐색 컨트롤러입니다." 옳은. 나는 이것에 대해 논평했다. 놀랍지 만 전혀 작동하지 않는다. https://devforums.apple.com/message/1056959#1056959 애플 내부 담당자의 유용한 응답. – matt

+0

어쩌면,하지만 돌아가서 알아 내야 할 것 같습니다. 지금 당장 나는 첫 번째 초안을 통과하기를 원한다. 어떻게하는지 알면 어쩌면 내가 훔칠 수있는 github의 예제 프로젝트를 만들 수 있습니다 ...? :) – matt

+1

와우. 그것은 확실히 문서 누락입니다. 그들은 몇 가지 적응 관련 WWDC 2014 비디오 중 하나에서 이것에 관해 뭔가를 말했을 것입니다 ...! 물론 그들은 이것에 관해서는 아무 말도하지 않았지만 아직 결정적인 것으로 드러났습니다 : http://stackoverflow.com/a/26591842/341994 – matt

3

기본보기 컨트롤러를 변경하지 않고 마스터 - 디테일 애플리케이션을 사용해야하고 디테일보기 컨트롤러로 이동할 때 툴바가 사라지면 ... 마스터보기에 다음 코드 줄을 추가 할 수 있습니다 viewWillAppore의 Controller는 툴바가 튀었을 때 segue가 끝날 때까지 나타나기를 기다리지 않고 segue 동안 거기에있을 수 있도록합니다. 기본 테이블보기 컨트롤러를 삭제하고있는 테이블보기와 표준보기 컨트롤러를 사용하고 도구 모음을 추가 할 수 있습니다 물론

self.navigationController?.setToolbarHidden(false, animated: true) 

는, 당신은 문제가 없습니다. 더 이상 표보기 컨트롤러에없고 표준 탐색 컨트롤러가 clearsSelectionOnViewWillAppear를 지원하지 않기 때문에 코드 줄이 끊어집니다. 당신은 당신의 viewWillAppear에이 코드를 추가하여이 문제를 해결할 수

tableView.clearsSelectionOnViewWillAppear = self.splitViewController!.collapsed 

...

 if let indexPath = tableView.indexPathForSelectedRow { 
     tableView.deselectRowAtIndexPath(indexPath, animated: true) 
    }