2016-06-30 4 views
1

DetailViewControllerのビューをMasterViewControllerで覆い隠さないように、DetailViewControllerのフレームをsplitViewController?.displayMode == .PrimaryOverlayに変更したいとします。私はこれを、jrcの答えであるChange the width of Master in UISplitViewController(以下を参照)に記載されているように、viewDidLayoutSubviewsメソッドをオーバーライドしたカスタムUISplitViewControllerを使用して、splitViewController?.displayMode == .PrimaryHiddenからsplitViewController?.displayMode == .PrimaryOverlayにiPad縦向きでナビゲートすることができました。私は、ストーリーボードのUISplitViewControllerをSplitViewControllerにリンクしています。viewDidLayoutSubviews()は、iPadで最初のアプリケーションの読み込み時に呼び出されます。UISplitViewControllerのサブクラス内のDetailViewControllerのフレームを更新します。

SplitViewController.swift

override func viewDidLayoutSubviews() { 

     var masterViewController = (self.viewControllers[0] as! UINavigationController).topViewController 
     var detailViewController = (self.viewControllers[1] as! UINavigationController).topViewController 

     // Adjust the width of the detail view 
     var detailViewFrame = detailViewController!.view.frame 
     detailViewFrame.origin.x += masterViewController!.view.frame.width 
     detailViewFrame.size.width -= masterViewController!.view.frame.width 
     detailViewController!.view.frame = detailViewFrame 

     detailViewController!.view.setNeedsLayout() 
    } 

私はsplitViewController?.displayMode == .PrimaryOverlayで午前、その後MasterViewControllerから別の項目を選択した場合しかし、DetailViewControllerフレームは、デフォルトのフレームサイズと位置に戻ります。 (このようにviewDidLayoutSubviews()を呼び出すことが推奨されていませんが)私は、次を使用して、この問題を解決しようとしています:

MasterViewController.swift

私は MasterViewController.swift splitViewController?.viewDidLayoutSubviews()で項目を選択すると、今と呼ばれている
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     collapseDetailViewController = false 
     splitViewController?.viewDidLayoutSubviews() 
    } 

を、 DetailViewControllerのview.frame.origin.xview.frame.widthの最後にviewDidLayoutSubviews()の部分を印刷すると、私は奇妙な読みをします。そして、作成されたようなフレームへのこれらの変更があっても、DetailViewControllerのビューは依然として不明瞭です。

MasterViewControllerで新しいアイテムを選択しても、それが決して不明瞭にならないように、DetailViewControllerフレームを修正する方法についての助けがありがとう。私はこれを解決するためにUISplitViewControllerデリゲートメソッドを実装しておらず、の末尾にloadViewSplitViewControllerを再ロードしようとしましたが、これによりiPad画面がフリーズしました。

答えて

2

iPadに行くときにオーバーレイなしでマスターとディテールビューコントローラーを並べて表示する方法を知りたいと思っている方は、本当に簡単です!ちょうどpreferredDisplayMode = .AllVisibleを追加してください。 MGSplitViewControllerのようなカスタムSplitViewControllerを使用するか、スプリットビューコントローラのフレームを変更する必要はありません。 :-)

関連する問題