XBPopUpView 1.1.1

XBPopUpView 1.1.1

XBingo维护。



  • 作者:
  • XBingo

XBPopUpView

背景

在移动端开发中不可避免会遇到许多弹窗的需求。尽管 iOS 系统提供了多种警告、提示等弹窗样式,但很难满足各种自定义弹窗需求。

不考虑开发者实现自定义弹窗的成本,随着项目中自定义弹窗样式的增多,弹窗的管理也很麻烦,特别是在多人合作开发的情况下,不同的实现思路和代码风格使得管理难度增加。

为了获得更好的体验,通常不应两个弹窗同时显示。但是,由于各个业务模块可能由不同的人负责,对于多个弹窗的展示时机难以把握,沟通成本很高,且效果不一定理想。

因此,在开发项目的过程中非常有必要制定弹窗的规范。

分析

问题:

  • 1:多人开发时实现思路和代码风格不同不利于管理;
  • 2:多人开发时难以掌握弹窗展示的时机;
  • 3:自定义场景和样式繁多;

方案

  • 1:定义弹窗实现的协议,所有自定义弹窗都必须满足该协议
  • 2:建立一个弹窗管理队列,所有弹窗都添加到这个队列中,并按优先级展示
  • 3:弹窗框架需要支持强大的自定义需求

实现

代理协议

XBPopUpDelegate

  • priority(@required)

    用于控制弹窗优先级

  • popUpView(@optional)

    自定义弹窗的内容,作为容器的时候提供,如XBPopUpViewController

  • popUpContentView(@optional)

    自定义弹窗的容器,作为基类的时候提供,如XBBasePopViewController

  • - (void)present;(@required)

    自定义出场效果

  • - (void)dismiss;(@required)

    自定义退场效果

  • 更多属性、方法前往查看源码

XBPopUpViewDelegate

  • willHideBlock

    通过该Block将自定义视图的关闭事件传给容器

  • didHidenBlock

    回调隐藏事件,外部业务根据此进行相应处理

所有弹窗都必须遵守XBPopUpDelegate,所有的popUpView都必须遵守XBPopUpViewDelegate

弹窗队列XBPopUpQueue

  • popUpQueue

    自行维护NSMutableArray类型的队列,将被展示的弹窗添加到该队列中

  • - (void)addView:(id)popUpView;

    将遵守了XBPopUpDelegate协议的弹窗添加到队列中

  • - (void)removeView:(id)popUpView;

    移除队列中已展示的弹窗

使用

基于常用场景,本库已封装相关功能,主要包括PopUpVCPopUpView两种方式。对于复杂自定义需求,可参考上述“实现”方案和常用场景封装方案,结合自身项目情况自行封装。

PopUpVC(参照PopUpVCDemo)

该方式提供XBBasePopViewControllerXBBaseTransition两个基类,可子类化实现弹窗具体细节。

在子类VC的init方法中设置各种弹窗属性,在viewDidLoaded方法中对弹窗进行布局。之后实例化子类,并调用-(void)showInPopUpQueue:(XBPopUpViewDidHidenBlock)didHidenBlock;即可。

XBBaseTransition实现了默认弹窗动画(背景透明度渐变,popUpContentView缩放动画)。如需自定义弹窗动画,子类化该类,并重写方法- (void)animateTransition:(id)transitionContext;即可。

PopUpView(参照PopUpViewDemo)

该方式需要自定义UIView,并通过XBPopUpService提供的api使用,所有弹窗属性都是通过api参数传递的。

/**
 XBPopUpService
 自定义出场、退场效果
 
 @param popUpView 自定义弹窗
 @param priority 优先级
 @param lowerPriorityHidden 已经展示时,如果有更高优先级的则暂时隐藏
 @param fromType 通过根控制器或者当前控制器做present(仅针对控制器容器)
 @param emptyAreaEnabled 是否激活点击空白区域隐藏
 @param presentTransitioning 出场效果
 @param dismissTransitioning 退场效果
 */
- (void)showCustomPopUpView:(UIView<XBPopUpViewDelegate> *)popUpView
                   priority:(XBPopUpPriority)priority
        lowerPriorityHidden:(BOOL)lowerPriorityHidden
                   fromType:(XBPopUpFromType)fromType
           emptyAreaEnabled:(BOOL)emptyAreaEnabled
       presentTransitioning:(id<UIViewControllerAnimatedTransitioning>)presentTransitioning
       dismissTransitioning:(id<UIViewControllerAnimatedTransitioning>)dismissTransitioning;

更多XBPopUpDelegate实现(参照PopUpDemo)

Demo

https://github.com/yanxiaobing/XBPopUpView