Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 估计高度不工作的集合视图合成布局_Ios_Swift_Uicollectionview_Ios13_Ios Autolayout - Fatal编程技术网

Ios 估计高度不工作的集合视图合成布局

Ios 估计高度不工作的集合视图合成布局,ios,swift,uicollectionview,ios13,ios-autolayout,Ios,Swift,Uicollectionview,Ios13,Ios Autolayout,我希望我的应用程序能够针对每个可访问性选项(包括文本大小)进行优化 我根据具有合成布局的部分制作了collectionView布局。所以我需要我的细胞的高度和它的内容一起增长。我认为使用.estimate(constant)可以完成这项工作,但它似乎不起作用。内在的约束对我来说似乎很好 以下是我正在使用的布局: let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.42), heightDimension: .e

我希望我的应用程序能够针对每个可访问性选项(包括文本大小)进行优化

我根据具有合成布局的部分制作了collectionView布局。所以我需要我的细胞的高度和它的内容一起增长。我认为使用
.estimate(constant)
可以完成这项工作,但它似乎不起作用。内在的约束对我来说似乎很好

以下是我正在使用的布局:

let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.42), heightDimension: .estimated(90))
let item = NSCollectionLayoutItem(layoutSize: NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(90)))
item.contentInsets = NSDirectionalEdgeInsets(top: 5.0, leading: 12.0, bottom: 5.0, trailing: 12.0)
let group = NSCollectionLayoutGroup.vertical(layoutSize: size, subitem: item, count: 1)
let section = NSCollectionLayoutSection(group: group)
section.contentInsets = NSDirectionalEdgeInsets(top: 0.0, leading: 6.0, bottom: 0.0, trailing: 0.0)
section.orthogonalScrollingBehavior = .groupPaging
当我在辅助功能设置上设置更大的文本大小时,会发生以下情况:

单元格应包含2个标签,以下是autoLayoutConstraints:

    NSLayoutConstraint.activate([
        self.titleLabel.topAnchor.constraint(equalTo: self.container.topAnchor, constant: 10),
        self.titleLabel.leftAnchor.constraint(equalTo: self.container.leftAnchor, constant: 20),
        self.titleLabel.rightAnchor.constraint(equalTo: self.container.rightAnchor, constant: -20)
    ])

    NSLayoutConstraint.activate([
        self.subtitleLabel.topAnchor.constraint(equalTo: self.titleLabel.bottomAnchor, constant: 10),
        self.subtitleLabel.leftAnchor.constraint(equalTo: self.container.leftAnchor, constant: 20),
        self.subtitleLabel.rightAnchor.constraint(equalTo: self.container.rightAnchor, constant: -20),
        self.subtitleLabel.bottomAnchor.constraint(equalTo: self.container.bottomAnchor, constant: -10)
    ])

提前感谢您的帮助。

不确定它是否与系统可访问性相关,但您不能将
.estimated()
.contentInsets
一起用于项目


它有时确实有效,但不可靠。即使在尝试将插图应用于组时(尽管它是item的子类,我也会想象它会起作用):(

我发现将布局组设置为水平而不是垂直解决了这个问题。下面是我的最终布局:

        let estimatedHeight = CGFloat(100)
        let layoutSize = NSCollectionLayoutSize(widthDimension: .estimated(200), heightDimension: .estimated(estimatedHeight))
        let item = NSCollectionLayoutItem(layoutSize: layoutSize)
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: layoutSize, subitem: item, count: 1)
        let section = NSCollectionLayoutSection(group: group)
        section.contentInsets = NSDirectionalEdgeInsets(top: 10, leading: 10, bottom: 10, trailing: 10)
        section.interGroupSpacing = 10
        section.orthogonalScrollingBehavior = .groupPaging

如果您想创建由单元格的约束决定单元格高度的布局,希望它对iOS13+有所帮助-尝试以下方法:

private func configureCollectionView() {
    collectionView.collectionViewLayout = createLayout()
}

