iOS中UICollectionView布局对齐⽅式的runtime实现
经常遇到UI设计师设计出多个按钮的布局效果,但是系统默认的CollectionView布局总是不尽⼈意.例如这种标签式的控件,放到控制器上往往会变成了这样
相信⼤部分⼈也⽤过此类控件,如果想让标签左对齐,往往要写很多代码去⾃定义UICollectionViewLayout.我也遇到过这种问题,我在⾃定义UICollectionViewLayout后,发现在iOS9下,这种布局配合AutoLayout时,reloadData后会导致Crash,改了很久未果.偶然发现了⼀个⽅法,简单快捷,使⽤到了UICollectionViewFlowLayout的私有⽅法,可以简单快捷的实现我要的效果.只需要加上⼏⾏代码即可.
下⾯这个⽅法是UICollectionViewFlowLayout的私有⽅法.下⾯来跟⼤家解释⼀下options需要传的参数
- (void)_setRowAlignmentsOptions:(NSDictionary *)options;
options根据runtime可以获取到默认key有3个,其value为NSTextAlignment的NSNumber值:
UIFlowLayoutCommonRowHorizontalAlignmentKey //⽔平对齐⽅式
UIFlowLayoutLastRowHorizontalAlignmentKey //当前⾏最后⼀个cell的对齐⽅式
UIFlowLayoutRowVerticalAlignmentKey //垂直对齐⽅式
经过试验,前两个key在scrollDirection为UICollectionViewScrollDirectionVertical时⽣效,最后⼀个在UICollectionViewScrollDirectionVertical模式下不⽣效.
UIFlowLayoutCommonRowHorizontalAlignmentKey默认值为NSTextAlignmentJustified,意思就是⽔平分布,这就是为什么每⾏cell的间距都不⼀样的罪魁祸⾸了
UIFlowLayoutLastRowHorizontalAlignmentKey的默认值为NSTextAlignmentCenter,意思就是最后⼀个cell居中对齐,这就是为什么⼀⾏只有⼀个cell的时候,这个cell都是居中的罪魁祸⾸了.
当我们改变了这两个默认值后
SEL sel = NSSelectorFromString(@"_setRowAlignmentsOptions:");
if ([llectionViewLayout respondsToSelector:sel]) {
((void(*)(id,SEL,NSDictionary*))objc_msgSend)(llectionViewLayout,sel,
@{@"UIFlowLayoutCommonRowHorizontalAlignmentKey":@(NSTextAlignmentLeft),
@"UIFlowLayoutLastRowHorizontalAlignmentKey" : @(NSTextAlignmentLeft),
@"UIFlowLayoutRowVerticalAlignmentKey" : @(NSTextAlignmentCenter)});
}
我们看看效果
ok达到了我们的效果.
我们再来看⼀点好玩的.把UIFlowLayoutCommonRowHorizontalAlignmentKey的对齐⽅式改成right会怎样呢?
ok了,key的释义出来了,UIFlowLayoutCommonRowHorizontalAlignmentKey的对齐⽅式为right时,如果UIFlowLayoutLastRowHorizontalAlignmentKey为left,那么⼀⾏只有⼀个cell时,这个cell会左对齐.
注:此⽅法为UIKit框架下的公有类的私有⽅法,可以上架,经过测试,可以适配从iOS 9⾄iOS 12的所有机型.对此⽅法还有不懂的地⽅,可以联系我或者直接在下⽅留⾔,我看到会第⼀时间回复你们.
text align center更新:
swift写法
导⼊
Import ObjectiveC
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论