実験した後、マスター ビューを開くための独自のスワイプ ジェスチャを作成しようとするとどうなるか疑問に思いました。これは完全に機能し、スライダーを使用しても失敗しません!
したがって、アプリ デリゲートでは、デフォルトのスワイプ ジェスチャを抑制します。
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 のサブクラスを作成し、それをプッシュされるコントローラのスーパー クラスとして使用することをお勧めします。