(iphone)uiscrollview touch。取消内容触摸并开始滚动

时间:2011-02-11 09:19:04

标签: iphone uiscrollview touch

UIScrollView编程对我来说似乎是最难的任务之一:(

我在UIScrollView中有子视图 我想让子视图先触摸事件(并拖动) 当子视图认为它应该放弃触摸并且应该开始滚动时,它应该能够告诉scrollView。

我已尝试使用touchesShouldCancelInContentView,但只有当scrollView认为用户实际想要“滚动”时才调用此方法。
我需要控制何时取消子视图的触摸事件而不依赖于内部uiscrollview的实现。

到目前为止,我最好的策略是

子类ScrollView

- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
    SYSLOG(LOG_DEBUG, "MyScrollView touchesBegan");

    if (!self.dragging && self.isSubviewTouchable)
        [self.nextResponder touchesBegan: touches withEvent:event];

    [super touchesBegan: touches withEvent: event];
}

并从scrollView的子视图

当子视图需要释放触摸并让scrollView接受触摸事件时。

self.myScrollView.isSubviewTouchable = false;
[self touchesEnded: touches withEvent: event];

在scrollView的委托类中,我重新设置了bool值。

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{   
    self.myScrollView.isSubviewTouchable = true;
}

问题是,从子视图调用touchesEnded实际上并没有释放它看起来的触摸事件。(即使在touchesEnded调用之后,子视图仍然被拖动) 此外,我没有看到scrollView在touchesEnded调用之后得到任何触摸事件,我希望它会。

有什么想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

我曾经尝试过使用PanGesture来解决这个问题。对于您想要可拖动的所有子视图,您可以添加UIPanGestureRegognizer并在其选择器中执行您想要执行的任何操作。即使在ScrollView中也能很好地工作。

UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(doSomething:)];
[panGesture setDelegate:self];
[subviewtoMove addGestureRecognizer:panGesture];