【问题标题】:Best way to make a grid of views inside a UITableViewCell在 UITableViewCell 内制作视图网格的最佳方法
【发布时间】:2015-07-31 17:27:02
【问题描述】:

我有一个 UITableView,其中单元格包含放置在 XIB 中的网格样式的子视图。今天,它们被安排了自动布局和约束。这些子视图可能有十几种类型,其中一些类型具有固定宽度,其他类型必须填充空白空间,都具有固定高度。每个单元格根据其需要显示一组特定的这些类型。

下图显示了 3 个单元格及其子视图

关键是架构需要很多规则来更新约束,并且在添加新的子视图类型时不容易维护。在这种情况下,每个单元仅使用一个 XIB 似乎不是最佳选择,因为初始界面构建器布局只是多种可能安排中的一种,并且单元必须做很多工作才能适应。此外,我更喜欢在添加新子视图类型时不需要触摸以前的子视图类型的解决方案。

我考虑过以下解决方案:

  • 在 UITableViewcell 中插入一个 collectionView,并将子视图转换为 UICollectionViewCells :

    • 您认为屏幕上有这么多collectionViews 可能是性能问题吗? (屏幕上最多可以同时显示 10 个细胞,每个细胞有 1 到 10 个细胞)
    • 考虑到 UICollectionViewCells 甚至不会在 UITableViewCell 内滚动,在这种情况下使用 collectionView 是不是有点过载,只是为了安排一组视图?
  • 使用新的 UIStackView

    • stackView 仅与 iOS 9 兼容,因此这意味着我们必须在一段时间内维护 2 个版本的代码
    • stackView 将每个子视图像素完美放置似乎有点复杂
  • 为每个子视图类型创建一个单独的 XIB,并让相应的 UIView 根据其邻居计算自己的约束,从而形成自定义网格系统

    • 这有点过于“自定义”解决方案,因此其他开发人员更难维护和理解
    • 如果在未来它将是第四列子视图,它仍然需要进行大量更改(= 它不是一个可以很好地适应的真正的网格系统)

您会使用哪种解决方案?您还有其他建议吗? 谢谢

【问题讨论】:

    标签: ios objective-c performance architecture memory-efficient


    【解决方案1】:

    我总是使用自定义集合,例如在这个视频中 https://www.youtube.com/watch?v=LFBTbmvFR30

    Сustom 网格具有动态的单元格大小,所有集合都可以通过单元格调整大小 您应该使用带有自定义布局和自定义单元格的集合视图

    例如,我使用这种布局来实现美丽的动态贪婪 https://github.com/bryceredd/RFQuiltLayout

    然后回到你的屏幕,如果你可以使用这个布局,你可以像在没有“收集视图到集合视图单元格”的屏幕上那样收集贪婪 - 这种方法确实如此,但你应该了解如何使用自定义布局。

    你可以使用“集合视图到集合视图单元格”,这是一种不好的方法,但速度更快,您可以使用自定义布局。

    P.S 相信我,所有漂亮的集合视图都有自定义布局,你可以在 gitHub 上找到很多示例。

    【讨论】:

    • 感谢 Joe 的回答,但您并没有真正争论为什么 UICollectionView 会是我的最佳解决方案,特别是关于性能(每个 tableViewCell 内的 collectionView)、过载(单元格重用、自定义布局...我的子单元格甚至没有滚动)并且难以放置像素完美的各种尺寸元素。
    • 如果要垂直滚动表格,并且在某些单元格中要添加水平滚动集合,则应使用“每个tableViewCell内的collectionView”,但可以组合不同的解决方案,可以使用自定义布局+ “每个 tableViewCell 内的collectionView”,也许这是一个最好的决定。如果您只想使用自定义网格自定义垂直滚动集合(在任何单元格中没有水平滚动),您应该使用我的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多