ReusableNestingScrollview 0.1

ReusableNestingScrollview 0.1

dequanzhu维护。



  • dequanzhu

ReusableNestingScrollview

ReusableNestingScrollview 是一个组件,用于解决滚动视图中的子视图全局重复使用和恢复的问题。与传统的类似解决方案不同,RNS 不需要继承特殊的 ScrollView,只需通过扩展 Delegate,从而使滚动视图(如 WKWebView、UIWebView 等)得到更广泛的支持,更通用和独立。

WKWebViewExtension 一起,组件用于服务 HybridPageKit,这是一个用于新闻应用内容页面的通用解决方案。

特性

  1. 无需继承,适用于所有滚动视图,如WebView

    • 与传统组件实现方式不同,不需要继承特殊的 ScrollView,而是通过代理调用的方式,使得子视图滚动重复使用的功能可以应用于任何滚动视图。
    • 支持所有滚动视图(UIScrollview、WKWebView、UIWebView 等)。
    • 使用简单,只需使用 10+ 行关键函数代码即可完成 ScrollView 代理的基本逻辑。
  2. 更好的视图状态管理,灵活处理业务逻辑。

    • 自定义工作范围区域,使子视图处于三种状态,更灵活地处理业务逻辑。
    • 恢复池:子视图清除所有状态,进入全局恢复池。
    • 准备区域:子视图在准备区域,用于懒加载、数据预取等业务。
    • 显示区域:子视图在屏幕上显示,用于渲染和显示。
  3. 数据驱动,视图仅扮演渲染角色。

    • 视图不保存数据信息,不保存框架信息,仅扮演渲染角色。
    • 模型实现协议并参与所有逻辑,参与恢复和重用的计算。
  4. 全局重用和鲁棒性。

    • 恢复池支持相同类型的视图重用,包括当前页面和跨页面。
      • 自动回收失去 superView 的视图,防止内存泄漏。
      • 线程安全,自定义恢复视图的数量。

可重用嵌套滚动视图

可重用嵌套滚动视图是一个解决滚动视图中子视图全局复用和回收问题的小组件。与传统的类似解决方案不同,RNS无需继承特殊的ScrollView,只需通过委托的方式扩展实现,从而更广泛地支持WKWebViewUIWebView等滚动视图,更加通用和独立。

WKWebViewExtension配合使用,组件服务于HybridPageKit,一个资讯类内容底层页的完整通用组件。

功能

  1. 无需继承,适用于WebView等所有滚动视图

    • 与传统的组件实现方式不同,无需继承特殊的ScrollView,通过代理分发的方式,使子视图滚动复用回收的功能能够应用到任何滚动视图中
    • 支持所有滚动视图(UIScrollViewWKWebViewUIWebView等)
    • 使用简单,只需10+行关键函数代码即可完成ScrollView代理基本逻辑
    • 使用场景示例:WebView展示简单内容,复杂业务逻辑使用NativeView,实现Hybrid的内容页面,并支持Native的滚动复用回收。
  2. 更加完善的区域和状态,灵活处理业务逻辑。

    • 自定义添加WorkRange区域。子视图增加到三种状态,更灵活地处理业务逻辑
    • 回收池:子视图清除状态,进入全局回收池。
    • 准备区:子视图进入准备区,用于懒加载,数据预获取等逻辑。
    • 展示区:子视图在屏幕中展示,用于渲染展示等逻辑。
    • 使用场景示例:一张Gif图片,在准备区执行数据获取,不播放;在展示区进行播放;离开展示区进入准备区时不会立即回收但停止播放。
  3. 数据驱动,视图无状态,只负责渲染展示。

    • 视图不保存数据信息,不保存frame信息,只负责渲染。
    • 模型实现协议,参与全部的逻辑、复用回收计算等。
  4. 全局跨视图复用及容错保护。

    • 全局视图回收池,支持同类型视图当前页面、跨页面复用回收。
    • 自动回收失去父视图的视图,防止内存泄漏。
    • 回收池线程安全,自定义回收视图阈值等。

#使用方法

只需三步,轻松实现

  1. 扩展视图相关联数据模型实现协议
@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;
}
  1. 扩展ScrollView委托
_handler = [[RNSHandler alloc]initWithScrollView:scrollView
                      externalScrollViewDelegate:self 
                        scrollWorkRange:200.f 
                        componentViewStateChangeBlock:^(RNSComponentViewState state, 
                        NSObject<RNSModelProtocol> *componentItem, __kindof UIView *componentView) {
    
    // 复用回收View状态变化处理
    // 进入准备区 & 进入展示 & 离开展示 & 离开准备区
}];
  1. 增加、修改数据时重新加载数据
[_handler reloadComponentViewsWithProcessBlock:^(NSMutableDictionary<NSString *,NSObject<RNSModelProtocol> *> *componentItemDic) {        
	
	//修改、重新设置componentItemDic中model的origin
}];