我的UICollectionViews之一没有滚动或响应UIScrollView容器内的触摸事件[令人费解]

时间:2018-11-14 21:14:03

标签: ios swift uiscrollview uicollectionview uipageviewcontroller

我有一个不寻常且具有挑战性的问题。我对StackOverflow进行了深入研究,无法找到任何解决方案。请不要问我的设计风格-它一定是这种方式。

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

我遇到的问题是第4个收藏夹视图无法响应触摸。具体来说,它不响应轻击或滚动尝试。其他3个工作正常。令人困惑的是,第四个与另一个三个完全相同,委托和数据源设置正确,并且启用了用户交互。有问题的收集视图与其他有问题的收集视图之间的唯一真正区别是,屏幕加载时不会立即显示该视图。

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

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

在没有看到代码或情节提要的初始化的情况下,不能百分百确定,但是最好的事情是可能有一个视图重叠。您可以运行程序,然后单击2个重叠的矩形。这是Debug View Hierarchy。它显示了您手机上的当前帧,并且您可以看到以分层状态布置的视图。

enter image description here

答案 1 :(得分:0)

感谢impression7vx提到了Debug View Hierarchy,解决了我自己的问题。毫无头绪,但这让我发现了缺陷。我只是在写这篇文章,以帮助将来偶然发现此问题的人们。

我在ScrollView内有一个内容视图,该视图存在约束问题。我将其与ScrollView设置为“等于高度”,但是在加载屏幕时,高度是静态的。仅显示了一半的滚动视图,并且该一半将被注册为UIView的高度。由于它是静态的,因此当我滚动时该视图不会变大,并且第四个集合视图将不再位于该容器视图内。由于某些原因,由于集合视图不在容器视图中,因此不会注册触摸。

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

答案 2 :(得分:0)

只需取 UIScrollView

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

    }