UIScrollview delayedContentTouches问题

问题描述 投票:18回答:6

我有加载UIScrollViewUIButtonsUIButton行动我突出了每个UIImageUIButton

如果我没有将delaysContentTouches设置为NO那么突出显示UIImageUIButton将不会显示如果我非常快地触及UIButton。在我将delaysContentTouches属性设置为NO后,只有UIButton突出显示UIImage

现在将delaysContentTouches属性设置为UIScrollView的NO。我不能通过拖动UIScrollView来滚动我的UIButtons。现在我该如何解决这个问题。

请给我一个建议。

提前致谢。

ios objective-c cocoa-touch uiscrollview
6个回答
35
投票

这对我有用。子类UIScrollView,并只实现此方法:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    return YES;
}

然后设置delaysContentTouches = NO;

瞧!像主屏幕一样工作:立即突出显示按钮,但仍允许滚动:)


10
投票

我发现在iOS 8中,UIScrollView的底层UIPanGestureRecognizer不尊重UIScrollView的delaysContentTouches属性。我认为这是iOS 8的错误。这是我的解决方法:

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches

6
投票

好的我通过实现以下方法解决了:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    NSLog(@"touchesShouldCancelInContentView");

    if ([view isKindOfClass:[UIButton class]])
        return NO;
    else
        return YES;
}

2
投票

到目前为止,无法在网上找到满意的解决方案(似乎苹果忽略了这个问题)。在Apple的开发者论坛上找到了一个主题,其中有一些建议可能有所帮助:UIScrollView: 'delaysContentTouches' ignored

我能够使用此链接中的解决方法。总结一下解决方法(我在这里引用):

UIEvent对象包含时间戳。

您可以在嵌入式子视图中记录touchesBegan时的时间戳。

在scrollView的子视图的touchesMoved中,再次查看时间戳和位置。

如果触摸没有移动很远且超过0.1秒,则可以假设用户触摸了子视图,然后延迟了移动。

在这种情况下,UIScrollView将独立决定,这不是一个滚动操作,即使它永远不会告诉你。

因此,您可以使用本地状态变量来标记发生延迟移动的这种情况并处理子视图接收的事件。

这是我的代码:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    // store the timestamp
    _beginDragTimeStamp = event.timestamp;    

    // your embedded subview's touches begin code
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
   // compare and ignore drag if time passed between tap and drag is less than 0.5s
   if(event.timestamp - _beginDragTimeStamp < 0.5) return;

   // your drag code
}

0
投票

我有相同的问题和相同的视图层次结构,使用最新的sdk,只需使用它:

在同一个UITableViewCell中为UIButton设置delayedContentTouches为NO。

self.scrollview.delaysContentTouches = NO

0
投票
  1. 创建UIScrollView(或UITableView,或UICollectionView,或您使用的任何其他UIScrollView子类)的子类。
  2. 实现以下方法: - (BOOL)touchesShouldCancelInContentView:(UIView *)view { if ([view isKindOfClass:UIButton.class]) { return YES; } return [super touchesShouldCancelInContentView:view]; }
  3. 如果使用接口构建器,请将此子类设置为xib / storyboard,作为“自定义类”类。
  4. 在xib中取消选择Delay Touch Down或在代码中设置delaysContentTouches = NO
© www.soinside.com 2019 - 2024. All rights reserved.