这在 ios6 中才开始发生,但如果你使用页面 View Controller 模板开始一个新项目。然后在
PCRootViewControlle::viewDidLoad()
将这些行添加到方法的底部。
for (UIGestureRecognizer *gR in self.pageViewController.gestureRecognizers)
{
gR.delegate = self;
}
您需要分配 viewController 以使其符合 UIGestureRecognizerDelegate 并实现该方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch (UITouch *)touch
{
return YES;
}
现在,如果您运行该应用程序并尝试将页面翻到边界之外,即转到一月并尝试返回
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
返回零。
然后该应用程序将崩溃。
这在 ios5 中没有发生。我需要将 gestureRecognizer 委托(delegate)分配给我的 viewController,因为我并不总是希望 pageViewController 处理触摸事件。
有没有其他人遇到过这种情况或指出我做错了什么?
非常感谢 斯图尔特。
最佳答案
终于找到了解决我的问题的方法,这个问题让我很伤心,所以希望这可以帮助其他人。
问题是如果您将 pageViewControllers 委托(delegate)设置为您的 viewController
for (UIGestureRecognizer *gR in self.pageController.view.gestureRecognizers)
{
if ([gR isKindOfClass:[UITapGestureRecognizer class]])
{
gR.enabled = NO;
}
else if ([gR isKindOfClass:[UIPanGestureRecognizer class]])
{
gR.delegate = self;
}
}
然后从
返回 nilpageViewController:viewControllerAfterViewController:
会崩溃!!仅限 iOS6!!
我的问题是我需要设置 gestureRecognisers 的委托(delegate),因为我需要在某些情况下拦截 panGesture,即不允许用户翻页,因为那里有一些按钮而触摸它的某些部分。
解决方案是把逻辑从
pageViewController:viewControllerAfterViewController:
进入
gestureRecognizer:shouldReceiveTouch:
因为只要我们从那里返回 NO 那么它就不会继续调用
pageViewController:viewControllerAfterViewController:
因此无需返回 nil 并导致崩溃。
但是,这在序列的第一页和最后一页上不起作用。例如在第一页上,您希望允许页面向前翻但不能向后翻。所以我考虑查看传入的 GestureRecogniser,将其转换为 PanGesture,然后检查其速度,如果速度表示返回 (> 0.0f),则返回 NO。这听起来不错,但速度始终为零。
然后我在 GestureRecognizer 委托(delegate)上发现了一个非常有用的小函数,叫做:
gestureRecognizerShouldBegin:gestureRecognizer
这个函数在
之后被调用gestureRecognizer:shouldReceiveTouch:
但这次手势的速度符合我的预期,所以我可以检查速度,如果第一页 > 0.0f,则只返回 YES
关于objective-c - 在 ios6 中,将 pageViewController 的 gestureRecognizers 委托(delegate)设置为 viewController 会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12561336/