实例介绍
【实例简介】
Present方式弹出设置
【核心代码】
public class Presentation: UIPresentationController {
lazy fileprivate var blackView: UIView = {
let view = UIView()
if let frame = self.containerView?.bounds {
view.frame = frame
}
return view
}()
override public func presentationTransitionWillBegin() {
presentedView?.frame = UIScreen.main.bounds
containerView?.addSubview(blackView)
containerView?.addSubview(presentedView ?? UIView())
presentingViewController.transitionCoordinator?.animateAlongsideTransition(in: blackView, animation: { (context) in
self.blackView.backgroundColor = colorLiteral(red: 0, green: 0, blue: 0, alpha: 1).withAlphaComponent(0.5)
}, completion: { (context) in
})
}
override public func dismissalTransitionWillBegin() {
presentingViewController.transitionCoordinator?.animateAlongsideTransition(in: blackView, animation: { (context) in
self.blackView.alpha = 0
}, completion: { (context) in
})
}
override public func dismissalTransitionDidEnd(_ completed: Bool) {
if completed {
presentedView?.removeFromSuperview()
blackView.removeFromSuperview()
}
}
}
//动画的类
class AnimatedTransitioning: NSObject, UIViewControllerAnimatedTransitioning {
var present: Bool = true
var direction: Direction = .Up
var dismissDirection: Direction = .Up
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.65
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
if present {
showDirecton(dir: direction, transitionContext: transitionContext)
}else{
showDirecton(dir: dismissDirection, transitionContext: transitionContext)
}
}
fileprivate func showDirecton(dir: Direction, transitionContext: UIViewControllerContextTransitioning){
if present {
//创建控制器
let toView = transitionContext.view(forKey: UITransitionContextViewKey.to)
switch dir {
case.down:
//从上向下
toView?.frame.origin.y = -(toView?.frame.height ?? UIScreen.main.bounds.height)
break
case .Up:
//从下向上
toView?.frame.origin.y = toView?.frame.height ?? UIScreen.main.bounds.height
break
case .left:
//从左向右
toView?.frame.origin.x = -(toView?.frame.width ?? UIScreen.main.bounds.width)
break
case .right:
//从右向左
toView?.frame.origin.x = toView?.frame.width ?? UIScreen.main.bounds.width
break
}
UIView.animate(withDuration: 0.45, delay: 0.0, usingSpringWithDamping: 0.90, initialSpringVelocity: 1.0 / 0.5, options: .curveEaseInOut, animations: {
switch dir{
case .Up, .down:
toView?.frame.origin.y = 0
break
case .left, .right:
toView?.frame.origin.x = 0
break
}
}) { (finished) in
transitionContext.completeTransition(true)
}
}else{
let fromView = transitionContext.view(forKey: UITransitionContextViewKey.from)
//销毁控制器
UIView.animate(withDuration: 0.45, delay: 0.0, usingSpringWithDamping: 0.90, initialSpringVelocity: 1.0 / 0.5, options: .curveEaseInOut, animations: {
switch dir{
case .Up:
fromView?.frame.origin.y = fromView?.frame.height ?? UIScreen.main.bounds.height
break
case .down:
fromView?.frame.origin.y = -(fromView?.frame.height ?? UIScreen.main.bounds.height)
break
case .left:
fromView?.frame.origin.x = -(fromView?.frame.width ?? UIScreen.main.bounds.width)
break
case .right:
fromView?.frame.origin.x = fromView?.frame.width ?? UIScreen.main.bounds.width
break
}
}) { (finished) in
transitionContext.completeTransition(true)
}
// UIView.animate(withDuration: 0.45, delay: 0.0, options: [.curveEaseInOut], animations: {
//
//
// }) { (finished) in
// transitionContext.completeTransition(true)
// }
}
}
}
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论