在嵌套UIScrollViews时,我遇到了一个很大的问题。
我有一个outter分页滚动视图,它使用它的UIScrollView子视图进行分页滚动。这些子视图包含一个子视图,其中CALayer具有较大的图像。无论何时需要,这个CALayer子视图都可以添加一个小的scrollview作为小图片库。这些画廊有自己的viewController,名为SlideViewController。
视图
|
v
mainScrollView
|
v
UIScrollView(页面)
|
v
用CALayer查看
|
v
ScrollView就像画廊一样。
所有内容都像魅力一样,直到ipad旋转到横向并且页面滚动视图缩放了33%。
所有子视图都在他们的位置。他们的界限是正确的,所以他们的框架。问题是,当我在小画廊上滑动时,他们不再滚动了。大页面确实如此。 我已经尝试将canCancelContentTouches设置为NO到所有涉及的滚动视图。
我还将图库滚动视图子类化,以触及touchesEnded / started / cancelled,并尝试禁用从那里滚动的超级视图,但没有成功。
当我在他们上面调用init时,我试图将画廊设置为第一响应者。没有进一步的结果。
现在我只能在我的手指上放一段时间才能滚动画廊,所以没有手势识别器从他们手中窃取,然后轻轻滚动到画廊的下一张图片。
如果我正常滑动,有时大的外观滚动视图会窃取滑动并更改页面,有时小画廊会首先抓住它。
只有当包含CA图层(页面)的滚动视图被缩放时才会发生这种情况,否则会出现非常好的问题而且没有任何问题。
我是否拧紧了UIResponder连锁店?我怎么能解决这个问题?
我可以粘贴一些代码片段,但这涉及一些类,我不知道哪些类可以使用。
提前致谢
答案 0 :(得分:2)
我会回答我自己的问题,万一有人碰到这个问题。
首先阅读---> this
其次,现在发生的事情是,每次触摸屏幕时,外部和内部滚动视图都在为每次调度的触摸事件而苦苦挣扎。由于滑动识别器之类的手势识别器需要花费一些时间来识别外部视图的滑动子视图,因此可以在此期间捕获触摸,这会导致在内部视图中滚动时有时会起作用,有时则不会。 / p>
我所做的是将响应者链中涉及的视图子类化。不是所有的人。只是最里面和最外面的,实际上是第一响应者。
在第一个响应者子类中(在我的例子中是一个UIView)覆盖命中测试。我从这个问题得到了代码片段和想法:How to steal touches from UIScrollView?
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView* result = [super hitTest:point withEvent:event];
if ([result.superview isKindOfClass:[SlideView class]])
{
self.scrollEnabled = NO;
}
else
{
self.scrollEnabled = YES;
}
return result;
}
为什么?因为您要禁用从outter视图滚动。这就是它的滑动识别器将被禁用的方式,并且会让你的内部滚动视图独立,并随时随地抓住触摸。这也有助于使用户更加准确地滚动。
好。祝好运。我要承诺这个。 ; - )