UICollectionView的高度自適應(yīng) / UICollectionViewCell只有一個居中顯示

UICollectionView的高度自適應(yīng)的原理:

  1. CollectionView根據(jù) layout 的 estimatedItemSize 算出估計的 contentSize谒出,有了 contentSize CollectionView就開始顯示
  2. CollectionView 在顯示的過程中傻唾,即將被顯示的 cell 根據(jù) autolayout 的約束算出自適應(yīng)內(nèi)容的 size
  3. layout 從 CollectionView 里獲取更新過的 size attribute
  4. layout 返回最終的 size attribute 給 CollectionView
  5. CollectionView 使用這個最終的 size attribute 展示 cell

UICollectionView的高度自適應(yīng)的實現(xiàn):

1. 設(shè)置 estimatdItemSize

設(shè)置 UICollectionViewFlowLayout 的 estimatdItemSize 的預(yù)估高度;
estimatdItemSize 的默認值為 CGSizeZero ,所以要給一個非0值開啟高度估算;

RBEN_RestaurantDetailFlowLayout *flowLayout = [[RBEN_RestaurantDetailFlowLayout alloc] init];

flowLayout.estimatedItemSize = CGSizeMake(SCREEN_WIDTH, 200);

2. 對cell 進行約束添加

  • 使用Masonry設(shè)置cell的約束
  • 在自定義的UICollectionViewCell中重寫- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes函數(shù)
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
    [self setNeedsLayout];
    [self layoutIfNeeded];
    CGSize size = [self systemLayoutSizeFittingSize:layoutAttributes.size];
    CGRect cellFrame = layoutAttributes.frame;
    cellFrame.size.height = size.height;
    theItemModel.cellHeight = size.height;//記錄下來自適應(yīng)計算出來的高度
    layoutAttributes.frame = cellFrame;
    return layoutAttributes;
}

3. 在UICollectionViewDelegateFlowLayout中返回對應(yīng)cell的高度


- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
     theItemModel.cellHeight
}

??collectionview自適應(yīng)的注意項

  1. 只有在屏幕范圍內(nèi)的才能準確估算出cell的高度;
    如果你的uicollectionview需要自動滾動到某個cell,這個時候由于cell沒有在屏幕上停留,而是迅速滾動到指定cell,這個時候計算出的滾動位置不準確
  2. 自適應(yīng)放在header上不好用,首次不會執(zhí)行preferredLayoutAttributesFittingAttributes該函數(shù),必須滾動一下才會執(zhí)行,因此如果你要用collectionview自適應(yīng)高度,盡量使用collectionViewCell不要用使用頭

UICollectionViewCell,寬度不是屏幕寬度的時候, 只有一個的時候居中顯示問題

  • 方案一:自定義UICollectionViewFlowLayout布局中實現(xiàn)下面函數(shù)

這個方案調(diào)用了“_setRowAlignmentsOptions”私有函數(shù),測試過了,不會被蘋果審核拒絕

- (instancetype)init {
    self = [super init];
    if (self) {
        // 解決collectionview2行的時候,只有一個item的時候,默認居中,而不是居左顯示的問題
        SEL sel = NSSelectorFromString(@"_setRowAlignmentsOptions:");
        if ([self respondsToSelector:sel]) {
            ((void (*)(id, SEL, NSDictionary *))objc_msgSend)(self, sel,
                                                              @{ @"UIFlowLayoutCommonRowHorizontalAlignmentKey" : @(NSTextAlignmentLeft),
                                                                 @"UIFlowLayoutLastRowHorizontalAlignmentKey" : @(NSTextAlignmentLeft),
                                                                 @"UIFlowLayoutRowVerticalAlignmentKey" : @(NSTextAlignmentCenter) });
        }
    }
    return self;
}

方案二: 通過設(shè)置UIEdgeInsets使其一屏幕只能顯示下一個UICollectionViewCell

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    if (theItemModel.goodsArray.count == 1) {
            return UIEdgeInsetsMake(0, RB_WIDTH(15), 0, collectionView.frame.size.width - RB_WIDTH(167));   // 167是我的固定cell寬
        } else {
            return UIEdgeInsetsMake(0, RB_WIDTH(15), 0, RB_WIDTH(15));
        }
}

參考文章:http://www.reibang.com/p/2172085f7240

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捌浩,隨后出現(xiàn)的幾起案子绊茧,更是在濱河造成了極大的恐慌刀荒,老刑警劉巖明肮,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異簸州,居然都是意外死亡,警方通過查閱死者的電腦和手機歧譬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門岸浑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑰步,你說我怎么就攤上這事矢洲。” “怎么了缩焦?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵读虏,是天一觀的道長。 經(jīng)常有香客問我袁滥,道長盖桥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任题翻,我火速辦了婚禮揩徊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己塑荒,他們只是感情好熄赡,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齿税,像睡著了一般彼硫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凌箕,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天拧篮,我揣著相機與錄音,去河邊找鬼陌知。 笑死他托,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仆葡。 我是一名探鬼主播赏参,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沿盅!你這毒婦竟也來了把篓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤腰涧,失蹤者是張志新(化名)和其女友劉穎韧掩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窖铡,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡疗锐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了费彼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滑臊。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖箍铲,靈堂內(nèi)的尸體忽然破棺而出雇卷,到底是詐尸還是另有隱情,我是刑警寧澤颠猴,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布关划,位于F島的核電站,受9級特大地震影響翘瓮,放射性物質(zhì)發(fā)生泄漏贮折。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一春畔、第九天 我趴在偏房一處隱蔽的房頂上張望脱货。 院中可真熱鬧岛都,春花似錦、人聲如沸振峻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扣孟。三九已至烫堤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凤价,已是汗流浹背鸽斟。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留利诺,地道東北人富蓄。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像慢逾,于是被迫代替她去往敵國和親立倍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容