自动布局的UICollectionView自尺寸单元

自动布局的UICollectionView自尺寸单元

我在试着自我调整UICollectionViewCells使用自动布局,但我似乎无法让单元格按照内容进行调整。我很难理解单元格的大小是如何从单元格的内容中更新的。

下面是我尝试过的设置:

  • 习俗

    UICollectionViewCell

    带着

    UITextView

    在它的内容视图中。
  • 滚动

    UITextView

    是残疾的。
  • ContentView的水平约束是:“H:Guide[_textView(320)]”,即

    UITextView

    被固定在单元格的左侧,显式宽度为320。
  • contentView的垂直约束是:“V:x-0-[_textView]”,即

    UITextView

    被钉在牢房顶部。
  • 这个

    UITextView

    将高度约束设置为

    UITextView

    报告将符合文本。

下面是将单元格背景设置为红色的样子,UITextView背景设置为蓝色:

我把我一直在玩的项目放在GitHub上这里.


慕勒3428872
浏览 3020回答 3
3回答

繁华开满天机

更新SWIFT 4systemLayoutSizeFittingSize重命名为systemLayoutSizeFitting为IOS 9更新在看到我的GitHub解决方案在iOS 9下崩溃后,我终于有时间对这个问题进行充分的调查。我现在已经更新了回购,以包括几个不同的配置,为自我大小单元。我的结论是,自我大小的细胞在理论上是伟大的,但在实践中是混乱的。在使用自调整大小的单元格时,请注意。TL;DR看看我的GitHub项目自调整单元格只支持流布局,所以请确保这是您正在使用的。要使自调整单元格工作,需要设置两件事。1.成套estimatedItemSize在……上面UICollectionViewFlowLayout一旦您设置了estimatedItemSize财产。self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)2.在单元格子类上添加对调整大小的支持。这有两种口味:自动布局或自定义覆盖preferredLayoutAttributesFittingAttributes.使用自动布局创建和配置单元格我不想详细介绍这件事,因为这是一件很棒的事所以贴关于为单元格配置约束。只是小心一点Xcode 6中断如果您支持IOS 7,则需要确保在单元格的内容视图上设置自动调整大小掩码,并且在加载单元格时,将内容视图的边界设置为单元格的边界(即awakeFromNib).您需要注意的是,您的单元格需要比表视图单元格受到更严重的约束。例如,如果您希望您的宽度是动态的,那么您的单元格需要一个高度约束。同样,如果希望高度是动态的,则需要对单元格设置宽度约束。实施preferredLayoutAttributesFittingAttributes在您的自定义单元格中调用此函数时,您的视图已经配置了内容(即cellForItem已经打电话了)。假设您的约束已被适当设置,您可以有如下实现://forces the system to do one layout passvar isHeightCalculated: Bool = falseoverride func preferredLayoutAttributesFittingAttributes (_ 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上,如果您不小心,这种行为可能会导致您的实现崩溃(请参阅更多信息)。这里)。当你实现preferredLayoutAttributesFittingAttributes您需要确保只更改布局属性的框架一次。如果不这样做,布局将无限期地调用您的实现,并最终崩溃。一种解决方案是将计算出来的大小缓存在单元格中,并在任何时候重复使用单元格或更改其内容,就像我对isHeightCalculated财产。体验你的布局此时,您应该在您的集合视图中具有“功能”动态单元格。在我的测试中,我还没有找到足够的开箱即用解决方案,所以如果有,请随意评论。我还是觉得UITableView赢得动态尺寸IMHO的战斗。警告要非常注意,如果您使用原型单元格来计算估计的ItemSize-如果您的XIB使用大小类..这样做的原因是,当您从XIB加载单元时,它的大小类将被配置为Undefined..这只会在iOS 8和更高版本上被打破,因为在iOS 7上,大小类将根据设备加载(ipad=正则-any,iphone=Compact-any)。您可以在不加载XIB的情况下设置估计ItemSize,也可以从XIB加载单元格,将其添加到集合视图(这将设置traitCollection),执行布局,然后从SuperView中删除它。或者,您也可以让您的单元格覆盖traitCollection获取并返回适当的特征。由你决定。如果我错过了什么,请告诉我,希望我能帮上忙,并祝你好运编码。

慕尼黑8549860

在iOS 10中有一个新的常量称为UICollectionViewFlowLayout.automaticSize(原)UICollectionViewFlowLayoutAutomaticSize),因此:self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)你可以用这个:self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize它具有更好的性能,特别是当集合视图中的单元格具有常量wid时。
打开App,查看更多内容
随时随地看视频慕课网APP