为了账号安全,请及时绑定邮箱和手机立即绑定

自动布局的UICollectionView自尺寸单元

自动布局的UICollectionView自尺寸单元

慕勒3428872 2019-07-08 15:12:25
自动布局的UICollectionView自尺寸单元我在试着自我调整UICollectionViewCells使用自动布局,但我似乎无法让单元格按照内容进行调整。我很难理解单元格的大小是如何从单元格的内容中更新的。下面是我尝试过的设置:习俗UICollectionViewCell带着UITextView在它的内容视图中。滚动UITextView是残疾的。ContentView的水平约束是:“H:Guide[_textView(320)]”,即UITextView被固定在单元格的左侧,显式宽度为320。contentView的垂直约束是:“V:x-0-[_textView]”,即UITextView被钉在牢房顶部。这个UITextView将高度约束设置为UITextView报告将符合文本。下面是将单元格背景设置为红色的样子,UITextView背景设置为蓝色:我把我一直在玩的项目放在GitHub上这里.
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

更新SWIFT 4

systemLayoutSizeFittingSize重命名为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获取并返回适当的特征。由你决定。

如果我错过了什么,请告诉我,希望我能帮上忙,并祝你好运编码。


查看完整回答
反对 回复 2019-07-08
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

在iOS 10中有一个新的常量称为UICollectionViewFlowLayout.automaticSize(原)UICollectionViewFlowLayoutAutomaticSize),因此:

self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)

你可以用这个:

self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

它具有更好的性能,特别是当集合视图中的单元格具有常量wid时。


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 3005 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信