21

我已经UIScrollView加载UIButtons并在UIButton行动中突出显示UIImage了每个UIButton.

如果我没有设置delaysContentTouches为,那么如果我快速触摸,则不会显示NO突出显示UIImage的。在我设置属性之后,只显示突出显示。UIButtonUIButtondelaysContentTouchesNOUIButtonUIImage

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

请给我一个建议。

提前致谢。

4

6 回答 6

40

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

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

然后设置delaysContentTouches = NO;

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

于 2014-01-15T22:25:50.773 回答
11

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

theScrollView.panGestureRecognizer.delaysTouchesBegan = theScrollView.delaysContentTouches
于 2014-09-22T20:42:51.560 回答
7

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

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

    if ([view isKindOfClass:[UIButton class]])
        return NO;
    else
        return YES;
}
于 2013-07-18T11:05:02.043 回答
3

到目前为止无法在网上找到令人满意的解决方案(似乎是苹果忽略了这个问题)。在 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
}
于 2013-10-23T18:36:11.957 回答
2

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

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

self.scrollview.delaysContentTouches = NO
于 2016-08-23T06:06:28.237 回答
1
  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. Delay Touch Down在 xib 中取消选择或在delaysContentTouches = NO代码中设置。

于 2019-04-09T08:45:48.253 回答