iOS UITableViewCell 性能優(yōu)化

每一個有使用列表 App 都會用到 UITableViewUICollectionView探越,這就意味著也會用到 UITableViewCellUICollectionViewCell向叉。因為 UITableViewUICollectionView 不是靜止不動的挚歧,在與用戶交互過程中假哎,需要通過不斷地滾動來更新數(shù)據(jù),而更新數(shù)據(jù)的展示就需要通過更新 UITableViewCellUICollectionViewCell 的展示數(shù)據(jù)险绘。

UITableViewCell 為例换可,UITableViewCell 自帶一個 UIImageView 和兩個 UILabel,但是這些控件的布局是由 UITableViewCellStyle 決定的奠旺,使用 setFrame: 也是沒有效果蜘澜。顯然只有這三個控件和固定的幾種樣式,是滿足不了大多數(shù)產(chǎn)品需求和美工設(shè)計的响疚。這個時候鄙信,我們就會想到使用復合視圖的方式來實現(xiàn)設(shè)計需求,即在 UITableViewCell 的基礎(chǔ)上添加新的視圖控件忿晕。

然而装诡,使用復合視圖并不是一個好的方案,這就意味著將增加了視圖層次結(jié)構(gòu)的嵌套層次。雖然視圖層次的多層嵌套是難免的鸦采,也是必要的宾巍,但是深層次的嵌套結(jié)構(gòu)勢必影響性能。因為當父視圖更新布局時渔伯,就會觸發(fā) setNeedsLayout: 方法顶霞,而當這個方法被觸發(fā)時也會觸發(fā) layoutSubviews: 方法去更新所有子視圖的布局。所以我們應當避免在視圖層次結(jié)構(gòu)中多層嵌套咱旱,盡量保持扁平化确丢。

那么問題來了,不用復合視圖要怎么解決復雜的列表設(shè)計呢吐限?
那就在一個視圖控件上實現(xiàn)要多個視圖控件才能做到的事情鲜侥。我們使用重寫 UIViewdrawRect: 方法來自定義渲染元素,將需要顯示的圖片和文字直接繪制到一張視圖上诸典。

自定義 UITableViewCell 的頭文件 ImproveTableViewCell.h

/**
 繪制 cell
 */
@interface ImproveTableViewCell : UITableViewCell

/**
 標題
 */
@property (nonatomic, copy) NSString *strTitle;

/**
 圖片組
 */
@property (nonatomic, copy) NSArray<NSString *> *arrImage;

/**
 日期
 */
@property (nonatomic, copy) NSString *strDate;

@end

實現(xiàn)文件 ImproveTableViewCell.m :


@implementation ImproveTableViewCell


/**
 重寫視圖方法繪制

 @param rect 坐標大小
 */
- (void)drawRect:(CGRect)rect {
 
    // 屏幕寬
    CGFloat fScreenWidth = [[UIScreen mainScreen] bounds].size.width;
    // 文本屬性
    NSDictionary *dicAttribute;
    
    // 標題
    dicAttribute = @{NSFontAttributeName: [UIFont systemFontOfSize:14], NSForegroundColorAttributeName: [UIColor colorWithWhite:0.2 alpha:1.0]};
    [self.strTitle drawInRect:CGRectMake(10, 10, fScreenWidth - 20, 20) withAttributes:dicAttribute];
    
    // 圖片組
    // 圖片寬
    CGFloat fImageWidth = (fScreenWidth - 40)/3;
    for (int i = 0; i < 3; i++) {
        
        UIImage *imgPicture = [UIImage imageNamed:self.arrImage[i]];
        [imgPicture drawInRect:CGRectMake(10 + i * (fImageWidth + 10), 40, fImageWidth, fImageWidth * 3/4)];
    }
    
    // 日期
    dicAttribute = @{NSFontAttributeName: [UIFont systemFontOfSize:13], NSForegroundColorAttributeName: [UIColor colorWithWhite:0.6 alpha:1.0]};
    [self.strDate drawInRect:CGRectMake(10, 45 + fImageWidth * 3/4, fScreenWidth - 20, 20) withAttributes:dicAttribute];
    
    // 分割線
    [[UIColor colorWithWhite:0.9 alpha:1.0] set];
    UIRectFill(CGRectMake(0, 65 + fImageWidth * 3/4, fScreenWidth, 5));
}

@end

UITableViewDelegateUITableViewDataSource 的方法實現(xiàn):

- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    
    ImproveTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:gDrawID];
    if (cell == nil) {
        
        cell = [[ImproveTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:gDrawID];
        
    }
    cell.strTitle = indexPath.row%2 ? @"蠟筆小新--lol船長" : @"葛力姆喬·賈卡杰克";
    cell.arrImage = indexPath.row%2 ? @[@"test1", @"test2", @"test1"] : @[@"test2", @"test1", @"test2"];
    cell.strDate = indexPath.row%2 ? @"2018-03-30 大傻逼" : @"2018-03-31 小傻逼";
        
    // 更新渲染
    [cell setNeedsDisplay];
    
    return cell;
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    
    return 100;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    return ([[UIScreen mainScreen] bounds].size.width - 40)/4 + 70;
}

結(jié)果截圖:


結(jié)果截圖@2x.png

參考資料:《高性能 iOS 應用開發(fā)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末描函,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狐粱,更是在濱河造成了極大的恐慌舀寓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肌蜻,死亡現(xiàn)場離奇詭異互墓,居然都是意外死亡,警方通過查閱死者的電腦和手機蒋搜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門篡撵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豆挽,你說我怎么就攤上這事育谬。” “怎么了帮哈?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵膛檀,是天一觀的道長。 經(jīng)常有香客問我娘侍,道長咖刃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任私蕾,我火速辦了婚禮僵缺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踩叭。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布容贝。 她就那樣靜靜地躺著自脯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斤富。 梳的紋絲不亂的頭發(fā)上膏潮,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音满力,去河邊找鬼焕参。 笑死,一個胖子當著我的面吹牛油额,可吹牛的內(nèi)容都是我干的叠纷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼潦嘶,長吁一口氣:“原來是場噩夢啊……” “哼涩嚣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掂僵,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤航厚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锰蓬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幔睬,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年芹扭,在試婚紗的時候發(fā)現(xiàn)自己被綠了麻顶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡冯勉,死狀恐怖澈蚌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灼狰,我是刑警寧澤宛瞄,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站交胚,受9級特大地震影響份汗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝴簇,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一杯活、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熬词,春花似錦旁钧、人聲如沸吸重。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚎幸。三九已至,卻和暖如春寄猩,著一層夾襖步出監(jiān)牢的瞬間嫉晶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工田篇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留替废,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓泊柬,卻偏偏與公主長得像椎镣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子彬呻,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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