【iOS开发】UICollectionView 只有一个item时,item居中的解决方法

时间:2021-7-21 作者:qvyue

一个UICollectionView的布局问题,不常见, 记录一下解决方案。

一个collectionView, 设置了item的UIEdgeInsets 之后, 只有一个item时,该item居中显示了,但是有多个item时,显示正常:

【iOS开发】UICollectionView 只有一个item时,item居中的解决方法
多个item时布局显示正常
【iOS开发】UICollectionView 只有一个item时,item居中的解决方法
一个item时布局显示居中

检查了代码后, 该设置的行间距,列间距, 以及UIEdgeInsets 都正常:

【iOS开发】UICollectionView 只有一个item时,item居中的解决方法
【iOS开发】UICollectionView 只有一个item时,item居中的解决方法

上网搜了下:UICollectionViewFlowLayout有个私有方法:- (void)_setRowAlignmentsOptions:(NSDictionary *)options;

该方法中的options,有3个默认的key:

UIFlowLayoutCommonRowHorizontalAlignmentKey  //水平对齐方式
UIFlowLayoutLastRowHorizontalAlignmentKey    //当前行最后一个cell的对齐方式
UIFlowLayoutRowVerticalAlignmentKey         //垂直对齐方式

这3个key的值为NSTextAlignment的值

UIFlowLayoutCommonRowHorizontalAlignmentKey默认值为NSTextAlignmentJustified,意思就是水平分布。

所以当UICollectionView 的布局方向为 UICollectionViewScrollDirectionVertical时, 只有一个item, 就会水平居中显示。

解决方法:

使用runtime改变默认值:

   SEL sel = NSSelectorFromString(@"_setRowAlignmentsOptions:");
        if ([layout respondsToSelector:sel]) {
            ((void(*)(id,SEL,NSDictionary*)) objc_msgSend)(layout,sel, @{@"UIFlowLayoutCommonRowHorizontalAlignmentKey":@(NSTextAlignmentLeft),@"UIFlowLayoutLastRowHorizontalAlignmentKey" : @(NSTextAlignmentLeft),@"UIFlowLayoutRowVerticalAlignmentKey" : @(NSTextAlignmentCenter)});
        }
【iOS开发】UICollectionView 只有一个item时,item居中的解决方法
运行效果

代码添加位置:

【iOS开发】UICollectionView 只有一个item时,item居中的解决方法

参考文档:
https://www.jianshu.com/p/de08c2679241

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。