private func createLayout() -> UICollectionViewLayout {
    let layout = UICollectionViewCompositionalLayout {
        (sectionIndex: Int, layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
        let size = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(10))
        let item = NSCollectionLayoutItem(layoutSize: size)
        item.edgeSpacing = NSCollectionLayoutEdgeSpacing(leading: nil, top: NSCollectionLayoutSpacing.fixed(20), trailing: nil, bottom: NSCollectionLayoutSpacing.fixed(0))
        let group = NSCollectionLayoutGroup.vertical(layoutSize: size, subitems: [item])
        group.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 20)
        let section = NSCollectionLayoutSection(group: group)
        return section
    }
    return layout
}
确保单元格中的约束、拥抱和压缩阻力的优先级为-1000(必需),所有这些都是:堆栈视图、标签等

你应该得到这样的东西:

或者,如果您希望使用分页进行水平滚动,只需添加:

section.orthogonalScrollingBehavior = .groupPaging
在布局创建时,您将看到如下内容:


享受:)

对我来说,解决问题的方法是为项目和组设置相同的高度尺寸

我知道问题的共享代码就是这样,@Que20的解决方案肯定有帮助。但是如果问题仍然存在,你可能需要检查一下


例子 我试图显示一个单元格,其中包含一个固定在单元格边距上的UIButton。该按钮具有44点高的高度约束

原始尝试
静态函数映射节()->NSCollectionLayoutSection{
让itemSize=NSCollectionLayoutSize(
宽度尺寸:。分数宽度(1),
heightDimension:。分数高度(1))//此处:项目的分数高度
let item=NSCollectionLayoutItem(layoutSize:itemSize)
设groupSize=NSCollectionLayoutSize(宽度维度:.SectilWidth(1),
heightDimension:。估计(100))//那里:按钮单元格的估计高度
let group=NSCollectionLayoutGroup.horizontal(layoutSize:groupSize,子项:[项])
let section=NSCollectionLayoutSection(组:组)
返回段
}
尽管所有配置都正确,但按钮的高度约束将被打破,“估计”将成为绝对值

成功实施
静态函数映射节()->NSCollectionLayoutSection{
/* 
请注意,我估计我的按钮单元有500点高
这太多了。但因为这是一个估计,我们做得很好,
这对最终结果并不重要。
*/
let heightDimension=NSCollectionLayoutDimension.估计值(500)
让itemSize=NSCollectionLayoutSize(
宽度尺寸:。分数宽度(1),
高度尺寸:高度尺寸)
let item=NSCollectionLayoutItem(layoutSize:itemSize)
设groupSize=NSCollectionLayoutSize(宽度维度:.SectilWidth(1),
高度尺寸:高度尺寸)
let group=NSCollectionLayoutGroup.horizontal(layoutSize:groupSize,子项:[项])
let section=NSCollectionLayoutSection(组:组)
返回段
}
唯一真正的区别在于项目和组都设置为相同的估计高度标注。但它现在起作用了


您可能需要收听通知
UIContentSizeCategory.didChangeNotification
以刷新页面。感谢您的评论。不幸的是,我不愿意在字体更改时得到通知,我正在尝试使UICollectionViewLayout足够灵活,不必担心辅助功能设置是否正常工作和显示。当您的约束条件完美时,更改
标签。text
可以自动刷新约束条件,但是更改系统字体当前不会自动刷新约束,很抱歉,我没有找到支持此参数的源。问题不是来自标签的约束,而是我给单元格的
估计高度。如果我错了,请告诉我,但我希望NSCollectionLayoutDimension对象中设置为高度的估计值与UICollectionViewFlowLayout.automaticSize的工作方式相同。就像你在这里所做的:
flowLayout.estimatedItemSize=UICollectionViewFlowLayout.automaticSize
哇,你永远不会猜到这一点,但它成功了。文档太少了。在iOS 14上非常有效!非常感谢,这很有效!我真不敢相信,在我做了这么多的胡闹之后,我不得不把我的物品从分数改成和小组一样的估计高度。非常感谢。