gpt4 book ai didi

ios - UICollectionView 具有自动布局的自定尺寸单元格

转载 作者:IT王子 更新时间:2023-10-29 07:26:17 25 4
gpt4 key购买 nike

我正在尝试自行调整尺寸 UICollectionViewCells使用自动布局,但我似乎无法让单元格根据内容调整大小。我无法理解如何从单元格的 contentView 中的内容更新单元格的大小。

这是我尝试过的设置:

  • 定制 UICollectionViewCellUITextView在其内容 View 中。
  • 滚动查看 UITextView被禁用。
  • contentView 的水平约束为:“H:|[_textView(320)]”,即 UITextView固定在单元格的左侧,显式宽度为 320。
  • contentView 的垂直约束为:“V:|-0-[_textView]”,即 UITextView固定在单元格的顶部。
  • UITextView将高度约束设置为 UITextView 的常量报告将适合文本。

  • 这是单元格背景设置为红色, UITextView 的样子。背景设置为蓝色:
    cell background red, UITextView background blue

    我把我一直在玩的项目放在了 GitHub here .

    最佳答案

    This answer is outdated from iOS 14 with the addition of compositional layouts. Please consider updating the new API


    为 Swift 5 更新 preferredLayoutAttributesFittingAttributes 重命名为 preferredLayoutAttributesFitting 并使用自动调整大小

    为 Swift 4 更新 systemLayoutSizeFittingSize 重命名为 systemLayoutSizeFitting
    为 iOS 9 更新
    在看到我的 GitHub 解决方案在 iOS 9 下崩溃后,我终于有时间全面调查这个问题。我现在已经更新了 repo,以包含几个不同配置的示例,用于自定尺寸单元格。我的结论是,自定尺寸单元在理论上很好,但在实践中却很困惑。在进行自我调整大小的单元格时要注意。
    TL;DR
    看看我的 GitHub project

    仅流式布局支持自行调整大小的单元格,因此请确保您正在使用它。
    您需要设置两件事才能使自定尺寸单元工作。
    #1。在 estimatedItemSize 上设置 UICollectionViewFlowLayout设置 estimatedItemSize 属性后,流布局本质上将变为动态的。
    self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    #2。添加对您的单元格子类大小的支持
    这有两种口味;自动布局 自定义覆盖 preferredLayoutAttributesFittingAttributes
    使用自动布局创建和配置单元格
    我不会对此进行详细介绍,因为有一个关于为单元格配置约束的精彩 SO post。只是要小心 Xcode 6 broke iOS 7 的一堆东西,所以,如果你支持 iOS 7,你需要做一些事情,比如确保在单元格的 contentView 上设置 autoresizingMask,并且当单元格时,将 contentView 的边界设置为单元格的边界已加载(即 awakeFromNib )。
    您需要注意的是,您的单元格需要比表格 View 单元格更严格地约束。例如,如果您希望您的宽度是动态的,那么您的单元格需要一个高度约束。同样,如果您希望高度是动态的,那么您将需要对单元格进行宽度限制。
    在您的自定义单元格中实现 preferredLayoutAttributesFittingAttributes调用此函数时,您的 View 已经配置了内容(即已调用 cellForItem)。假设您的约束已适当设置,您可以有这样的实现:
    //forces the system to do one layout pass
    var isHeightCalculated: Bool = false

    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
    //Exhibit A - We need to cache our calculation to prevent a crash.
    if !isHeightCalculated {
    setNeedsLayout()
    layoutIfNeeded()
    let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
    var newFrame = layoutAttributes.frame
    newFrame.size.width = CGFloat(ceilf(Float(size.width)))
    layoutAttributes.frame = newFrame
    isHeightCalculated = true
    }
    return layoutAttributes
    }
    注意 在 iOS 9 上,行为发生了一些变化,如果您不小心,可能会导致您的实现崩溃(请参阅更多 here)。当您实现 preferredLayoutAttributesFittingAttributes 时,您需要确保您只更改布局属性的框架一次。如果您不这样做,布局将无限期地调用您的实现并最终崩溃。一种解决方案是在您的单元格中缓存计算出的大小,并在您重复使用单元格或更改其内容时使其无效,就像我对 isHeightCalculated 属性所做的那样。
    体验您的布局
    此时,您的 collectionView 中应该有“正常运行”的动态单元格。在我的测试期间,我还没有找到足够的开箱即用解决方案,所以如果你有,请随时发表评论。感觉就像 UITableView 赢得了动态大小恕我直言的战斗。
    ##注意事项
    请注意,如果您使用原型(prototype)单元格来计算estimatedItemSize - 如果您的 XIB uses size classes ,这将中断。这样做的原因是,当您从 XIB 加载单元时,其大小类将配置为 Undefined 。这只会在 iOS 8 及更高版本上被打破,因为在 iOS 7 上,将根据设备(iPad = Regular-Any,iPhone = Compact-Any)加载尺寸类。您可以设置estimatedItemSize 而不加载XIB,或者您可以从XIB 加载单元格,将其添加到collectionView(这将设置traitCollection),执行布局,然后将其从superview 中删除。或者,您也可以让您的单元格覆盖 traitCollection getter 并返回适当的特征。由你决定。
    如果我错过了什么,请告诉我,希望我能帮上忙,祝你编码好运

    关于ios - UICollectionView 具有自动布局的自定尺寸单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25895311/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com