iOS 高效能異構滾動檢視構建方案 - LazyScrollView 詳細用法

weixin_34337265發表於2017-06-02

1、建立檢視

TMMuiLazyScrollView *scrollview = [[TMMuiLazyScrollView alloc]init];
scrollview.frame = self.view.bounds;
scrollview.dataSource = self;    
[self.view addSubview:scrollview];

和正常的ScrollView一樣init即可,只需要注意一點的是,需要有一個實現 TMMuiLazyScrollViewDataSource 的類,賦給LazyScrollView的 dataSource

2、實現 TMMuiLazyScrollViewDataSource

  • 返回View個數
- (NSUInteger)numberOfItemInScrollView:(TMMuiLazyScrollView *)scrollView

這裡需要返回view的個數,決定返回多少個rectModel

  • 返回RectModel
- (TMMuiRectModel *)scrollView:(TMMuiLazyScrollView *)scrollView rectModelAtIndex:(NSUInteger)index

根據index返回TMMuiRectModel

TMMuiRectModel有兩個屬性,一個是muiID,它是View的唯一識別符號, 另一個是absoluteRect,是對應的View在LazyScrollView內的絕對座標

  • 按需返回檢視
- (UIView *)scrollView:(TMMuiLazyScrollView *)scrollView itemByMuiID:(NSString *)muiID

這個方法在需要生成即將進入螢幕的檢視的時候,會被LazyScrollView按需呼叫 muiID就是rectModel的muiID,可以根據muiID生成相關的View

這裡一般會先去找複用的檢視,沒有再做生成

Demo中這個方法內部的寫法是:

LazyScrollViewCustomView *label = (LazyScrollViewCustomView *)[scrollView dequeueReusableItemWithIdentifier:@"testView"];
NSInteger index = [muiID integerValue];
if (!label) {
    label = [[LazyScrollViewCustomView alloc]initWithFrame:[(NSValue *)[rectArray objectAtIndex:index]CGRectValue]];
    label.textAlignment = NSTextAlignmentCenter;
    label.reuseIdentifier = @"testView";
}
label.frame = [(NSValue *)[rectArray objectAtIndex:index]CGRectValue];
label.text = [NSString stringWithFormat:@"%lu",(unsigned long)index];

流程是:先取一下複用池中可複用的View,有的話,賦給對應的frame,沒有的話,生成一個,並給予一個複用標記。

在 LazyScrollView 中宣告的一個對UIView 的 category 中包含了 reuseIdentifier,可以給任意的View繫結這個屬性。如果沒有賦值reuseIdentifier或者給一個nil/空字串,會認為這個元件不復用。

3、重新整理檢視

設定一下contentSize , 並且Reload一下即可。

scrollview.contentSize = CGSizeMake(CGRectGetWidth(self.view.bounds), 1230);
[scrollview reloadData];

4、檢視生命週期

Demo中的 LazyScrollViewCustomView 實現了
TMMuiLazyScrollViewCellProtocol 的三個方法,可以在元件的生命週期的時候執行相關程式碼。

- (void)mui_prepareForReuse

在即將被複用時呼叫,通常用於清空View內展示的資料。類似與UITableViewCell 的 prepareForReuse

- (void)mui_didEnterWithTimes:(NSUInteger)times

進入螢幕LazyScroll可視範圍內時執行,times是進入可視範圍的次數,從0開始。重置times可以呼叫LazyScrollView的resetViewEnterTimes 重置times

- (void)mui_afterGetView

LazyScroll獲取到View後執行。也就是執行完 - (UIView *)scrollView:(TMMuiLazyScrollView *)scrollView itemByMuiID:(NSString *)muiID
方法獲取到檢視之後。

和didEnterWithTimes的區別是,因為LazyScrollView有一個RenderBuffer的概念,實際渲染的檢視比可視範圍上下各增加了20個畫素,使得展示更加流暢。afterGetView會執行的更早。

後續:

LazyScrollView 屬於相對底層的檢視層,在複用上提供的比較高的靈活度。一些更高程度的封裝,比如類似UICollection的Layout,對複用更簡易的管理,對元件的解析、賦值等管理,我們都放在了Tangram裡面,關於Tangram 可見 蘋果核 - 頁面動態化的基礎 —— Tangram

轉載出處:蘋果核 - iOS 高效能異構滾動檢視構建方案 - LazyScrollView 詳細用法

相關文章