UICollectionView 滚动到底部不显示整个项目

Posted

技术标签:

【中文标题】UICollectionView 滚动到底部不显示整个项目【英文标题】:UICollectionView scroll to bottom do not reveal the entire item 【发布时间】:2014-05-19 09:08:04 【问题描述】:

我有一个这样的屏幕,它内置在界面生成器中:

底部的控件是UICollectionView,另外两个是UIButton和segmentedControl。他们坐在 UIView 上,它是 UIController's 视图的子视图,但具有相同的框架。在我的代码中,我将UIViewController 添加到UINavigationController,这样屏幕顶部就会出现UINavigationBar。我可以设置自动布局约束以强制此屏幕的顶部移动到导航栏下方。但是,当我向下滚动 UICollectionView 时,我无法滚动到底部以查看其余项目。我只能看到最后两个项目的一半大小。 我已经更新了代码并在viewDidAppear 中输入了一些日志:

UICollectionView 框架高度 = 527.000000

视图帧 = 504.000000

所以UICollectionView's 的高度大于视图的高度。我希望集合视图适合 3.5" 屏幕和 4" 屏幕。

知道我做错了什么吗?我该如何解决这个问题?

【问题讨论】:

viewDidAppear方法中,打印出视图控制器的view和UICollectionView的frame。我猜 UICollectionView 会延伸到屏幕底部。 【参考方案1】:

这是因为您的集合视图的高度超过了框架的高度,请尝试降低适合您的 UIView 高度的集合视图的高度 - 您的集合视图的 yOrigin。

【讨论】:

我的collectionview的底部与UIViewController的view一致。如果我降低 collectionview 的高度,它将在底部显示一个空白区域。 根据您的编辑,您的收藏视图的高度大于视图的高度。尝试降低collection view的高度一次.. 我告诉过你我以前试过。该应用程序已经上线几个月了,但它只能在 3.5 英寸屏幕上正常运行。我刚刚发现在 4 英寸屏幕底部有很大的空白空间,这就是为什么我需要寻找更好的方法来解决这个问题. 这个你可以根据屏幕高度降低高度,即如果是480,则降低高度,否则不降低。如果您不想这样做,那么您将不得不进行约束设置.. 我不想这样做,因为它不适合所有屏幕。我最终使 collectionview 全屏显示,以便自动布局约束不会出现意外行为。例如,当我设置 UICollectionview 的顶部空间时,它与左上角的 UIButton 相关,这不是我想要的。我希望 UICollectionView 在屏幕顶部有固定空间。【参考方案2】:

问题是当添加导航栏时,UICollectionView 被“下推”,但它的高度保持不变。

您需要添加一个布局约束,该约束将导致 UICollectionView 在添加导航栏时降低高度。约束应该类似于“底部空间到底部布局指南 = 0”

【讨论】:

这是我添加约束后发生的情况:如果我只将约束添加到底部,我将能够在向下滚动时看到整个项目。但随后分段控件和 UIButton 将被 UINavigationBar 覆盖。但是如果我在顶部也加了约束,(top space to top = 0),向下滚动时我将无法看到底部的项目,那么这将与设置无约束的效果相同。【参考方案3】:

斯威夫特 4.1

尝试定义如下约束以考虑导航栏(即使在自动旋转的情况下,当状态栏可以改变高度时,它也应该工作)它还考虑了 ios 11 中的安全区域。

let collectionView = UICollectionView()
self.view.addSubview(collectionView)
if #available(iOS 11.0, *) 
    let safeArea = self.view.safeAreaLayoutGuide
    collectionView.topAnchor.constraint(equalTo: safeArea.topAnchor, constant: 0).isActive = true
 else 
    let topGuide = self.topLayoutGuide
    collectionView.topAnchor.constraint(equalTo: topGuide.bottomAnchor, constant: 0).isActive = true

collectionView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0).isActive = true
collectionView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true

【讨论】:

以上是关于UICollectionView 滚动到底部不显示整个项目的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式滚动到顶部不起作用?

无法滚动到底部 UICollectionview

将 UICollectionView 滚动到底部

UICollectionView 在滚动时留下空白单元格

行内块元素垂直对齐到底部不起作用

UICollectionView 最初滚动跳跃