2017-10-10 4 views
0

모름차순 콘트롤러에서 표시 한 자체 사용자 지정 컨테이너보기 컨트롤러 (루트보기 컨트롤러 자체가 아니기 때문에) 입니다. 루트보기 컨트롤러는 호출 상태 표시 줄이 표시 될 때 레이아웃이 올바르게 처리됩니다. 이제 모달로 사용자 지정 컨테이너에 자식 (예 : SomeViewController의 인스턴스를 허용)을 표시하면 자식이 예상대로 레이아웃됩니다. 맞춤 컨테이너가 이미 표시되어있는 상태에서 통화 상태 표시 줄이 표시되면 자녀가 올바르게 조정됩니다.사용자 지정 컨테이너가 호출 상태 표시 줄에 맞게 레이아웃을 올바르게 조정하지 못합니다.

맞춤 컨테이너가 아직 표시되지 않은 상태에서 통화 상태 표시 줄이 표시되면 문제가 발생합니다. 통화 상태 표시 줄이있는 상태에서 사용자 정의 컨테이너를 표시하면 하위보기의 하단이 확장 상태 표시 줄 (즉, 20 포인트)의 크기만큼 잘립니다. 프레임의 크기가 올바른지 또는 오프셋이 설정되어 있는지 확인하십시오. 통화 상태 표시 줄을 닫으면 상단이 새로 확보 된 공간으로 조정되지만 하단은 잘립니다. 비슷한에 대한 몇 가지 SO 질문이 있지만

let container = ContainerController() 
trainingContainer.selectedViewController = SomeViewController() 
self.present(trainingContainer, animated: true, completion: nil) 

:

다음 쇼 컨테이너보기 관련 코드 :

class ContainerController: UIViewController { 

    var selectedViewController: UIViewController? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let selectedViewController = selectedViewController { 
      initialTransition(to: selectedViewController) 
     } 
    } 

    fileprivate func initialTransition(to viewController: UIViewController) { 
     guard self.isViewLoaded else { 
      return 
     } 
     self.addChildViewController(viewController) 
     viewController.view.frame = self.view.frame 
     self.view.addSubview(viewController.view) 
     viewController.didMove(toParentViewController: self) 
    } 

    // rest of the code omitted 
} 

컨테이너보기는 루트 뷰 컨트롤러에서이 코드를 사용하여 제시 (SO question, another SO question 등) 대부분은 작동하지 않는 솔루션 (예 : wantsFullScreenLayout 및 그 후속 제품)을 제안하거나 조금 지나치게 보였습니다 (상태 표시 줄을 관찰하면 adap t 레이아웃), 특히 자식보기 컨트롤러가 직접 제시되었을 때 제대로 작동하고 있다는 점을 감안할 때.

답변

0

주위를 놀고 난 후 프레임이 설정되는 데 문제가 있음을 확인할 수있었습니다. 컨테이너보기 컨트롤러의 프레임은 오프셋 된 것처럼 보였지만 initialTransition(to:) (컨테이너의 viewDidLoad)이 호출 될 때 크기가 조정되지 않은 것으로 보입니다. 자식은 화면의 아래쪽을 오프셋으로 겹친 프레임을 얻습니다 - 20 점.

내 첫 번째 접근 방식은 컨테이너의 viewDidAppear에 프레임을 다시 한 번 추가하는 것이 었습니다. 결국이 문제는 해결되었지만 결함이 발생했습니다. 잠시 동안 바닥이 잘린 것처럼 보였습니다. 그런 다음 viewDidAppear을 호출하고 레이아웃을 조정했습니다. 바르게. 이 결함은 나 빠졌다.

마지막으로 컨테이너의 viewDidLayoutSubviews을 무시하고 자식 프레임을 설정하여 (컨테이너에 상태 표시 줄에 프레임을 적용하라는 알림이 도착하면 새 프레임에 대한 정보가 자식에게 전달됨) .

override func viewDidLayoutSubviews() { 
    self.selectedViewController?.view.frame = self.view.frame 
    super.viewDidLayoutSubviews() 
}