5

シンプルなアプリで分割ビュー コントローラーを使用しています。すべてをデフォルトのままにしておくと問題なく動作します。つまり、マスター ビュー コントローラーは常に横向きで表示され、戻るボタンが押されると縦向きで詳細ビュー コントローラーをオーバーレイします。

私がやりたかったのは、マスター ビュー コントローラーが縦向きと同じ機能を横向きでも模倣できるようにすることでした。つまり、デバイスが横向きの場合、戻るボタンを押すまでマスター ビュー コントローラーを非表示にしてから、詳細ビュー コントローラーをオーバーレイする必要があります。

これを行う最善の方法は、次のコードを使用することだと考えました。

 - (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:     (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
 {
     return self.bHideMaster;
 }

これは、ランドスケープモードでマスタービューコントローラーを非表示にするという点で機能しました。次に、次のコードを使用して再表示しました。

 - (void)hideUnhidePagesController:(id)sender
 {
     [UIView beginAnimations:nil context:NULL];
     [UIView setAnimationDuration:0.30f];

     UISplitViewController* spv = self.splitViewController;

     // Change hide to unhide or vica versa
     self.bHideMaster= !self.bHideMaster;

     // Hide the button if master is visible
     if(self.bHideMaster)
     {
         self.navigationItem.leftBarButtonItem = self.pagesBarButton;
     }
     else
     {
          self.navigationItem.leftBarButtonItem = nil;
     }

     [spv.view setNeedsLayout];
     [spv willRotateToInterfaceOrientation:self.interfaceOrientation duration:0];
     [[self.splitViewController.viewControllers lastObject] view].frame = self.splitViewController.view.frame;
     [UIView commitAnimations];
 }

これはほとんど機能しました。私には2つの問題があります:

  1. マスター ビュー コントローラーの非表示から再表示および再表示から非表示への遷移はアニメーション化されておらず、非常に厳しいものです。アニメーション コードを追加しましたが (上記を参照)、マスター ビュー コントローラーではなく、詳細ビュー コントローラーのみをアニメーション化します。マスターは、詳細ビュー コントローラーがスライドするまで、即座に表示および非表示になります (ブラック ボックスを非表示のままにします)。

  2. これは私の2番目の問題も示しています。マスター ビュー コントローラーがランドスケープ モードで表示されたときに、ディテール ビュー コントローラーをオーバーラップさせ、ディテール ビュー コントローラーをそのまま残します。代わりに、詳細ビュー コントローラーのサイズを変更します (開始前のランドスケープ モードと同じ方法です)。マスター ビュー コントローラーがポートレート モードと同じように対話するようにします。マスター ビュー コントローラーは、詳細コントローラーの上にスライド インし、項目が選択されるとスライドして戻ります。

問題 2 を解決できれば、問題 1 について心配する必要はありません。スプリット ビュー コントローラーには、左側からマスターをスライドさせる (詳細ビュー コントローラーをオーバーラップする) メソッドが必要なようです。ポートレートモードで実行されるため、コードがそこにある必要があります。ランドスケープモードで同じコードを呼び出すにはどうすればよいですか?

ありがとう!

----------編集1---------

hideUnhidePagesController をリファクタリングし、近づいています。ウィンドウは、縦向きと横向きの両方でオーバーレイされるようになりました。回転時にマスターが表示される場合は、まだ問題があります。混乱し、予想される動作を逆転させます。私はそれに取り組んでいます。ここで修正されたコード:

 - (void)hideUnhidePagesController:(id)sender
{
    // Change hide to unhide or vica versa
    self.bMasterIsHidden= !self.bMasterIsHidden;

    NSArray *controllers = self.splitViewController.viewControllers;
    UIViewController *rootViewController = [controllers objectAtIndex:0];
    UIView *rootView = rootViewController.view;
    CGRect rootFrame = rootView.frame;
    if(self.bMasterIsHidden)
    {
        rootFrame.origin.x -= rootFrame.size.width;
    }
    else
    {
        rootFrame.origin.x += rootFrame.size.width;
    }
    [UIView beginAnimations:@"hideUnhideView" context:NULL];
    rootView.frame = rootFrame;
    [UIView commitAnimations];
 }
4

4 に答える 4

6

あなたが説明した効果を得るには、次のコードを DetailViewController に追加する必要がありました。

- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:
(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
    return YES;
}

次に、分割ビューは縦向きモードと横向きモードで同じように機能します。

于 2013-07-21T00:34:05.040 に答える
1

多分私はこれに答えるには遅すぎるかもしれませんが...ここに解決策があります..

向きが変わるたびに、メソッドからmasterviewcontrollerの参照を取得できます

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    myVCForPopOverController = vc;

    //always hide the controller
    return YES;
}

これで、任意のバーボタン項目をクリックして、この「myVCForPopOverController」を表示できるようになりました。

-(void)onBarButtonClick:(id)sender {
    if(!self.popOverController.popoverVisible) {
        self.popOverController = [[UIPopoverController alloc]initWithContentViewController:myVCForPopOverController];
        [self.popOverController presentPopoverFromBarButtonItem:showDetailsBarButton permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
        self.popOverController.passthroughViews = nil;
    }
    else {
        [self.popOverController dismissPopoverAnimated:YES];
    }
}

私はこれを実装しましたが、動作します。

于 2013-10-30T12:07:50.210 に答える
1

最終的に使用したコードを入れています。これが他の誰かに役立つことを願っています。

// ***************************************************************************************************
//
//  hideUnhideMasterViewControllerButtonPressed
//
// ***************************************************************************************************
- (void)hideUnhideMasterViewControllerButtonPressed:(id)sender {
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        [self.navigationController popViewControllerAnimated:YES];
    }
    else {
        if(bMasterIsHidden)
            [self hideMasterViewController:NO];
        else
            [self hideMasterViewController:YES];
    }
}

// ***************************************************************************************************
//
//  hideMasterViewController
//
// ***************************************************************************************************
- (void)hideMasterViewController:(BOOL)bHideMaster {
    // Change hide to unhide or vica versa
    self.bMasterIsHidden= !self.bMasterIsHidden;

    NSArray *controllers = self.splitViewController.viewControllers;
    UIViewController *rootViewController = [controllers objectAtIndex:0];
    UIView *rootView = rootViewController.view;
    CGRect rootFrame = rootView.frame;
    if(bHideMaster) {
        if(self.tapRecognizer) {
            rootFrame.origin.x -= rootFrame.size.width;
            [self.view removeGestureRecognizer:self.tapRecognizer];
            self.tapRecognizer = nil;
        }
    }
    else {
        rootFrame.origin.x += rootFrame.size.width;
        self.tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)];
        self.tapRecognizer.numberOfTapsRequired = 1;
        [self.view addGestureRecognizer:self.tapRecognizer];
        self.tapRecognizer.delegate = self;
    }
    // Log resulting frame
    NSString *hiddenString = self.bMasterIsHidden ? @"YES" : @"NO";
    NSLog(@"Page=%@   Class=%@  MasterIsHidden=%@ Origin(x,y)=(%f, %f) Size(width,height)=(%f, %f)", self.pageDefinition.pageName, [self class], hiddenString, rootFrame.origin.x, rootFrame.origin.y, rootFrame.size.width, rootFrame.size.height);

    [UIView beginAnimations:@"hideUnhideView" context:NULL];
    rootView.frame = rootFrame;
    [UIView commitAnimations];
}
于 2013-09-08T22:02:26.167 に答える