触摸子视图时如何取消滚动

时间:2013-07-07 01:31:06

标签: iphone ios objective-c uiscrollview uibutton

我有一个带有一些子视图的scrollview作为tile。 scrollview将其“Delays content touches”和“Cancellable Content Touches”设置为YES 我使用touchesBegantouchesEndedtouchesMoved捕获每个子视图中的触摸。

当您点按一个按钮并且几乎立即开始滚动时,该按钮会突出显示并且滚动视图不会滚动,无需任何代码。

当我完全相同的事情而不改变任何东西时,触摸视图但在按钮外部,触发这些触摸方法,但滚动视图滚动。

如果在按钮外部完成触摸以取消滚动操作以阻止滚动视图滚动,我可以在触摸方法中取消滚动操作吗?

3 个答案:

答案 0 :(得分:2)

我解决了这个在touchesBegan中添加此代码,并在子视图捕获触摸时触摸了触摸。

UIView* superView = self.view.superview;
while (superView != nil) {
    if ([superView isKindOfClass:[UIScrollView class]]) {
        UIScrollView* superScroll = (UIScrollView*)superView;
        superScroll.scrollEnabled = YES/NO; // put the right value depending on the touch method you are in
    }

    superView = superView.superview;
}

答案 1 :(得分:0)

如果要检测UIScrollView的任何子视图内的触摸,则必须子类化UIScrollView并覆盖为此目的专门创建的touchesShouldBegin和touchesShouldCancelInContentView方法。

除此之外,您无法识别子视图中的触摸,因为UIScrollView倾向于自己处理所有触摸并且不会将它们传递给其子视图。

提供者: - https://stackoverflow.com/a/392562/1865424

如果您对此有任何进一步的问题。快乐帮助您。

答案 2 :(得分:0)

根据您的目的,您可以添加:

UILongPressGestureRecognizer *longPressDetect = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(disableScrolling:)];

[subView addGestureRecognizer:longPressDetect];

然后添加一个方法,禁用并重新启用scrollView,例如:

-(void)disableScrolling:(UILongPressGestureRecognizer*)longPress {

    if (gesture.state == UIGestureRecognizerStateBegan) {
        scrollView.scrollEnabled = NO;
    }

    if (gesture.state == UIGestureRecognizerStateEnded) {
        scrollView.scrollEnabled = YES;
    }
}