当前位置: 首页 > 知识库问答 >
问题:

自动调整单元格大小:单元格宽度等于“收藏视图”

臧威
2023-03-14

我正在使用带有Autolayout和UICollectionView的自动调整单元格。

我可以在单元初始化代码中指定约束:

  func configureCell() {
    snp.makeConstraints { (make) in
      make.width.equalToSuperview()
    }
  }

但是,应用会崩溃,因为单元格尚未添加到集合视图中

问题

>

  • 单元格生命周期的哪个阶段,可以添加具有cell0.05宽度的约束?

    有什么默认的方法可以使< code >单元格的< code>width等于集合视图< code >的width而不访问UIScreenUIWindow '的实例吗?

    编辑问题不是重复的,因为它不是关于如何使用自动调整单元格大小功能,而是关于在使用自动布局时,在单元格生命周期的哪个阶段应用约束以获得所需结果。

  • 共有2个答案

    魏成济
    2023-03-14

    您需要实现sizeForItemAt:来计算大小。

    如果你的单元格有不同的高度,我们还使用了“尺寸单元格”。例如:

    class MyFancyCell: UICollectionViewCell {
        class func cellSize(_ content: SomeContent, withWidth width: CGFloat) -> CGSize {
            sizingCell.content = content
            sizingCell.updateCellLayout(width)
            return sizingCell.systemLayoutSizeFitting(UILayoutFittingExpandedSize)
        }
    
        fileprivate static let sizingCell = Bundle.main.loadNibNamed("ContentCell", owner: nil, options: nil)!.first as! ContentCell    
    
        func updateCellLayout(width: CGFloat) {
            //Set constraints and calculate size    
        }
    }
    
    柯星辰
    2023-03-14

    要实现自调整大小的集合视图单元格,您需要执行两项操作:

    1. 指定估计的项大小在 UI 集合视图流布局
    2. 在单元格上实现首选布局属性适合(_:)

    该属性的默认值是CGSizeZero。将其设置为任何其他值都会导致集合视图使用单元格的preferredLayoutAttributesFitting(_:)方法查询每个单元格的实际大小。如果所有单元格的高度都相同,请使用itemSize属性而不是该属性来指定单元格的大小。

    这只是一个估计值,用于计算滚动视图的内容大小,将其设置为合理的内容。

    let collectionViewFlowLayout = UICollectionViewFlowLayout()
    collectionViewFlowLayout.estimatedItemSize = CGSize(width: collectionView.frame.width, height: 100)
    
    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)
    
        // Specify you want _full width_
        let targetSize = CGSize(width: layoutAttributes.frame.width, height: 0)
    
        // Calculate the size (height) using Auto Layout
        let autoLayoutSize = contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: UILayoutPriority.required, verticalFittingPriority: UILayoutPriority.defaultLow)
        let autoLayoutFrame = CGRect(origin: autoLayoutAttributes.frame.origin, size: autoLayoutSize)
    
        // Assign the new size to the layout attributes
        autoLayoutAttributes.frame = autoLayoutFrame
        return autoLayoutAttributes
    }
    
     类似资料:
    • 问题内容: 我正在将AutoSizing单元格与Autolayout和UICollectionView一起使用。 我可以在单元初始化的代码中指定约束: 但是,由于该单元尚未添加到中,该应用程序崩溃了。 问题 在该阶段的生命周期,可以添加一个约束的? 有没有作出任何默认方式的equal to the of thewithout accessing an instance of or? 编辑 这个问题

    • 我在UIViewController中有一个UITableView作为视图的一部分。我正在尝试根据文本的长度自动调整表格单元格的大小。它不会设置textview的文本,单元格将以idCellTextView单元格的标准高度结束。我已经四处搜索过,正在尝试从单元格内的文本视图相对于内容视图和代码在自动布局中使用固定,如下所示: 与问题相关的视图控制器的其余部分显示在以下位置:

    • 我在tableViewController中使用自动大小的表格视图单元格。我已将下面的两行添加到viewDidLoad(),执行正确的自动布局,并将带有扩展文本的标签的Lines属性更改为0。 但是,当视图第一次加载时,单元格不会自动调整大小。但是如果我向下滚动或者翻转到横向视图,然后再翻转回来,自动调整大小就能完美地工作。所以我添加了下面的代码来查看WillAppear函数: 现在,当table

    • 问题内容: 在我的应用程序中,我有一个表格视图,每个单元格中都有一个图像,标签和文本视图。我希望能够根据文本视图中的内容量自动调整单元格的大小。(文本视图是最下面的文本。) 到目前为止,我已经添加了正确的约束。文本视图的前导,尾随,顶部和底部,并且已禁用滚动和编辑。 在我的tableViewController.swift文件中,我编写了以下代码: 但是,这不起作用,因为当我在文本视图中添加更多文

    • 问题内容: 我在表容器中有不确定数量的表单元元素。 有没有一种纯粹的CSS方法可以使表格单元具有相等的宽度,即使它们内部具有不同大小的内容? 谢谢。 编辑:具有最大宽度将需要知道您有多少个单元格? 问题答案: 这是工作单元数不确定的有效 您可以为每个父对象固定一个宽度( 表格 ),否则通常将为100%。 诀窍是使用 每个单元上的一定宽度触发它,这里是2%。这将触发 另一个 表算法,浏览器会尽力遵守

    • 问题内容: 有没有一种使用HTML / CSS(具有相对大小)的方法来使一行单元格拉伸包含它的表的整个宽度? 单元格的宽度应相等,并且外部表格的大小也应使用来动态变化。 目前,如果我没有指定固定大小,单元格会自动调整大小以适合其内容。 问题答案: 您甚至不必为单元格设置特定的宽度,足以均匀地分布单元格。 请注意,要使用表格样式的元素,必须设置宽度(在我的示例中为100%)。