2011-01-19 8 views
6

iPadアプリでモーダルビューコントローラとして表示するUISplitViewControllerを表示しようとしています。私はそれを表示することができますが、なんらかの理由で、モーダルビューの左側には、ステータスバーのサイズが表示されます。これは、向きが変更されたときにも保持されます。UISplitViewControllerをモーダルビューコントローラとして使用するには?

alt text

なぜこれが起こっている誰もが知っていますか?それともこれが可能なのか?たぶん私は自分自身を巨大な穴を掘っているだけかもしれない。

答えて

6

ストックUISplitViewControllerは、ルートビューコントローラとしてのみ使用するように設計されています。プレゼンテーションはモーダルでApple Human Interface Guidelinesに反するもので、App Review Teamによって却下される可能性が高い。また、エラーが表示されることがあります。

Application tried to present Split View Controllers modally

+2

代替はXcodeの8、iOSの上では動作しませ –

+1

upvotedとして、サイズのためのアフターマーケットsplitviewコントローラを試してみることです8+ エラーログがあります:「ビューは一度に1つのView Controllerにしか関連付けられません!」 –

3

技術的には、これは私がやったことです:

1 /サブクラスのUIViewControllerすなわち。 @interface aVC:UIViewController

2/viewDidLoadで、splitViewControllerをセットアップします。 aSplitVC結局のところ

3 /次にself.view = aSplitVC.view

、modalViewController

+0

「アフターマーケットビューコントローラ」のために、このようなhttps://github.com/SlavaBushtruk/APSplitViewController – Jerome

3

として存在AVCは、私は、これはAppleのためにオフカラーわずかであることエヴァンに同意するが、私は完了することができました以下の溶液を用いて、この作業のバージョンは:

UISplitViewController *splitVC = [[UISplitViewController alloc] init]; 
    splitVC.delegate = VC2; 
    splitVC.viewControllers = [NSArray arrayWithObjects:navcon1, navcon2, nil]; 

    UINavigationController *splitNavCon = [[UINavigationController alloc] init]; 
    splitNavCon.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
    [splitNavCon.view addSubview:splitVC.view]; 
    VC2.splitParentViewController = splitNavCon; 

    [self presentViewController:splitNavCon animated:YES completion:nil]; 

これは私が画面上にモーダルモードで表示された新しいUISplitViewControllerでバック作業のボタンを持つことができました。

私は、実際にはVC2(UISplitViewControllerの代理人)の親UINavigationControllerを渡していることに気づくでしょう。私はUISplitViewControllerを使用する「モーダル道」を必要に応じ、あなたの多くは同様

[splitParentViewController dismissViewControllerAnimated:YES completion:nil]; 
+1

ここでの基本的な考え方は十分ですが、何か他のものがそれを保持していない場合、ARCは 'UISplitViewController'を食べるかもしれません。だからあなたのビューの子供たちがこのように提示された後に消えたら、それを不動産などに移してください。 – Nuthatch

8

:これは私がVC2の中からUISplitViewControllerを消す可能性が発見された最良の方法でした。これは古い問題だと思われますが、StackOverflowで見つかったのは、上記のような試み(「上記の回答」のような)や「ハックアラウンド」のときに問題が発生する理由の説明でした。

ただし、コードベースの多くを変更してUISplitViewControllerを初期オブジェクトにして、機能を起動して実行させるだけではあまり便利でないことがあります。

この記事では、アップルのガイドラインを含め、皆様を幸せにする方法があります。私は最善の解決策たが、通常UISplitViewControllerを使用していたが、表示されるために必要なときに/却下、次のようなアプローチを使用します。

-(void)presentWithMasterViewController: (UIViewController *) thisMasterViewController 
    andDetailViewController: (UIViewController *) thisDetailViewController 
         completion:(void(^)(void))completion 
{ 
    masterViewController = thisMasterViewController; 
    detailViewController = thisDetailViewController; 

    [self setViewControllers:[NSArray arrayWithObjects:masterViewController, detailViewController, nil]]; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    self.window.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; 

    self.window.rootViewController = self; 

    [self.window makeKeyAndVisible]; 

    if(completion) 
     completion(); 
    } 

-(void)dismissViewControllerWithCompletion:(void (^)(void))completion 
{ 
    self.window = nil; 
    masterViewController = nil; 
    detailViewController = nil; 
    if(completion) 
     completion(); 
} 

「ウィンドウ」を、あなたのUISplitViewControllerサブクラスのプロパティです。システムは残りの部分を処理します!

ModalSplitViewController

--EXAMPLE使用方法について -

mySplitViewController = [[ModalSplitViewController alloc] init]; 
    mySplitViewController.delegate = self; 

    [mySplitViewController presentWithMasterViewController:masterViewController andDetailViewController:detailViewController completion:nil]; 

    // when done: 

    [mySplitViewController dismissViewControllerWithCompletion:nil]; 
    mySplitViewController = nil; 

余談:

は便利/参考のために、私はgithubのにUISplitViewControllerサブクラスとしてこれをアップロードし、私は推測しますほとんどの混乱は、 AppleドキュメントのUISplitViewの使用例がappDelegateで作成された ウィンドウを使用していることと、ほとんどの人が01ではないという事実から生じていますは、ウィンドウのコンセプトに精通しています。通常は、 (StoryBoardsまたは定型コードでは一度作成されます)を使用する必要がないためです。

さらに、状態の復元を行っている場合、 は、プログラムによって作成されたUIViewControllerが自動的にシステムによって復元されないことを忘れてはなりません。

0

私は、スプリットコントローラを表示しているカスタムコントローラの代わりに、ストップボードのルートウィンドウコントローラとしてスプリットコントローラを設定でき、そのビューの上にカスタムコントローラを追加できます(つまりログイン画面)、必要なときに画面から削除します(たとえばremoveFromSuperview)。

0

この回答は実際には正しくありません.iOS8以降は有効ではないため、iOS7でもサポートする必要がある場合は、SplitViewとしてコンテナを持つUIViewControllerを実際に配置するようにすることができます。

let mdSplitView = self.storyboard?.instantiateViewControllerWithIdentifier("myDataSplitView") as! MyData_SplitVC 
    self.addChildViewController(mdSplitView) 

    mdSplitView.view.bounds = self.view.bounds 
    self.view.addSubview(mdSplitView.view) 
    mdSplitView.didMoveToParentViewController(self) 
関連する問題