【发布时间】:2021-04-19 10:59:21
【问题描述】:
我正在尝试模仿当前快捷方式应用程序 UICollectionView 的行为,其中项目的默认显示是 2 列布局,但根据字体大小,它会变为单列,单元格占据完整集合视图的宽度。
我正在将动态类型添加到我的单元格标签中,如果用户转到手机辅助功能并增加字体大小,我的标签也会增加,但现在标签字体会增加,但单元格只会增加高度和我的收藏视图最终成为两列具有非常高的单元格。
我目前正在使用没有任何自定义的基本流布局。我没有可以分享的有效或好的代码,但我正在寻找有关完成此任务的最佳方法的建议。
我的目标是 iOS 14,并使用 swift 5。
编辑 感谢 Witek 的回答,我能够使用 UICollectionViewCompositionalLayout 非常轻松地完成此操作,而且我什至不必订阅更改,只需在我的布局中查询 traitCollection 就足够了。这是我的最终结果:
private func createCompositionalLayout() -> UICollectionViewLayout {
let layout = UICollectionViewCompositionalLayout { (sectionIndex: Int,
layoutEnvironment: NSCollectionLayoutEnvironment) -> NSCollectionLayoutSection? in
let columns = self.traitCollection.preferredContentSizeCategory.isAccessibilityCategory ? 1 : 2
// Define Item Size
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0))
// Create Item
let item = NSCollectionLayoutItem(layoutSize: itemSize)
// Define Group Size
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(150.0))
// Create Group
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: columns)
group.interItemSpacing = .fixed(10.0)
// Create Section
let section = NSCollectionLayoutSection(group: group)
// Configure Section
section.contentInsets = NSDirectionalEdgeInsets(top: 10.0, leading: 10.0, bottom: 10.0, trailing: 10.0)
section.interGroupSpacing = 10
return section
}
return layout
}
【问题讨论】:
-
你想使用 UIKit 吗?
-
我认为您刚刚提到最好的选择是使用自定义流布局,因为您需要预先计算文本的宽度,然后您决定布局单元格(如果您使用默认值)流布局,做同样的事情你会得到一个错误的解决方案。
-
@Abuzeid Shortcuts 应用基于
UIContentSizeCategory对象上的isAccessibilityCategory属性进行布局,而不是文本的宽度。
标签: ios swift uicollectionview accessibility dynamic-type-feature