2

已解决:查看评论以了解问题所在

我正在 UIScrollView 上实现一个子类,它将是一个水平滚动的子视图/“单元格”行。基本上是一个水平滚动的“表格视图”元素。UIScrollView 内容视图中的每个子视图/“单元格”都附加了一个 UIGestureRecognizer ,因此当有人触摸其中一个时, UIGestureRecognizer 将触发。

问题是,当一个人滚动离开 contentView 原点时,即 UIScrollView 返回一个 x 不是 0 的 contentOffset,任何从右侧滚动的新子视图/“单元格”都不会触发 UIGestureRecognizer感动。所有的子视图都有它们的 UIGestureRecognizer。

例如,假设我要显示一行 80x80 图标,而我的 contentSize 是 1600,80,一行 20 个图标。UIScrollView 为 320,80,因此它将显示 4 个图标。最初的 4 个图标是可触摸的,并且 UIGestureRecognizer 会在每个图标上触发。用户向左滚动,即新图标从右侧进入。这些新图标(子视图)被创建并添加到我在 UIScrollView 中使用的 contentView 中,方法与原始 4 相同。但是不在原始边界内的新图标(子视图)不会触发。我实现了我自己的子视图队列/出队,类似于表视图所做的事情,如果我滚动到 #15 位置,

但是,如果用户然后滚动回到开头,即使这些单元格是新添加到 contentView 中的,只要它们的边界在 UIScrollView 的原始框架和我用来在滚动内聚合的 UIView contentView 内,它们也是可触摸的看法。所以它似乎取决于每个子视图的框架以及它是否位于滚动视图的框架内。

一切都显示得很好——因为它滚动了 contentOffset 更改,我删除并添加了子视图。只是附加到每个子视图的 UIGestureRecognizers 没有触发并且位置取决于在滚动视图开始滚动之前处于其原始边界内。

我整天都在摸头,昨天半天)并将其缩小到不依赖于其他东西的位置。

我会发布代码,但不确定要发布什么,因为有很多代码运行它。

4

2 回答 2

1

我将 UIView 子类化,将其添加到 UIScrollView 中,并且我的子类 UIView 的子视图的手势识别器没有触发 - 除了在任何滚动之前最初可见的手势识别器。

简单的解决方法是将 UIView 的子视图直接添加到 UIScrollView 而不是我的子类 UIView。在我做之前

    // add to view
    [self addSubview:imageView];

所以我用

    // add to view - we're adding to the superview directly
    [self.superview addSubview:imageView];

这样我仍然可以将填充我的 UIScrollView 的逻辑保留在一个单独的类中。

于 2012-10-31T09:04:57.757 回答
1

我有这里描述的相同症状。根据接受的答案,我没有删除中间视图并将子视图直接添加到滚动视图,而是通过调整中间视图的大小来工作。

以前,我一直在设置滚动视图的内容大小,并将子视图添加到中间视图,但没有调整中间视图的大小。通过正确设置中间视图的框架,我的手势识别器开始正常工作。

我认为通常子视图将有机会处理事件,然后将未处理的事件传递到链上。然而,在滚动视图中,事件最终从滚动视图沿着视图链向下移动,并且中间视图抛出超出其边界的事件,因此手势最初不起作用。

希望这对遇到此问题的其他人有所帮助,因为追踪起来很令人沮丧。

于 2013-03-07T15:06:56.370 回答