【问题标题】:UIScrollview delaysContentTouches issueUIScrollview delaysContentTouches 问题
【发布时间】:2013-07-16 02:19:15
【问题描述】:

我已将 UIScrollView 加载到 UIButtons 并在 UIButton 操作上突出显示每个 UIButtonUIImage

如果我没有将delaysContentTouches 设置为NO,那么如果我非常快地修改UIButtonUIButton 中的UIImage 将不会显示。在我将delaysContentTouches 属性设置为NO 之后,只显示UIButton 突出显示的UIImage

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

请给我一个建议。

提前致谢。

【问题讨论】:

  • delaysContentTouches 意味着滚动视图将始终先获得触摸,并根据您是否滑动来决定是否滚动。第一个测试是您看到的延迟,当您将此属性设置为 NO 时,您是说您不希望滚动视图先触摸,但它的所有子视图都应该接受触摸......
  • 如果按钮真的很小,那么不滚动按钮所在的位置可能会起作用。如果您有一个非常大的按钮,但仍希望该按钮先进行触摸,但在滑动手指时仍会滚动,那么我能想到的唯一方法是为滑动错误滑动添加手势识别器。手势识别器覆盖触摸事件,当您调用手势方法时,只需重新设置您的滚动视图的内容。我还没有尝试过,所以我不知道它是否会起作用....
  • 当我长按我的按钮然后我的触摸被传递到下面的滚动视图时,我可以做一些事情吗?可能吗?或者我怎样才能做到这一点?

标签: ios objective-c cocoa-touch uiscrollview


【解决方案1】:

这对我有用。继承 UIScrollView,并且只实现这个方法:

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

然后设置delaysContentTouches = NO;

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

【讨论】:

  • 这对我有用。下面的其他解决方案没有(结合 tableView.delaysContentTouches = YES)
  • 这是一篇旧帖子,但我今天发现它很有帮助。此外,我遇到了延迟内容触摸在屏幕底部附近不起作用的问题。原来是一个窗口手势识别器。希望这对将来的其他人有所帮助。在这里阅读更多:stackoverflow.com/questions/19799961/…
【解决方案2】:

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

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches

【讨论】:

  • 我相信你的意思是 theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches;它帮助了我,谢谢!我希望它能打破其他东西。
  • 谢谢。你是对的。我的意思是 PanGestureRecognizer 的 delaysTouchesBegan 属性应该反映 UIScrollView 的 delaysContentTouches 属性。
  • 仅供参考;我向 Apple 提交了一份雷达错误报告,他们已将其标记为重复。
  • ScrollView.delaysContentTouches 的值是多少?是或否
  • 我想我对 ScrollView.delaysContentTouches 使用了 YES。但关键是 ScrollView.panGestureRecognizer.delaysTouchesBegan 应该镜像 theScrollView.delaysContentTouches 的值。
【解决方案3】:

好的,我已经通过实施以下方法解决了:

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

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

【讨论】:

  • 不幸的是对我不起作用(我确实设置了滚动视图委托)
  • 好的,如果你继承 uiscrollview (这不是委托方法),它可以工作,并反转上面的 NO/YES 值。
  • 如果视图是UIButton,首先应该返回YESNO 已经是默认行为。其次,它应该在 else 子句中返回[super touchesShouldCancelInContentView:view]
【解决方案4】:

目前无法在网上找到满意的解决方案(而且似乎是苹果忽略了这个问题)。在 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
}

【讨论】:

    【解决方案5】:

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

    将同一 UITableViewCell 中的 UIButton 的 delaysContentTouches 设置为 NO。

    self.scrollview.delaysContentTouches = NO
    

    【讨论】:

      【解决方案6】:
      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多