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

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

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

多个item时布局显示正常
一个item时布局显示居中

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


上网搜了下: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)});
        }
运行效果

代码添加位置:


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

你可能感兴趣的:(【iOS开发】UICollectionView 只有一个item时,item居中的解决方法)