首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >具有自动布局功能的UICollectionView自动调整单元大小

具有自动布局功能的UICollectionView自动调整单元大小
EN

Stack Overflow用户
提问于 2014-09-17 16:02:16
回答 17查看 281.7K关注 0票数 226

我试图让自调整大小的UICollectionViewCells与自动布局一起工作,但我似乎无法让单元格根据内容调整自己的大小。我很难理解单元格的大小是如何根据单元格的contentView中的内容更新的。

下面是我尝试过的设置:

contentView.

  • Scrolling中包含UITextViewUITextView自定义UICollectionViewCell被禁用。

  • contentView的水平约束为:"H:|_textView(320)",即UITextView固定在单元格左侧,显式宽度为320。

  • contentView的垂直约束为:"V:|-0-_textView",即固定在单元格顶部的UITextView

  • UITextView的高度约束设置为一个常量,UITextView报告将适合该常量。

下面是单元格背景设置为红色,UITextView背景设置为蓝色时的外观:

我把我一直在玩的项目放在GitHub here上。

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2014-09-17 17:04:24

这个答案在iOS 14中已经过时了,因为它增加了组合布局。请考虑更新new API

针对Swift 5更新

preferredLayoutAttributesFittingAttributes已重命名为preferredLayoutAttributesFitting并使用自动调整大小

针对Swift 4更新

systemLayoutSizeFittingSize已重命名为systemLayoutSizeFitting

针对iOS 9进行了更新

在看到我的GitHub解决方案在iOS 9下崩溃后,我终于有时间全面调查这个问题了。我现在已经更新了存储库,包含了几个不同配置的示例,用于自调整单元大小。我的结论是,自调整单元格的大小在理论上是很好的,但在实践中却很混乱。在继续调整单元格大小时需要注意的一点是。

TL;DR

查看我的GitHub project

只有流式布局才支持自调整单元格大小,因此请确保您使用的是自调整大小的单元格。

要使自调整大小的单元格正常工作,需要进行两项设置。

#1.在UICollectionViewFlowLayout上设置estimatedItemSize

设置estimatedItemSize属性后,流布局本质上将变为动态布局。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

#2.添加对计算单元格子类大小的支持

这有两种风格:自动布局preferredLayoutAttributesFittingAttributes自定义覆盖。

使用自动布局创建和配置单元格

我不会在中详细介绍这一点,因为有一个关于为单元配置约束的出色的SO post。只需注意在iOS 7中Xcode 6 broke一大堆东西,所以,如果你支持iOS 7,你将需要做一些事情,比如确保autoresizingMask设置在单元格的contentView上,以及确保contentView的边界在加载单元格时设置为单元格的边界(即awakeFromNib)。

您需要注意的是,您的单元格需要比表视图单元格更严格的约束。例如,如果您希望宽度是动态的,那么您的单元格就需要高度约束。同样,如果您希望高度是动态的,那么您需要对单元格进行宽度约束。

在自定义单元中实现preferredLayoutAttributesFittingAttributes

当调用此函数时,您的视图已经配置了内容(即调用了cellForItem )。假设您的约束已经被适当地设置,您可以有一个如下所示的实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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赢得了动态大小之战。

##Caveats请注意,如果您使用原型单元来计算estimatedItemSize -如果您的XIB uses size classes将中断。这样做的原因是,当您从XIB加载单元时,它的size类将配置为Undefined。这只会在iOS 8和更高版本上被破坏,因为在iOS 7上,size类将基于设备加载(iPad = Regular-Any,iPhone = Compact-Any)。您可以在不加载XIB的情况下设置estimatedItemSize,也可以从XIB加载单元,将其添加到collectionView (这将设置traitCollection),执行布局,然后将其从superview中删除。或者,您也可以让您的单元覆盖traitCollection获取方法并返回适当的特征。由你决定。

如果我遗漏了什么,请让我知道,希望我能帮上忙,祝你编码好运

票数 339
EN

Stack Overflow用户

发布于 2017-03-22 10:26:43

在iOS10中,有一个名为UICollectionViewFlowLayout.automaticSize (以前称为UICollectionViewFlowLayoutAutomaticSize)的新常量,因此:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.flowLayout.estimatedItemSize = CGSize(width: 100, height: 100)

您可以使用以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize

它具有更好的性能,特别是当集合视图中的单元格具有恒定宽度时。

访问流程布局:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
override func viewDidLoad() {
   super.viewDidLoad()

   if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
      flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
   }
}

Swift 5更新:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
override func viewDidLoad() {
   super.viewDidLoad()

   if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
      flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    }
}
票数 62
EN

Stack Overflow用户

发布于 2015-07-07 21:35:26

