Ios 估计高度不工作的集合视图合成布局
我希望我的应用程序能够针对每个可访问性选项(包括文本大小)进行优化 我根据具有合成布局的部分制作了collectionView布局。所以我需要我的细胞的高度和它的内容一起增长。我认为使用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
.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上非常有效!非常感谢,这很有效!我真不敢相信,在我做了这么多的胡闹之后,我不得不把我的物品从分数改成和小组一样的估计高度。非常感谢。