ReusableNestingScrollview
ReusableNestingScrollview
是一个组件,用于解决滚动视图中的子视图全局重复使用和恢复的问题。与传统的类似解决方案不同,RNS
不需要继承特殊的 ScrollView,只需通过扩展 Delegate,从而使滚动视图(如 WKWebView、UIWebView 等)得到更广泛的支持,更通用和独立。
与 WKWebViewExtension 一起,组件用于服务 HybridPageKit,这是一个用于新闻应用内容页面的通用解决方案。
特性
-
无需继承,适用于所有滚动视图,如WebView
- 与传统组件实现方式不同,不需要继承特殊的 ScrollView,而是通过代理调用的方式,使得子视图滚动重复使用的功能可以应用于任何滚动视图。
- 支持所有滚动视图(UIScrollview、WKWebView、UIWebView 等)。
- 使用简单,只需使用 10+ 行关键函数代码即可完成 ScrollView 代理的基本逻辑。
-
更好的视图状态管理,灵活处理业务逻辑。
- 自定义工作范围区域,使子视图处于三种状态,更灵活地处理业务逻辑。
- 恢复池:子视图清除所有状态,进入全局恢复池。
- 准备区域:子视图在准备区域,用于懒加载、数据预取等业务。
- 显示区域:子视图在屏幕上显示,用于渲染和显示。
-
数据驱动,视图仅扮演渲染角色。
- 视图不保存数据信息,不保存框架信息,仅扮演渲染角色。
- 模型实现协议并参与所有逻辑,参与恢复和重用的计算。
-
全局重用和鲁棒性。
- 恢复池支持相同类型的视图重用,包括当前页面和跨页面。
- 自动回收失去 superView 的视图,防止内存泄漏。
- 线程安全,自定义恢复视图的数量。
- 恢复池支持相同类型的视图重用,包括当前页面和跨页面。
可重用嵌套滚动视图
可重用嵌套滚动视图
是一个解决滚动视图中子视图全局复用和回收问题的小组件。与传统的类似解决方案不同,RNS
无需继承特殊的ScrollView
,只需通过委托的方式扩展实现,从而更广泛地支持WKWebView
、UIWebView
等滚动视图,更加通用和独立。
与WKWebViewExtension配合使用,组件服务于HybridPageKit,一个资讯类内容底层页的完整通用组件。
功能
-
无需继承,适用于WebView等所有滚动视图
- 与传统的组件实现方式不同,无需继承特殊的
ScrollView
,通过代理分发的方式,使子视图滚动复用回收的功能能够应用到任何滚动视图中 - 支持所有滚动视图(
UIScrollView
、WKWebView
、UIWebView
等) - 使用简单,只需10+行关键函数代码即可完成
ScrollView
代理基本逻辑 - 使用场景示例:WebView展示简单内容,复杂业务逻辑使用NativeView,实现Hybrid的内容页面,并支持Native的滚动复用回收。
- 与传统的组件实现方式不同,无需继承特殊的
-
更加完善的区域和状态,灵活处理业务逻辑。
- 自定义添加WorkRange区域。子视图增加到三种状态,更灵活地处理业务逻辑
- 回收池:子视图清除状态,进入全局回收池。
- 准备区:子视图进入准备区,用于懒加载,数据预获取等逻辑。
- 展示区:子视图在屏幕中展示,用于渲染展示等逻辑。
- 使用场景示例:一张Gif图片,在准备区执行数据获取,不播放;在展示区进行播放;离开展示区进入准备区时不会立即回收但停止播放。
-
数据驱动,视图无状态,只负责渲染展示。
- 视图不保存数据信息,不保存frame信息,只负责渲染。
- 模型实现协议,参与全部的逻辑、复用回收计算等。
-
全局跨视图复用及容错保护。
- 全局视图回收池,支持同类型视图当前页面、跨页面复用回收。
- 自动回收失去父视图的视图,防止内存泄漏。
- 回收池线程安全,自定义回收视图阈值等。
#使用方法
只需三步,轻松实现
- 扩展视图相关联数据模型实现协议
@interface TestModel : NSObject <RNSModelProtocol>
-(NSString *)getUniqueId{
return _uniqueId;
}
-(void)setComponentFrame:(CGRect)frame{
_componentFrame = frame;
}
-(CGRect)getComponentFrame{
return _componentFrame;
}
-(Class)getComponentViewClass{
return _componentViewClass;
}
-(__kindof RNSComponentContext *)getCustomContext{
return nil;
}
- 扩展
ScrollView
委托
_handler = [[RNSHandler alloc]initWithScrollView:scrollView
externalScrollViewDelegate:self
scrollWorkRange:200.f
componentViewStateChangeBlock:^(RNSComponentViewState state,
NSObject<RNSModelProtocol> *componentItem, __kindof UIView *componentView) {
// 复用回收View状态变化处理
// 进入准备区 & 进入展示 & 离开展示 & 离开准备区
}];
- 增加、修改数据时重新加载数据
[_handler reloadComponentViewsWithProcessBlock:^(NSMutableDictionary<NSString *,NSObject<RNSModelProtocol> *> *componentItemDic) {
//修改、重新设置componentItemDic中model的origin
}];