Daniel Galasko's answer的一些关键更改解决了我的所有问题。不幸的是,我还没有足够的名气直接发表评论。

在步骤1中,当使用自动布局时,只需将单个父UIView添加到单元格。单元格中的所有内容都必须是父视图的子视图。这解决了我所有的问题。虽然Xcode会自动为UITableViewCells添加此功能,但它不会(但应该)为UICollectionViewCells添加此功能。根据docs的说法:

若要配置单元格的外观,请将将数据项内容作为子视图呈现所需的视图添加到contentView属性中的视图中。不要直接向单元格本身添加子视图。

然后完全跳过步骤3。它不是必需的。

票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25895311

复制
相关文章
让JTable单元格可以自动换行、自动调整宽度以适合单元格内容
源代码也可以从我的Java资料站进行下载! http://Java.EchoChina.net 或 http://61.131.30.54/123/Develop/Java/SC/
阿敏总司令
2019/02/28
1.9K0
让JTable单元格可以自动换行、自动调整宽度以适合单元格内容
自动布局
AutoLayout是一种基于约束的,描述性的布局系统。 item1.attribute1 = multiplier * item2.attribute2 + constant + (id)constraintWithItem:(id)item1 attribute:(NSLayoutAttribute)attribute1 relatedBy:(NsLayoutRelation)relation
用户3004328
2018/09/06
3570
自动布局
【热点盘点】iOS 8增强的自动布局功能
自动布局是iOS6开始引进的新功能,而iOS 8则在原有自动布局的基础上增加了SizeClass的概念,从而增强了自动布局功能。
博文视点Broadview
2020/06/11
1.2K0
css经典布局之左侧固定大小右侧自动适应
最近学习了一种经典布局,固定左侧或右侧的宽度,另一侧自适应宽度,此种布局挺常用,尤其是像后台,大部分都是采用这种结构,还比如像订餐类的APP,进入商家的时候,会出现一堆饭的列表,左侧是饭的分类,右侧是饭的列表等等。反正挺实用,值得收藏!
IMWeb前端团队
2019/12/05
1.2K0
css经典布局之左侧固定大小右侧自动适应
最近学习了一种经典布局,固定左侧或右侧的宽度,另一侧自适应宽度,此种布局挺常用,尤其是像后台,大部分都是采用这种结构,还比如像订餐类的APP,进入商家的时候,会出现一堆饭的列表,左侧是饭的分类,右侧是
IMWeb前端团队
2017/12/28
2K0
视频自动审核工具有哪些 自动审核工具有什么优势
现在很多人都通过上传视频来为自己无聊的生活增添一些乐趣。所以平台在视频审核方面需要投入更多的精力,如果只靠人力进行审核的话是很困难的,每天都有成千上万的视频需要去审核。单单依靠人力,没有办法实现所有的视频都被审核,而且还会浪费很多时间,所以更好的办法就是使用视频自动审核工具。
用户8715145
2022/03/18
2.5K0
Flutter(二)--布局机制、布局步骤、水平和垂直布局、组件大小动态调整Flutter(二)--布局机制、布局步骤、水平和垂直布局、组件大小动态调整
布局机制 flutter的布局机制是组件,flutter中几乎一切都是组件,除了图片、文字等,还有用来排列、限制、对齐这些可见组件的行、列、网格等(可理解为系统样式)。 image.png 布局步骤
用户8893176
2021/08/09
1.7K0
Flutter(二)--布局机制、布局步骤、水平和垂直布局、组件大小动态调整Flutter(二)--布局机制、布局步骤、水平和垂直布局、组件大小动态调整
iOS流布局UICollectionView系列二——UICollectionView的代理方法
        在上一篇博客中,介绍了最基本的UICollectionView的使用和其中我们常用的属性和方法,也介绍了瀑布流布局的过程与思路,这篇博客是上一篇的补充,来讨论关于UICollectionView的代理方法的使用。博客地址:
