我有一个 UIPageViewController
设置分页我的 ImageViewController
。
ImageViewController
包含一个 UIScrollView
,里面有一个 UIImageView
。没有别的。
目前我正在测试 UIPageViewController
的数据源中的 3 个“项目”(即三页)。
一切正常,我可以滚动和缩放,然后翻页约 30 秒,然后突然收到此警告...
*** Assertion failure in -[_UIQueuingScrollView _didScrollWithAnimation:force:], /SourceCache/UIKit/UIKit-2372/_UIQueuingScrollView.m:778
我不知道从哪里开始调试它,因为它没有指向我的任何代码,堆栈中也没有我的任何代码。
谁能告诉我从哪里开始调试这个问题。
编辑
我做了更多的测试。如果 scrollView 正在减速(即轻弹后),这似乎会发生,然后我尝试将 PageViewController 转换为另一个 ViewController,因为 scrollview 仍在移动。
在过渡到下一页的过程中,应用程序崩溃了大约 20%。
编辑 2
错误似乎在 _cache_getImp 行停止(不确定那是大写 i 还是小写 L)。
编辑 3
这会变得更好。我刚刚下载了 Apple 的 PhotoScroller 示例应用程序,看看他们是否以不同的方式解决了这个问题。好吧,不,他们没有。示例应用程序崩溃的方式与我的完全相同!您必须同时缩放、滚动和转换页面,以使其更容易崩溃,但它也会自己发生,只是可能需要更长的时间才能发生。
最佳答案
想到了解决办法!在我的例子中,我有一个 UIPageViewController
和 UIPageViewControllerTransitionStyleScroll
以及允许用户通过点击在我的 viewpager 中前进的下一个按钮。当用户按下一个按钮并在松开手指(仍在按钮的框架内)之前稍微拖动时,我遇到了这个崩溃。在这种情况下,按钮内的拖动似乎干扰了 UIPageViewController
的平移手势识别器,这就是导致崩溃的原因。
虽然用户不太可能进入这种状态,但我想出了一个相对简单的解决方案,可以防止我的应用程序在这种情况发生时崩溃。我有一个 bool 值,表示用户是否处于有效状态以移动到下一个屏幕并将其设置为 YES 在触摸时,然后如果用户在我的按钮内拖动任何位置则设置为 NO。然后,在 touchUp (nextPressed) 上,我在以编程方式移动 UIPageViewController
之前检查 bool 值。
- (IBAction)touchDown:(id)sender
{
self.shouldAdvanceToNextScreen = YES;
}
- (IBAction)touchDragInside:(id)sender
{
self.shouldAdvanceToNextScreen = NO;
}
- (IBAction)nextPressed:(id)sender
{
if (self.shouldAdvanceToNextScreen) {
UIViewController *initialViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"TutorialScreen2"];
NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
}
}
缺点是即使用户仍然在按钮框架内松开手指,也不会发生任何事情。但是,我更喜欢这种情况而不是崩溃,无论如何都将其视为一种非常罕见的边缘情况。我希望用户只需再次点击 - 这次没有点击和拖动 - 并成功向前移动。
我欢迎任何关于更进一步并防止触摸拖动和 UIPageViewController
之间发生冲突的想法。
关于iphone - UIQueuingScrollView didScrollWithAnimation 中的断言失败 :force:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12916422/