iOS 高效能異構滾動檢視構建方案 - LazyScrollView 詳細用法
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。
相關文章
- v$sql檢視和v$sqlarea檢視的構建SQL
- 構建微服務分散式雲架構詳細步驟微服務分散式架構
- Android 檢視架構詳解Android架構
- IOS橫線滾動檢視的實現---方式二iOS
- SGPagingView(iOS強大的標題滾動檢視)ViewiOS
- Xamarin iOS教程之進度條和滾動檢視iOS
- 拖拽滾動檢視(一)
- 重構:仔細檢視 改進程式碼
- iOS 自動構建命令——xcodebuildiOSXCodeUI
- Android Studio 檢視構建報告Android
- iOS多target下的自動構建iOS
- iOS 怎麼在滾動檢視上懸浮一個ViewiOSView
- 構建Spring Cloud微服務分散式雲架構詳細步驟SpringCloud微服務分散式架構
- 使用Gulp構建前端自動化解決方案前端
- iOS自動構建打包釋出指令碼iOS指令碼
- Oracle 物化檢視 詳細錯誤描述 檢視方法Oracle
- iOS架構詳解iOS架構
- WGCNA構建基因共表達網路詳細教程GC
- MVVM 模式下iOS專案目錄結構詳細說明MVVM模式iOS
- 檢視Oracle回滾段的詳細情況,以及對效能的影響 -- 轉Oracle
- 構建基於 iOS 模擬器的前端除錯方案iOS前端除錯
- iOS11人機互動指南-App結構-03模態檢視 ModalityiOSAPP
- 04-drf檢視層詳細
- ThinkPHP框架檢視詳細介紹View檢視–模板(九)PHP框架View
- 學習如何用 VIPER 構建iOS架構iOS架構
- 用 VIPER 構建 iOS 應用架構(2)iOS應用架構
- BlockUI詳細用法BloCUI
- 【MySQL】如何構建高效能MySQL系統MySql
- RAG 2.0架構詳解:構建端到端檢索增強生成系統架構
- OpenGL ES 框架詳細解析(三) —— 構建用於iOS的OpenGL ES應用程式的清單框架iOS
- SiriKit框架詳細解析(九) —— 構建Siri Shortcuts簡單示例(三)框架
- Apache Kylin1.5.2.1之訂單案例詳細構建流程Apache
- 建構函式詳解函式
- SpringMVC詳解(二)------詳細架構SpringMVC架構
- 無限滾動HTML UL結構HTML
- IOS 特定於裝置的開發:基於加速計的滾動檢視iOS
- Go構建遇到cgo動態庫時解決方案Go
- 用VIPER構建iOS應用iOS