Ipad 嵌套UIScrollView赢得';缩放outter视图时不滚动

Ipad 嵌套UIScrollView赢得';缩放outter视图时不滚动,ipad,ios4,uiscrollview,nested,Ipad,Ios4,Uiscrollview,Nested,在嵌套UIScrollView时,我遇到了一个相当大的问题 我有一个outter分页滚动视图,它使用UIScrollView子视图进行分页滚动。这些子视图包含一个子视图,该子视图具有带有大图像的CALayer。每当需要时,可以将小scrollview添加到CALayer子视图中,作为小图片库。这些库有自己的名为SlideViewController的viewcontroller 查看 | v 主滚动视图 | v UIScrollView(第页) | v 使用CALayer查看 | v 滚动浏览类

在嵌套UIScrollView时,我遇到了一个相当大的问题

我有一个outter分页滚动视图,它使用UIScrollView子视图进行分页滚动。这些子视图包含一个子视图,该子视图具有带有大图像的CALayer。每当需要时,可以将小scrollview添加到CALayer子视图中,作为小图片库。这些库有自己的名为SlideViewController的viewcontroller

查看
|
v
主滚动视图
|
v
UIScrollView(第页)
|
v 使用CALayer查看
|
v
滚动浏览类似图库。

在ipad旋转到横向,页面滚动视图放大33%之前,一切都像一个魔咒

所有子视图都位于它们的位置。它们的边界是正确的,所以它们的框架也是正确的。问题是,当我浏览这些小画廊时,它们不再滚动。这是一个大页面。 我已尝试将所有涉及的滚动视图的canCancelContentTouches设置为NO

我还对gallery scroll视图进行了子类化,以抓紧touchesEnded/Start/cancelled,并尝试从那里禁用超级视图滚动,但没有成功

当我调用init时,我试图将这些库设置为第一响应者。没有进一步的结果

现在,我只需将手指放在图库上一段时间,就可以滚动图库,这样就不会有手势识别器窃取它们的滑动,然后轻轻滚动到图库的下一张图片

如果我正常滑动,有时大outter scrollview会窃取滑动并更改页面,有时小画廊会首先捕获它

只有当包含CA层(页面)的scrollview被缩放时才会发生这种情况,否则效果非常好,没有任何问题

我在拧UIResponder链吗?我怎样才能解决这个问题

我可以向您粘贴一些代码片段,但这涉及到一些类,我不知道哪些类可用或不可用


提前谢谢

我会回答我自己的问题,以防万一有人遇到这个问题

首先阅读--->

第二,现在发生的事情是,外部和内部滚动视图都在为每次触摸屏幕时发送的触摸事件而挣扎。由于手势识别器(如滑动识别器)需要一些时间来识别外部视图的滑动子视图,因此,当您在内部视图中滚动时,有时会工作,有时不会

我所做的是对响应者链中涉及的视图进行子类化。不是所有的。只有最里面的和最外面的才是第一反应者

在FirstResponder子类(在我的例子中是UIView)中,重写命中测试。我从这个问题中得到了代码片段和想法:

为什么??因为您要禁用从outter视图滚动。这就是它的滑动识别器将被禁用的方式,它将让你的内部滚动视图保持独立,并在任何时候自由地抓取触摸。这也有助于用户更准确地滚动


嗯。祝你好运我要去做这件事。;-)

这种方法有一个问题:假设我们在a中有一个滚动视图a和一个子滚动视图B。如果a没有缩放,我们在B上滑动,B滚动到它自己的contentSize结束,然后如果你仍然在同一方向上滑动,手势会发送到a,这样你就可以,例如,更改页面,所有这些都具有漂亮的反弹和对力的反应。覆盖hitTest并禁用scrollEnabled属性的方法将在滑动落在子视图中时完全锁定scrollview,如果子视图足够大,则可能会阻止页面更改。这是一个文档充分的解决方案,显然是一个真正了解问题和触摸系统的人提出的。谢谢
- (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;
}