經(jīng)常遇到UI設(shè)計(jì)師設(shè)計(jì)出多個(gè)按鈕的布局效果,但是系統(tǒng)默認(rèn)的CollectionView布局總是不盡人意.例如這種標(biāo)簽式的控件,放到控制器上往往會(huì)變成了這樣
相信大部分人也用過此類控件,如果想讓標(biāo)簽左對(duì)齊,往往要寫很多代碼去自定義UICollectionViewLayout.我也遇到過這種問題,我在自定義UICollectionViewLayout后,發(fā)現(xiàn)在iOS9下,這種布局配合AutoLayout時(shí),reloadData后會(huì)導(dǎo)致Crash,改了很久未果.偶然發(fā)現(xiàn)了一個(gè)方法,簡(jiǎn)單快捷,使用到了UICollectionViewFlowLayout的私有方法,可以簡(jiǎn)單快捷的實(shí)現(xiàn)我要的效果.只需要加上幾行代碼即可.
下面這個(gè)方法是UICollectionViewFlowLayout的私有方法.下面來跟大家解釋一下options需要傳的參數(shù)
- (void)_setRowAlignmentsOptions:(NSDictionary *)options;
options根據(jù)runtime可以獲取到默認(rèn)key有3個(gè),其value為NSTextAlignment的NSNumber值:
UIFlowLayoutCommonRowHorizontalAlignmentKey? //水平對(duì)齊方式
UIFlowLayoutLastRowHorizontalAlignmentKey? ? ? ? ? //當(dāng)前行最后一個(gè)cell的對(duì)齊方式
UIFlowLayoutRowVerticalAlignmentKey? ? ? ? ? ? ? ? ? ? //垂直對(duì)齊方式
經(jīng)過試驗(yàn),前兩個(gè)key在scrollDirection為UICollectionViewScrollDirectionVertical時(shí)生效,最后一個(gè)在UICollectionViewScrollDirectionVertical模式下不生效.
UIFlowLayoutCommonRowHorizontalAlignmentKey默認(rèn)值為NSTextAlignmentJustified,意思就是水平分布,這就是為什么每行cell的間距都不一樣的罪魁禍?zhǔn)琢?/p>
UIFlowLayoutLastRowHorizontalAlignmentKey的默認(rèn)值為NSTextAlignmentCenter,意思就是最后一個(gè)cell居中對(duì)齊,這就是為什么一行只有一個(gè)cell的時(shí)候,這個(gè)cell都是居中的罪魁禍?zhǔn)琢?
當(dāng)我們改變了這兩個(gè)默認(rèn)值后
SEL sel = NSSelectorFromString(@"_setRowAlignmentsOptions:");
if ([self.collectionView.collectionViewLayout respondsToSelector:sel]) {
? ? ? ? ((void(*)(id,SEL,NSDictionary*))objc_msgSend)(self.collectionView.collectionViewLayout,sel,
? ? ? ? ? ? ? ? ? ? @{@"UIFlowLayoutCommonRowHorizontalAlignmentKey":@(NSTextAlignmentLeft),
? ? ? ? ? ? ? ? ? ? @"UIFlowLayoutLastRowHorizontalAlignmentKey" : @(NSTextAlignmentLeft),
? ? ? ? ? ? ? ? ? ? @"UIFlowLayoutRowVerticalAlignmentKey" : @(NSTextAlignmentCenter)});? ?
? }
我們看看效果
ok達(dá)到了我們的效果.
我們?cè)賮砜匆稽c(diǎn)好玩的.把UIFlowLayoutCommonRowHorizontalAlignmentKey的對(duì)齊方式改成right會(huì)怎樣呢?
ok了,key的釋義出來了,UIFlowLayoutCommonRowHorizontalAlignmentKey的對(duì)齊方式為right時(shí),如果UIFlowLayoutLastRowHorizontalAlignmentKey為left,那么一行只有一個(gè)cell時(shí),這個(gè)cell會(huì)左對(duì)齊.
注:此方法為UIKit框架下的公有類的私有方法,可以上架,經(jīng)過測(cè)試,可以適配從iOS 9至iOS 12的所有機(jī)型.對(duì)此方法還有不懂的地方,可以聯(lián)系我或者直接在下方留言,我看到會(huì)第一時(shí)間回復(fù)你們.
更新:
swift寫法
導(dǎo)入
Import ObjectiveC
collectionView.collectionViewLayout.perform(Selector.init(("_setRowAlignmentsOptions:")),with:NSDictionary.init(dictionary:["UIFlowLayoutCommonRowHorizontalAlignmentKey":NSNumber.init(value:NSTextAlignment.left.rawValue)]));