珲少
2018/08/16
2.1K0
iOS流布局UICollectionView系列二——UICollectionView的代理方法
iOS自动布局
简单示例 override func viewDidLoad() { super.viewDidLoad() baiduMap = BMKMapView(forAutoLayout: {}()) self.mapView.addSubview(baiduMap); self.mapView.addConstraints(self.layoutConstraints()) } func layoutConstraints() -> [NSLayoutConstrain
码客说
2019/10/22
3420
数据采集具有什么功能?能够自动判断测量结果吗?
提起数据这个概念的时候,很多人都会认为它们是一类较为抽象的事物,其实数据在多个行业领域中,都发挥着作用与价值,很多企业在工作过程中,都需要采集与分析数据,从而更好的制定生产与管理计划等。数据采集具备哪些功能?是否可以实现自动判断和分析测量结果?大家一起来了解详细内容吧!
用户8739990
2021/07/16
8040
数据采集具有什么功能?能够自动判断测量结果吗?
Excel 批量导入图片并根据单元格自动调节大小
我们在《如何批量获取Excel图片并准确重命名?》一文中提到一个场景,即excel表中至少有两列,一列是图片,另一列是对应的图片名称,我们希望批量地提取当中的图片,并根据对应列为图片重命名。为解决这个问题,我们提供了Python和VBA两种实现办法。该文还将Python脚本封装成小工具给大家下载使用。
btharp
2021/08/31
3.7K0
Excel 技术篇-解决“单元格不能自动适应大小“问题
正常情况下我们在一个单元格内输入了几行内容之后,只要退出编辑状态,它都会自动变高来适应我们的内容,让所有的内容都可以被看到。这是我们最想要的效果。
小蓝枣
2020/09/25
9700
Excel 技术篇-解决“单元格不能自动适应大小“问题
iOS流布局UICollectionView系列五——圆环布局的实现
        前边的几篇博客,我们了解了UICollectionView的基本用法以及一些扩展,在不定高的瀑布流布局中,我们发现,可以通过设置具体的布局属性类UICollectionViewLayoutAttributes来设置设置每个item的具体位置,我们可以再扩展一下,如果位置我们可以自由控制,那个布局我们也可以更加灵活,就比如创建一个如下的circleLayout:
珲少
2018/08/16
1.5K0
iOS流布局UICollectionView系列五——圆环布局的实现
调整图像- 自动对比度、自动色阶算法
  在执行两个算法之前,我们需要确定两个参数,大家在用PS时选择自动色阶并不会弹出什么参数设置对话框,那是因为PS把这个隐藏的比较深 。选择曲线或色阶命令,然后在弹出的界面中点击选项按钮,会出现如下界面:
用户1138785
2019/09/11
1.7K0
调整图像- 自动对比度、自动色阶算法
iOS流布局UICollectionView系列一——初识与简单使用UICollectionView
        UICollectionView是iOS6之后引入的一个新的UI控件,它和UITableView有着诸多的相似之处,其中许多代理方法都十分类似。简单来说,UICollectionView是比UITbleView更加强大的一个UI控件,有如下几个方面:
珲少
2018/08/16
3.2K0
iOS流布局UICollectionView系列一——初识与简单使用UICollectionView
单元格自动计算
在我们填报报表时,有的单元格的数据是需要通过自动计算直接获得,但是不是所有的函数都支持填报自动计算,这是为什么呢?
用户10133222
2022/12/15
3200
百度UEditor自动伸展的调整
昨天将后台编辑器从kindeditor更换为百度UEditor后,没注意一个细节。今天修改文章的时候才看到,原来UEditor会自动长高,也就是说随着文章长度的增加,滚动网页后,编辑器内部并没有出现滚动条,而是页面上出现了滚动条,由于后台采用fix的布局,这就很尴尬了,遮挡了必要的页面内容外,我的提交按钮也被滚动的无影无踪了。
世纪访客
2018/08/02
7750
百度UEditor自动伸展的调整
iOS自动布局——Masonry详解
前言 UI布局是整个前端体系里不可或缺的一环。代码的布局是设计语言与用户视觉感受沟通的桥梁,不论它看起来多么简单或是琐碎,但不得不承认,绝大部分软件开发的问题,都是界面问题。那么,如何高效的完成UI开
Oceanlong
2018/07/03
1K0
iOS自动布局——Masonry详解
UI布局是整个前端体系里不可或缺的一环。代码的布局是设计语言与用户视觉感受沟通的桥梁,不论它看起来多么简单或是琐碎,但不得不承认,绝大部分软件开发的问题,都是界面问题。那么,如何高效的完成UI开发,也是软件行业一直在克服的问题。
鹅厂新鲜事儿
2018/04/11
3K2
iOS自动布局——Masonry详解
AutoLayout自动布局在线课程
AutoLayout是一种基于约束的,描述性的布局系统。AutoLayout为开发者提供了一种不同于以往UI元素位置指定的布局方法。以前布局是通过frame属性来定义其在当前view中的位置和尺寸。使用AutoLayout则变为使用约束条件来定义view的位置和尺寸,最大好处是解决了不同分辨率和屏幕尺寸下view的适配问题,也简化了旋转时view的位置的定义。
YungFan
2019/01/12
6110

相似问题

具有自动布局功能的自调整大小UICollectionView

121

具有固定间距的UICollectionview自调整大小单元格自动布局

115

UICollectionView单元格自动调整大小

20

UICollectionView自动调整单元格大小

113

使用自动调整大小功能时,UICollectionView单元格不会根据单元格内容调整大小

125
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文