一个UICollectionView的布局问题,不常见, 记录一下解决方案。
一个collectionView, 设置了item的UIEdgeInsets 之后, 只有一个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)});
}
代码添加位置: