已解决:请参阅有关问题的评论
我正在UIScrollView上实现一个子类,它将是一个水平滚动的子视图/“cells”行。基本上是一个水平滚动的“表格视图”,就像元素一样。 UIScrollView内容视图中的每个子视图/“单元格”都附加了一个UIGestureRecognizer,以便当一个人触摸其中一个时,UIGestureRecognizer将触发。
问题是,当一个人滚动离开contentView原点时,即UIScrollView返回一个contentOffset,其中x不是0,从右边滚动的任何新子视图/“单元格”都不会触发触摸时的UIGestureRecognizer。所有子视图都有他们的UIGestureRecognizer。
示例,假设我显示一行80x80图标,而我的contentSize为一行20个图标的1600,80。 UIScrollView是320,80所以它将显示4个图标。最初的4个图标是可触摸的,UIGestureRecognizer会触发每个图标。用户向左滚动,即从右侧进入新图标。创建这些新图标(子视图)并将其添加到我在UIScrollView中使用的contentView中,与原始图像相同。但是不在原始边界中的新图标(子视图)不会触发。我实现了自己的子视图队列/队列,类似于tableview所做的事情,所以如果我按地点#15滚动,原始图标(子视图)都没有在contentView中,因为子视图被回收(并删除了旧的UIGestureRecognizers)当它从队列中拉出并重新使用时附加新的附件)并且这些都不可触摸并触发UIGestureRecognizer。
但是,如果用户然后滚动回到开头,即使这些单元格是新添加到contentView,只要它们的边界位于UIScrollView的原始框架和我以前聚合的UIView contentView中,它们就是可触摸的在滚动视图内。所以它似乎依赖于每个子视图的框架以及它是否位于scrollview的框架内。
一切都很好 - 当它滚动contentOffset更改时,我删除并添加子视图。只是附加到每个子视图的UIGestureRecognizers没有触发,并且在开始滚动之前位置依赖于Scrollview的原始边界。
我一整天都在摸不着头脑,昨天半天,并且把它缩小到依赖于其他东西的位置。
我会发布代码但不知道要发布什么,因为有很多代码可以运行它。
答案 0 :(得分: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];
这样我仍然可以保留在单独的类中填充我的UIScrolView的逻辑。
答案 1 :(得分:1)
我有同样的症状在这里描述。而不是删除中间视图并将子视图直接添加到scrollview,根据接受的答案,我通过调整中间视图的大小来完成工作。
以前,我一直在设置滚动视图的内容大小,并将子视图添加到中间视图,但不调整中间视图的大小。通过正确设置中间视图的框架,我的手势识别器开始正常运行。
我认为通常子视图会有机会处理事件,然后将未处理的事件传递给链。但是,在滚动视图中,事件最终从视图链中的滚动视图开始,中间视图将超出其边界的事件抛出,因此手势最初不起作用。
希望这可以帮助其他遇到此问题的人,因为追踪是令人沮丧的。