默认情况下,UISplitViewController 提供滑动手势以纵向模式打开主视图。
不幸的是,即使在详细页面上操作滑块时,此手势也会打开主控制器!我在这里发现了另一个问题,这被标记为 iOS 5.1 报告的错误,但问题在 iOS7 上仍然存在......
现在有没有办法在这种情况下压制这种姿态?我意识到我可以通过这样做完全删除它:
splitViewController.presentsWithGesture = NO;
然而,允许手势并且仍然有可用的滑块会很好!
默认情况下,UISplitViewController 提供滑动手势以纵向模式打开主视图。
不幸的是,即使在详细页面上操作滑块时,此手势也会打开主控制器!我在这里发现了另一个问题,这被标记为 iOS 5.1 报告的错误,但问题在 iOS7 上仍然存在......
现在有没有办法在这种情况下压制这种姿态?我意识到我可以通过这样做完全删除它:
splitViewController.presentsWithGesture = NO;
然而,允许手势并且仍然有可用的滑块会很好!
在试验之后,我想知道如果我尝试创建自己的滑动手势来打开主视图会发生什么。这完美地工作,并且在使用滑块时它不会失败!
因此,在应用程序委托中,我取消了默认的滑动手势:
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 的子类来创建并处理此手势可能是个好主意,然后将其用作任何被推送的控制器的超类......