【问题标题】:Why is only half of a collection view getting displayed?为什么只显示集合视图的一半?
【发布时间】:2020-05-13 19:06:46
【问题描述】:

我使用MMPlayerView(GitHub 链接here)将视频添加到集合视图中,在集合视图中,图像被代码中的视频替换(来自演示)。我采用了MMPlayerView 的演示项目并更改了一些东西以满足我的需求,然后将其实施到我的项目中,以便在this video 中获得类似这个节目的内容。

现在我显然想将收藏视图向上移动到屏幕顶部的按钮,稍后我将使用多个类似的收藏视图来使应用商店的风格更像,只是显示视频.由于我从演示中获取代码我不太确定某些事情,当我复制项目的演示时,集合视图是为垂直滚动而制作的,因此它占据了整个屏幕,因此集合视图被限制为视图的底部:

这导致它显示在应用程序中(我不明白为什么它在被 10 个点限制时离顶部这么远):

现在我显然想删除底部约束并用它的高度来约束它,这样我就可以拥有多个集合视图(可能通过使用表视图),所以我删除了视图底部的约束并添加了 250 点的高度限制:

导致应用看起来像这样的原因:

为什么?我猜这与视图控制器代码的这一部分有关:

extension HomeViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let m = min(UIScreen.main.bounds.size.width, UIScreen.main.bounds.size.height)
    return CGSize(width: m, height: m*0.75)
}

我想保持集合视图的宽度与视图的宽度相同,所以宽度很好,只是这里的高度。当我尝试将高度设置为 250 的恒定值(与高度约束相同)时,它会执行相同的操作(仅显示一半),但会稍微缩小视频。我可以改变什么?

【问题讨论】:

  • 给你的PlayerCell 一个背景颜色,这样你就可以在运行时轻松地看到它的框架。使用Debug View Hierarchy 在运行时检查布局,以便您可以准确地看到放置在哪里。此外,您还没有展示如何限制单元格元素。单元格是否有可能是 250 磅高(当您将 m*0.75 更改为 250.0 时,但 内容 的大小却是您意想不到的?
  • @DonMag 我会尝试...两秒钟...我会将其添加到我的问题中。你的意思是图像和标签是内容?您还认为这与该代码有关吗?

标签: ios swift uitableview uiview uicollectionview


【解决方案1】:

快速浏览来自MMPlayerView 的示例应用...

sizeForItemAt 中的高度值更改为您的收藏视图的高度(250 根据您的问题):

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let m = min(UIScreen.main.bounds.size.width, UIScreen.main.bounds.size.height)
    return CGSize(width: m, height: 250.0)
    //return CGSize(width: m, height: m*0.75)
}

我假设您在调试控制台中收到的错误消息与我得到的相同:

未定义 UICollectionViewFlowLayout 的行为,因为:

项目高度必须小于 UICollectionView 的高度减去部分插入顶部和底部值,减去内容插入顶部和底部值。

它还应该打印 Collection View 属性,包括:

adjustedContentInset: {0, 0, 200, 0};

所以集合视图的底部插入为 200。

如果您在示例项目中搜索contentInset,您会在视图控制器的viewDidLoad() 函数中找到这一行:

playerCollect.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 200, right:0)

如果您注释掉/删除该行,您现在应该会看到完整的单元格。

首先处理集合视图可能是个好主意,然后然后查看该示例项目以在您的应用中实现视频。

【讨论】:

  • 那行,是的,我没有看到 contentInset 行,谢谢!但是它在视频上添加了边框,无论如何我可以改变它,比如为什么这两行允许它填充?
  • 这是一个完全不同的问题。我建议您对代码/布局/对象/等进行进一步检查。如果您无法弄清楚,请将其作为一个新问题发布(包括详细信息以及您尝试解决的问题)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2020-04-20
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
相关资源
最近更新 更多