私は写真閲覧アプリを作成しています。ユーザーは閲覧中の写真の詳細やコメントを閲覧できます。これを行うには、詳細とコメントの間の切り替えと、詳細とコメントを提供する2つのUITableViewControllersとして動作する、分割されたコントロールを持つUIViewController(parentVC)があります。 Storyboard of the view controllers in question。サブビューとして表示が追加されたときにContentInsetが更新されない
ビューを切り替えるには、tableVCがストーリーボードからインスタンス化され、parentVCとしてchildViewControllerとして追加され、ビューがサブビューとして追加されます。
segmentControlはnavigationControllerのnavBarに配置されているので、私はparentVCのナビゲーションバーでniceを再生したいと考えています。最初のtableview(detailVC)がインスタンス化されると、そのcontentInsetが自動的に調整されます。
ただし、2番目のtableview(commentsVC)がセグメント化されたコントロールからの切り替え後にインスタンス化されると、contentInsetは設定されず(実際にはすべてのエッジで0になります)、tableviewはnavBarの背後に隠されます。しかし、デバイスが回転すると、テーブルビューはそのインセットを調整し、再び正常に動作します。
私は、どのchildVCが最初に存在するかを切り替えると、最初に提示されたVCのcontentInsetが常に設定されるため、この問題はiOSによってautomaticadjustsscrollviewinsetsがどのように行われるかと関係していると思われます。追加されたときに2番目のVCのcontentInsetを設定する方法があるかどうかはわかりません。
私は両方のchildVCのcontentInsetをparentVCのnavigationBarに合わせて設定することはできますか? UIEdgeInsetを作成することは回避策ですが、デバイスの向きが変更されたときには更新されません。もっと小さな問題は、childVCがプログラムによってインスタンス化され、ストーリーボード自体にリンクされているかのように動作するように、ナビゲーションコントローラのレイアウトとインセットでどう作業すればよいかです。
次は私のコードで、parentVCからchildVCをインスタンス化するときのものです。
if index == 0 { //details
if detailsVC == nil {
detailsVC = storyboard?.instantiateViewControllerWithIdentifier("InfoPaneDetailsVC") as! InfoPaneDetailsVC
}
if commentsVC != nil {
commentsVC.view.removeFromSuperview()
commentsVC.removeFromParentViewController()
}
addChildViewController(detailsVC)
detailsVC.didMoveToParentViewController(self)
view.addSubview(detailsVC.view)
view.layoutSubviews()
} else if index == 1 { //comments
if commentsVC == nil {
commentsVC = storyboard?.instantiateViewControllerWithIdentifier("InfoPaneCommentsVC") as! InfoPaneCommentsVC
}
if detailsVC != nil {
detailsVC.view.removeFromSuperview()
detailsVC.removeFromParentViewController()
}
addChildViewController(commentsVC)
commentsVC.didMoveToParentViewController(self)
view.addSubview(commentsVC.view)
view.layoutSubviews()
}