SPScrollPageView 0.0.6

SPScrollPageView 0.0.6

Tr2e 维护。



  • Tr2e

SPScrollPageView

Version license

SPScrollPageView

掘金 简书 博客

作用

  • 使横向页面切换更加流畅,解决非相邻页面切换时快速滚动的问题
  • 避免非相邻页面动画切换时创建非目标页面视图造成的性能损耗
  • 可以直接设置初始化的目标位置
  • 支持无动画的直接页面切换

pod 0.0.5 更新

  • 增加页面刷新相关方法,详情请查看 如何使用

跳转

拖动

如何使用

  • 使用快速构建类方法创建并设置代理 sp_delegate
// # How to use #
    CGSize screenSize = [UIScreen mainScreen].bounds.size;
    SPScrollPageView *pageView = [SPScrollPageView scrollPageViewWithPageCount:5
                                                                  initialIndex:3
                                                                         frame:(CGRect){CGPointZero,screenSize}];
    pageView.sp_delegete = self;
    [self.view addSubview:pageView];

pageCount:总页面数 initialIndex:初始化页面位置(从0开始)

  • 在代理方法中依据位置创建并返回目标视图
- (UIView *)scrollPageView:(SPScrollPageView *)pageView pageForIndex:(NSInteger)index{
    UIView *view = [pageView dequeuePageViewWithIndex:index];
    if (!view) {
        if (index) {
            view = self.subscribed;
        }else{
            view = self.news;
        }
    }
    return view;
}
  • 在代理方法中,可以获知当前显示的位置和视图
- (void)scrollPageDidEndBounceAtPage:(UIView *)stillPage index:(NSInteger)index
{
    NSLog(@"Current page number:%ld",index);
}

在此,可以控制页面的刷新、更新导航条位置等操作

  • 跳转,可以直接使用 - (void)jumpImmediatelyToIndex:(NSInteger)index animated:(BOOL)animated;,其中 index:目标位置,animated:是否使用动画

  • 页面刷新功能(2018/05/12)

// 刷新全部页面,恢复初始状态
- (void)reloadData;
// 刷新固定位置的页面,并不会跳转
- (void)reloadDataForIndex:(NSInteger)index;
// 刷新固定位置的页面,可以设置是否跳转
- (void)reloadDataForIndex:(NSInteger)index show:(BOOL)toShow animated:(BOOL)animated;

如何应用

  1. pod 'SPScrollPageView', '~> 0.0.6'
  2. 直接将 Gayhub 上项目中的 SPScrollPageView 文件夹拖入工程

Gayhub:SPScrollPageView 求个 star ^-^

基本原理

  1. 继承自 UIScrollView
  2. pagingEnabled 设置为 YES,用于切换分页效果的实现
  3. 借鉴 UITableview 的复用机制,只创建两个 Cell 用于承载数据源中获取的 View,避免在滚动时出现无意义的视图创建
  4. 根据位置缓存视图,管理展示视图,无需在 Controller 中进行冗余的处理
  5. 使用 KVO 监听 contentOffset 的变化,控制页面的复用及相关数据的更新。这里多说一点,很多情况下利用现有的 UIScrollViewdelegate 可以更容易获悉相关状态,但是笔者没有这么做,为什么呢?假如我们过分依赖原生代理方法,一旦使用者想使用相关代理方法去重新设置 delegate,那么功能一定会出现问题。
  6. 使用 UIScrollViewpanGestureRecognizer,结合 第5条,监听处理手指拖动页面时的变化

写在最后

作为新年节后的恢复轮子,肯定有不妥或者不足的地方。如果大佬有任何意见,或者发现任何不足,希望大佬能留言或 issue 拍砖,野生鶸鸡在此拜谢

写在最后的最后

“愿中国青年都摆脱冷气,只是向上走,不必听自暴自弃者流的话。”