自定义弹出视图
工作中经常会遇到弹出视图的需求,通常还会要求有一些动效,之前使用OC写代码的时候,使用的是STModal,现在使用Swift,就决定自己来写一个。目前仅仅是写了一个弹出视图的控制器,还非常的简陋,后期再来添加自定义Alert视图等功能。
很多地方参考了STModal,当然也做了一些修改和优化。
两种实现方式,核心代码是一样的,不同点在于:
- 将
GJModal定义为单例,这种方式适用于,所有的弹出视图的弹出方式都是一样的。 - 将
GJModalWindow定义为单例,这种方式适用于,弹出视图有多种弹出方式。
效果图:

使用方式
- 第一种实现方式
1 | GJModal.modal.isHideWhenTouchOutside = true |
- 第二种实现方式
1 | let modal = GJModal.init(isHideWhenTouchOutside: false) |
核心代码
初始化
1 | init(isHideWhenTouchOutside: Bool) { |
弹出视图
1 | func show(contentView: UIView, animated: Bool) { |
移除视图
1 | func hide(animated: Bool) -> Void { |
遇到的问题
- 把视图添加到
window上以后,视图的点击效果无法触发。自己感觉可能是因为点击手势的Target与window之间不存在引用关系,然后就在GJModalWindow里加了一个modalsStack的属性,用来添加GJModal。不知道具体原因是不是我想的这个,最终结果是实现了想要的点击效果。 - 在做视图弹出动画的时候,本来想简单的使用
View的transform属性来实现,但是发现如果你要弹出的视图是使用Autolayout来布局的话,弹出后会造成布局混乱的问题,所以最后采用了CAAnimation动画。 - 在使用
CAAnimation动画的时候,发现动画总是同时触发,不是我想要的一个动画结束后再执行另一个动画。然后采用了CAAnimationGroup来实现动画组,通过设置Animation的beginTime来控制动画的执行。
版本记录
V1.0仅实现了弹出视图控制器。 2017.7.24
