zoukankan      html  css  js  c++  java
  • UIScrollView嵌套滑动手势冲突的简易实现

    明确需求

    现在有较多的商城类app有如下需求,界面上带有headerView,并且有一个barView可悬停,最下方为多个可左右滑动的tableView,具体可参考下图

    另类实现

    在网上关于此类需求的实现较多,大多数为使用UIScrollView手势穿透(多个视图响应一个手势)来达到效果。
    此前笔者也是用类似方法实现,最近想到了另一种实现方案(实现和学习成本很低)。

    界面层次

    实现方案

    通过界面层次就很容易明白笔者的思路了,在界面上只有一个tableView存在,同时在tableView之上还有一个HeaderView(包含广告和按钮位),当使用手势滑动时,再做动画切换对应的tableView视图(此种方式没有复用效果,当然如果有追求极致者也可去实现),HeaderView保持不变。当tableView滑动的同时,改变HeaderView坐标,这样就可以保证手势丝滑,不存在任何卡顿。

    具体思路

    • 协议类

    遵循此协议的UIViewController都可以成为界面上的tableView。自定义的tableView只需要关心标示符即可

    @protocol SwipTableViewDelegate <NSObject>
    
    @property (nonatomic, strong) UITableView * tableView;
    @property (nonatomic, copy) NSString * itemTitle;                   ///< 子视图标示符,也可用其他类型代替
    @property (nonatomic, assign) CGFloat  headerHeight;                ///< 头部视图高度(包含广告位和按钮位)
    @property (nonatomic, assign) BOOL  needScrollBlock;                ///< 滑动时是否需要回调
    
    /* 更新数据源方法 */
    - (void)reloadWithDatas:(NSArray *)datas;
    
    /* 当tableView上下滑动时需回调此方法中的block */
    - (void)scrollViewDidScrollBlock:(void(^)(CGFloat offsetY))block;
    
    @end
    
    • SwipeSubTableVc(主容器)

    此处创建SwipeSubTableVc,自定义headerView和barView,传入自己配置的UIViewController(需遵守SwipTableViewDelegate协议)

    @interface SwipeSubTableVc : UIViewController
    
    @property (nonatomic, strong) UIView * headerView;
    @property (nonatomic, strong) UIView * barView;
    @property (nonatomic, strong) NSArray<UIViewController<SwipTableViewDelegate> *> * tabArrs;
    
    - (void)resetTabArrs:(NSArray<UIViewController<SwipTableViewDelegate> *> *)tabArrs;
    
    - (void)switchToTabVc:(NSInteger)index;
    
    - (void)tabVcWillSwitchToIndex:(void(^)(NSInteger index))changeBlock;
    
    @end
    
    • 内部实现思路
      • 1.添加headerView和barView,并保证在最上层
      • 2.添加对应的tableView视图,并给tableView一个空的头部视图
      • 3.在tableView滚动同时改变上层头视图frame
      • 4.左右滑动时,切换为对应tableView做出动画效果

    整体思路如上所述,有思路了代码就不贴了。如有需要下载demo
    如有错误之处请指出,谢谢

  • 相关阅读:
    git rebase解决合并冲突
    Google GMS介绍
    MTK Android修改System分区
    Adb adb push (remote write failed: No space left on device)
    Android Visibility控件显示和隐藏
    MTK Android中设置默认时区
    初级Oracle和SQL学习者的学习笔记。韩顺平-玩转oracle。
    网络知识从零开始一:私有地址。
    oracle中有关用户、角色的一些概念。
    oracle中的一些函数笔记
  • 原文地址:https://www.cnblogs.com/purple-sweet-pottoes/p/10517294.html
Copyright © 2011-2022 走看看