iOS小經(jīng)驗·Masonry布局時因不熟悉Cell生命周期而導(dǎo)致死循環(huán)

本文屬 iOS小經(jīng)驗系列:累積平時看起來簡單,容易忽視的邊邊角角,各路大佬敬請回避。

設(shè)置UICollectionView的footer的時候,可能有新的小伙伴這樣寫:

問題代碼:

  • 頭文件
#import <UIKit/UIKit.h>

@interface DownloadCollectionFooter : UICollectionReusableView

/** 標(biāo)題 */
@property (nonatomic,strong) UIButton * footerBtn;
/** 內(nèi)存 */
@property (nonatomic,strong) NSString * footerStr;

@end
  • 實現(xiàn)文件
#import "DownloadCollectionFooter.h"
#import "Masonry.h"
@implementation DownloadCollectionFooter

- (instancetype)init
{
    self = [super init];
    if (self) {
         //...
    }
    return self;
}

- (void)layoutSubviews{
    
    [super layoutSubviews];
    _footerBtn = [[UIButton alloc]init];
    [_footerBtn setTitle:@"下載" forState:UIControlStateNormal];
    _footerBtn.titleLabel.font = [UIFont systemFontOfSize:15];
    [self addSubview:_footerBtn];
    
    [_footerBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.mas_left).offset(25);
        make.right.equalTo(self.mas_right).offset(-25);
        make.top.equalTo(self.mas_top).offset(7);
        make.height.mas_equalTo(@36);
    }];
}

問題描述

導(dǎo)致死循環(huán)地執(zhí)行layoutSubviews代碼。

問題原因

這是因為,通過Masonry設(shè)置約束之前的那個addSubview,會導(dǎo)致layoutSubviews再次執(zhí)行。那么,如果你在layoutSubviews中設(shè)置addSubview,就導(dǎo)致死循環(huán)了。

解決方案

  • 在初始化的時候設(shè)置Masonry。例如下面初始化的時候調(diào)用自定義的initSubViews,然后把原來寫在layoutSubviews的問題代碼寫在initSubViews中去。
-(instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        [self initSubViews];
    }
    return self;
}

如果你堅持想在layoutSubviews寫布局代碼,仍然可以,也有個方案:

  • 把addSubview寫在初始化方法里面,或者寫在子控件的懶加載里面,然后在layoutSubviews的方法里面再用Masonry設(shè)置布局約束。

  • 或者,改用frame和bounds等絕對布局方式,addSubview之后,再用絕對布局,并不會 導(dǎo)致layoutSubviews再次執(zhí)行,例如。

- (void)layoutSubviews{
    
    [super layoutSubviews];
    
    _titleLabel = [[UILabel alloc]init];
    [self addSubview:_titleLabel];
    _titleLabel.frame = CGRectMake(0, 7, SCREEN_WIDTH, 24);
    _titleLabel.centerX = self.centerX;
    _titleLabel.text = @"緩存";
    //等等
}

實驗結(jié)論

  • layoutSubviews 里面進行 addSubview操作,且通過 Masonry 設(shè)置布局,就 導(dǎo)致死循環(huán)地執(zhí)行 layoutSubviews。

  • layoutSubviews 里面進行 addSubview操作,且通過 絕對布局 設(shè)置布局,并不會 導(dǎo)致死循環(huán)地執(zhí)行 layoutSubviews。

  • layoutSubviews 里面 進行 addSubview操作,且通過 Masonry 設(shè)置布局,并不會 導(dǎo)致死循環(huán)地執(zhí)行 layoutSubviews。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,222評論 3 119
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,271評論 8 265
  • 與弟妹電話 今晚電話回家,接電話是華弟。我問一些家里情況云云后,問他說吉他指法之事,從他回答便知此前只是有此興趣,...
    MarsMark閱讀 284評論 0 2
  • 好久沒有在深夜哭過了 仿佛越是靜 夜越深 情感就越細(xì)膩 我可以確定 我已經(jīng)不喜歡你了 但或許是你是我到目前為止最愛...
    愛小白3閱讀 366評論 0 1

友情鏈接更多精彩內(nèi)容