self.nextResponder vs super for touchesMoved

时间:2012-06-26 05:42:14

标签: ios events touch

这是设置。

我有一个自定义UIScrollView作为PrimeView的子视图。

自定义UIScrollView可视为重叠的scrollview,它最初会获取所有触摸事件。

现在,当滚动视图没有拖动时,我希望它将触摸事件传递给其他响应者 下面是我目前的代码,但我不确定self.nextResponder和super之间的区别。

我不明白为什么touchesBegan正确传递给superview,但是touchesMoved没有传递给superview。

-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    if (!self.dragging)
    {
        [self.nextResponder touchesBegan: touches withEvent:event];

    }

    [super touchesBegan: touches withEvent: event];
}

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.nextResponder touchesBegan: touches withEvent:event]; //                                                                                                                                                                                                    
    [super touchesMoved:touches withEvent:event];
}

1 个答案:

答案 0 :(得分:3)

Apple的立场是你永远不应该做这样的事情:

    [self.nextResponder touchesBegan: touches withEvent:event];

如果你这样做,你就会超越UIKit自己在响应者链中转发消息,结果是不确定的。

此外,在您的touchesMoved:withEvent:中,您向touchesBegan:withEvent:发送nextResponder,这似乎是可疑的。

另外,在你的touchesMoved:withEvent:中,你将事件传递两次,这似乎是一个坏主意。

如果您想有条件地处理拖动,最好的办法是使用UIPanGestureRecognizer。如果识别器不接受该事件,它将正常转发到响应者链。

如果您是已注册(付费)的iOS开发人员,则应该可以访问WWDC 2012 videos。我强烈建议您观看“使用滚动视图增强用户体验”视频。我不会多说它,因为它的内容仍然在NDA之下。