【问题标题】:What is the best strategy for creating a UIScrollView with variable contents including a UICollectionView?创建具有可变内容(包括 UICollectionView)的 UIScrollView 的最佳策略是什么?
【发布时间】:2021-04-12 10:43:44
【问题描述】:

我不时遇到这个问题,但仍然没有提出令人满意的解决方案。我正在尝试创建一个复杂的可滚动视图。考虑以下示例:

[UIView 1]
[UIView 2]
[UIView 3]
[UICollectionView]
[UIView 4]

在这种情况下,四个 UIView 中的任何一个都可以隐藏或可见。 UICollectionView 不应滚动,而应显示所有单元格。所有这五个视图都应该在滚动所有视图的 UIScrollView 中。

我还没有找到使这项工作奏效的秘诀。

选项 1] 在代码中完全手动布局。我知道这会起作用,但它非常不方便,因为它会影响子视图,这些子视图本身就很复杂。

选项 2] 五个视图中的每一个都位于 UICollectionView 单元格中,并且 UICollectionView 处理大小调整和滚动。我同样知道这会奏效,但完成此操作似乎需要很多开销。

选项 3] 将五个视图包装在一个 UIStackView 中。这似乎是这个问题最自然的解决方案,但它依赖于能够同时做三件我还没有完成的事情:

  1. 根据[可见]五个视图的高度设置堆栈视图的高度。我试图通过从界面生成器链接到代码中的高度约束来实现这一点。

  2. 将集合视图设置为根据其包含的单元格数量具有可变高度。

  3. 将 UIScrollView 内容设置为与堆栈视图相同的高度。

到目前为止,我还没有找到正确的约束集来使所有这些事情发生,这让我开始认为带有 UIStackView 的 UIScrollView 不是解决此问题的可行解决方案。我尝试了一切,要么破坏了集合视图显示所有单元格的能力,要么我无法访问滚动视图中的整个堆栈视图(IE,它在底部之前被切断)。

对解决此类问题的正确策略的想法? (提前致谢)

【问题讨论】:

    标签: ios swift uiscrollview uistackview


    【解决方案1】:

    我肯定会选择选项 3。我遇到了类似但不同的层次结构(一个带有 UIImageView、UIStackView、UIButton 的表单,在堆栈视图中是两个文本字段、一个文本视图和一个表格视图。

    我给文本视图设置了一个大于某个值的高度约束,然后使用 UITableView 的子类使其高度根据内容动态变化。我能够为 UICollectionView 创建一个类似的子类,您可能希望使用它来使您的集合视图高度动态化:

    import UIKit
    
    class DynamicHeightCollectionView: UICollectionView {
        override var contentSize: CGSize {
            didSet {
                invalidateIntrinsicContentSize()
            }
        }
        
        override var intrinsicContentSize: CGSize {
            layoutIfNeeded()
            return CGSize(width: UIView.noIntrinsicMetric, height: contentSize.height)
        }
        
        override func layoutSubviews() {
            super.layoutSubviews()
            
        }
    }
    

    然后从情节提要中,确保选择集合视图,转到大小检查器,并将内部大小设置为占位符以避免情节提要警告。

    这应该可以解决情节提要中的所有布局问题,并希望能够奏效。

    【讨论】:

    • 确保您获得正确的滚动视图。我发现在滚动视图和实际内容之间添加一个容器视图是可行的方法。添加一个在所有边缘上都有约束的 UIScrollView,然后将一个具有相等前导、顶部、尾随、底部和宽度的 UIView 添加到滚动视图,然后将堆栈视图作为子视图添加到 UIView。
    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 2010-10-09
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多