我的一个 UICollectionViews 没有滚动或响应我的 UIScrollView 容器内的触摸事件 [Puzzling]

One of my UICollectionViews is not scrolling or responding to touch events inside my UIScrollView container [Puzzling]

我有一个不寻常且具有挑战性的问题。我对 Whosebug 进行了深入研究,但一直找不到任何解决方案。请不要问我的设计风格,一定是这样。

我有一个 UIPageViewController,其中包含一个 UIScrollView,其中包含 4 个 UICollectionView。这些集合视图中的每一个都应该可以水平滚动但不能垂直滚动。滚动视图是必需的,因为屏幕不够大,无法显示所有 4 个集合视图。加载屏幕后,第 4 个集合视图不会立即可见。向下滚动后,第 4 个集合视图将变为可见。

我遇到的问题是第 4 个集合视图不响应触摸。具体来说,它不会响应点击或尝试滚动。其他 3 个工作得很好。令人费解和奇怪的是,第 4 个与其他 3 个完全相同,委托和数据源设置正确,并且启用了用户交互。有问题的 collection view 和其他 collection view 之间唯一真正的区别是它在屏幕加载时不会立即可见。

当我尝试滚动时,它的行为就像我试图更改页面一样,因此 UIPageView 更改了页面。所以 CollectionView 根本没有记录任何触摸。我有一种预感,它要么与 PageView 中的 GestureRecognizer 有关,要么与它在初始加载时如何在屏幕上不可见有关。

有什么想法吗?

如果没有看到代码或故事板的初始化,不能 100% 确定,但最好的是可能有视图重叠。您可以 运行 您的程序并单击 2 个重叠的矩形。这是Debug View Hierarchy。它会向您显示 phone 上的当前框架,您可以看到以分层状态排列的视图。

由于 impression7vx 提到 Debug View Hierarchy,解决了我自己的问题。不知道这是否存在,但它让我发现了这个缺陷。我写这篇文章只是为了帮助将来偶然发现这个的人。

我在 ScrollView 中有一个内容视图,它有一个有问题的约束。我将它设置为 "Equal Heights" 与 ScrollView 但在加载屏幕时高度是静态的。只有一半的滚动视图显示,那一半将被注册为 UIView 的高度。由于它是静态的,因此当我滚动时视图不会变大,并且第 4 个集合视图将不再位于该容器视图内。出于某种原因,由于集合视图不在容器视图中,因此不会注册触摸。

通过手动使高度与滚动视图的值相同来解决!这允许内容视图包含所有使它们再次正常运行的集合视图。

只取UIScrollView[=13=里面的UIView高度的NSLayoutConstraint ]

@IBOutlet weak var scrollContentViewHeight: NSLayoutConstraint!

将此 scrollContentViewHeight 的高度设置为等于 UIScrollView 的动态大小的高度

if scrollableView.contentSize.height = 840.0
then 
scrollContentViewHeight.constant = 840.0

viewDidLayoutSubviews

上设置
 override func viewDidLayoutSubviews() {
 
        scrollableView.contentSize.height = 840.0
        scrollContentViewHeight.constant = 840.0

    }