iPhone X上的横向UICollectionView

Wes*_*gne 38 uikit ios uicollectionview ios11 iphone-x

当使用横向iPhone X时,您应该检查safeAreaInsets以在左侧和右侧制作适当大的水槽.UITableView具有新insetsContentViewsToSafeArea属性(默认为true),可自动将单元格内容保存在安全区域中.

我很惊讶UICollectionView似乎没有类似的东西.我希望对于垂直滚动的集合视图,左侧和右侧在横向时将插入安全区域(相反,如果需要纵向插入水平滚动的集合视图).

确保此行为的最简单方法似乎是添加到集合视图控制器:

- (void)viewSafeAreaInsetsDidChange {
    [super viewSafeAreaInsetsDidChange];
    UIEdgeInsets contentInset = self.collectionView.contentInset;
    contentInset.left = self.view.safeAreaInsets.left;
    contentInset.right = self.view.safeAreaInsets.right;
    self.collectionView.contentInset = contentInset;
}
Run Code Online (Sandbox Code Playgroud)

...假设contentInset.left/right通常为零.

(注意:是的,对于UICollectionViewController,需要self.view.safeAreaInsets;在调用此时,更改为safeAreaInsets奇怪尚未传播到self.collectionView)

我错过了什么吗?该样板很简单,但现在对于触及屏幕边缘的每个集合视图都是有效的.Apple默认情况下没有提供启用它的功能,这似乎很奇怪.

pet*_*syn 54

有同样的问题.这对我有用:

override func viewDidLoad() {
    if #available(iOS 11.0, *) {
        collectionView?.contentInsetAdjustmentBehavior = .always
    }
}
Run Code Online (Sandbox Code Playgroud)

文档.always枚举情况下,说:

始终在内容调整中包含安全区域插入.

在手机旋转的情况下,此解决方案也能正常工作.


Wes*_*gne 40

虽然Nathan对各种布局的UICollectionView的多功能性是正确的,但我主要关注的是"默认"情况,其中一个使用UICollectionViewFlowLayout.

事实证明,iOS 11已经添加了一个sectionInsetReference属性UICollectionViewFlowLayout.关于它的官方文档目前缺乏描述,但标题将其描述为

该部分插入的参考边界将被定义为相对于.默认为.fromContentInset.

注意:内容插入始终至少得到尊重.例如,如果sectionInsetReference等于.fromSafeArea,但调整后的内容插入大于安全区域和节插入的组合,则节内容将与内容插入对齐.

可能的值是

@available(iOS 11.0, *)
public enum UICollectionViewFlowLayoutSectionInsetReference : Int {
    case fromContentInset
    case fromSafeArea
    case fromLayoutMargins
}
Run Code Online (Sandbox Code Playgroud)

并将其设置为.fromSafeArea产生所需的结果,即最初以纵向方向时:

初始肖像布局

然后当旋转到横向时,细胞被插入,使得它们完全在安全区域内:

iPhone X横向集合视图布局

...但是,目前存在一个错误,当视图处于横向状态旋转回纵向时,它继续表现为好像左/右safeAreaInsets设置为横向值:

从景观旋转后的纵向布局

关于这个问题我已经提交了雷达(rdar:// 34491993).


ano*_*dev 8

感谢以上的帮助.对于我的UICollectionViewController子类,我将以下内容添加到viewDidLoad()(Swift 3):

if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
    if #available(iOS 11.0, *) {
        flowLayout.sectionInsetReference = .fromSafeArea
    }
}
Run Code Online (Sandbox Code Playgroud)