【问题标题】:UICollectionView autosize cell with dynamic number of columns using AccessibilityUICollectionView 使用辅助功能自动调整具有动态列数的单元格
【发布时间】: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


【解决方案1】:

您可以观察UIContentSizeCategory.didChangeNotification,并根据通知中传递的newValueUserInfoKey 值更改列数(单元格大小)。

@objc private func sizeCategoryDidChange() {
    collectionView.reloadData()
}
NotificationCenter.default.addObserver(
    self, selector: #selector(sizeCategoryDidChange),
    name: UIContentSizeCategory.didChangeNotification, object: nil
)

首选的内容大小类别也可以从UIApplication.shared轻松检索

let contentSizeCategory = UIApplication.shared.preferredContentSizeCategory

看起来 Shortcuts 应用根据 isAccessibilityCategory 属性进行布局以确定当前内容类别是否是可访问性类别之一

let cellWidth: CGFloat
let padding: CGFloat = 16
if contentSizeCategory.isAccessibilityCategory {
    // single column, full width with padding
    cellWidth = collectionView.bounds.width - (padding * 2)
} else {
    // double column, half width with padding
    cellWidth = (collectionView.bounds.width - (padding * 3)) / 2 
}

文档:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2018-03-07
    • 2021-06-01
    • 2020-04-29
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多