12

デフォルトでは、UISplitViewController は、マスター ビューを縦長モードで開くためのスワイプ ジェスチャを提供します。

残念ながら、このジェスチャでは、詳細ページでスライダーを操作している場合でも、マスター コントローラーが開きます! ここで、iOS 5.1 で報告されたバグとしてマークされた別の質問を発見しましたが、iOS7 でも問題は解決しません...

これらの状況でこのジェスチャーを抑制する方法はありますか? これを行うことで完全に削除できることがわかりました:

splitViewController.presentsWithGesture = NO;

ただし、ジェスチャーを許可し、使用可能なスライダーを引き続き使用できると便利です!

4

1 に答える 1

8

実験した後、マスター ビューを開くための独自のスワイプ ジェスチャを作成しようとするとどうなるか疑問に思いました。これは完全に機能し、スライダーを使用しても失敗しません!

したがって、アプリ デリゲートでは、デフォルトのスワイプ ジェスチャを抑制します。

splitViewController.presentsWithGesture = NO;

詳細ビューが読み込まれたら、スワイプ ジェスチャを作成します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UISwipeGestureRecognizer *swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];
    swipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.view addGestureRecognizer:swipeGestureRecognizer];

    [self configureView];
}

splitViewController:willHideViewController:withBarButtonItem:forPopoverController: マスター ビューを自分で開くために必要な参照を保存します。

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    // Add the bar item to the navigation bar

    barButtonItem.title = NSLocalizedString(@"Master", @"Master");
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];

    // Store references to the button and popover controller so that we can manually open the view using a custome swipe gesture

    self.masterPopoverButton = barButtonItem;
    self.masterPopoverController = popoverController;
}

最後に、スワイプを処理します。

- (void)handleRightSwipe:(UISwipeGestureRecognizer *)recognizer {

    // Find the root controller in the stack (this is the one that's also the split view's delegate, and thus has access
    // to the pop over controller.

    MyDetailViewController *rootController = (MyDetailViewController *)[self.navigationController.viewControllers objectAtIndex:0];

    if (!rootController.masterPopoverController.popoverVisible) {

        [rootController.masterPopoverController presentPopoverFromBarButtonItem:rootController.masterPopoverButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    }
}

これは、マスター ビュー コントローラーでスライドします。これにより、コントローラーが従来のポップオーバー(矢印などを含む)として表示されるのではないかと心配していましたが、実際には正しいことを行います(少なくともiOS 7ではそうです-以前のバージョンはテストしていません)。

ナビゲーション コントローラーのスタックにプッシュするビューごとに、このジェスチャを作成する必要があることに注意してください。私の場合、それは常に同じビューなので、物事が単純になります。それ以外の場合は、このジェスチャを作成して処理する UIViewController のサブクラスを作成し、それをプッシュされるコントローラのスーパー クラスとして使用することをお勧めします。

于 2013-10-14T10:45:37.267 に答える