JXPopupView:一个轻量级的自定义视图弹出框架

前言

随着APP业务增多,各种五花八门的弹框也增多,各种细节都需要得到不同的定制。最后就沉淀出JXPopupView这个库,可以应对多类需求,轻巧灵活,不再为弹框忧愁了。

最近看了一篇文章阿里云的这群疯子,深有感触,很多牛逼的东西都是逼出来的,而不是一个天才凭一己之力创造出来的。就像文章里面说的,随着淘宝业务剧增,云服务再不升级,就会因为技术瓶颈导致业务停滞,也可能导致淘宝的失败。

对于我们普通开发者来说,不可能一来就写出兼容任何需求的代码(随着经验增加,可以写出扩展性强的代码)。我们要做的是,在业务不断变化的时候,也在不断思考,不断优化代码,沉淀出一个经得起考验的框架。

说了一点鸡汤哈,下面来看看JXPopupView的细节效果。

Github

下载源码,一睹为快!JXPopupView

特性

  • 默认提供丰富的动画效果,而且可以灵活的扩展配置,只要遵从并实现JXPopupViewAnimationProtocol协议即可;
  • 使用灵活,通过view封装,可以在任何view上面展示,并不局限于UIViewController;
  • 背景配置方便,借鉴了MBProgressHUD对背景视图的处理逻辑,可以灵活配置;
  • 交互细节可配置,提供了isDismissibleisInteractiveisPenetrable属性进行配置

预览

动画效果

动画效果 GIF
渐隐渐现
FadeInOut.gif
缩放
ZoomInOut.gif
往左
Leftward.gif
往右
Rightward.gif
往下
Downward.gif
往上
Upward.gif
部分自定义-弹性动画
Spring.gif
完全自定义动画
CustomAnimation.gif

背景风格

背景风格 GIF
固定色值
FadeInOut.gif
blur light
Blurlight.gif
blur dark
BlurDark.gif

指定containerView

指定containerView GIF
Window
ZoomInOut.gif
UIViewController.view
VCView.gif
CustomView
CustomView.gif

要求

Swift 4.2编写,支持iOS9以上

安装

CocoaPods

在Podfile文件里面添加

pod 'JXPopupView'

然后再pod install(最好先pod update)

使用

//- 确定contentView的目标frame
let contentView = Bundle.main.loadNibNamed("TestAlertView", owner: nil, options: nil)?.first as? TestAlertView
let x: CGFloat = (containerView.bounds.size.width - 200)/2
let y: CGFloat = (containerView.bounds.size.height - 200)/2
contentView.frame = CGRect(x: x, y: y, width: 200, height: 200)
//- 确定动画效果
var animator = JXPopupViewFadeInOutAnimator()
//- 初始化JXPopupView
let popupView = JXPopupView(containerView: containerView, contentView: contentView, animator: animator!)
//- 配置交互
popupView.isDismissible = true
popupView.isInteractive = true
popupView.isPenetrable = false
//- 配置背景
popupView.backgroundView.style = self.backgroundStyle
popupView.backgroundView.blurEffectStyle = self.backgroundEffectStyle
popupView.backgroundView.color = self.backgroundColor
//- 展示popupView
popupView.display(animated: true, completion: nil)
//- 消失popupView
//通过extension提供的jx_popupView属性,获取JXPopupView进行操作,可以不用全局持有JXPopupView属性
contentView.jx_popupView?.dismiss(animated: true, completion: nil)

动画自定义

JXPopupViewAnimationProtocol协议方法

/// 初始化配置动画驱动器
    ///
    /// - Parameters:
    ///   - contentView: 自定义的弹框视图
    ///   - backgroundView: 背景视图
    ///   - containerView: 展示弹框的视图
    /// - Returns: void
    func setup(contentView: UIView, backgroundView: JXBackgroundView, containerView: UIView)

    /// 处理展示动画
    ///
    /// - Parameters:
    ///   - contentView: 自定义的弹框视图
    ///   - backgroundView: 背景视图
    ///   - animated: 是否需要动画
    ///   - completion: 动画完成后的回调
    /// - Returns: void
    func display(contentView: UIView, backgroundView: JXBackgroundView, animated: Bool, completion: @escaping ()->())

    /// 处理消失动画
    ///
    /// - Parameters:
    ///   - contentView: 自定义的弹框视图
    ///   - backgroundView: 背景视图
    ///   - animated: 是否需要动画
    ///   - completion: 动画完成后的回调
    func dismiss(contentView: UIView, backgroundView: JXBackgroundView,animated: Bool, completion: @escaping ()->())

自定义动画建议

  • 现有动画微调
    继承对应的animator,重载协议方法,进行微调。参考demo工程的JXPopupViewSpringDownwardAnimator类。

  • 完全自定义动画
    可以继承JXPopupViewBaseAnimator或者自己新建一个类,遵从JXPopupViewAnimationProtocol协议,实现对应方法即可。参考demo工程的JXPopupViewCustomAnimator

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 127,730评论 18 546
  • 关心简书的都会进来围观,所以,你进来了。进来了,我们就是一伙啦(看过《联盟》这本书后就再也不轻易用“家”这个词了)...
    东成西九阅读 4,989评论 43 48
  • 此时荫云 要下两三点雨 秋的影子在叶的尖上 曳摇着 爱,真,在空气中窒息 在灵魂中涌出的撞击 心中的路在一瞬间亮起...
    月铃阅读 30评论 0 0