这篇文章中我们主要来叙述一下上述动画效果的实现方案。主要涉及视图控制器转场动画的知识。
我搭建了个人站点,那里有更多内容,请多多指教。点我哦! ! !
<强>呈现一个视图控制器强>
显示一个视图控制器主要有一下几种方式:
-
<李>使用segue自动显示视图控制器;李>
<李>使用showViewController:发送方:和showDetailViewController:发送方:方法显示视图控制器;李>
<李>调用presentViewController:动画:完成:方法依模态形式显示视图控制器李>
通过上述方式,我们可以将一个视图控制器显示出来,而对于显示地形式,我们可以使用UIKit中预定义的形式,也可以自定义(即自定义转场动画)。
<强>定制过渡动画强>
自定义转场动画中,主要包含以下几个组件:
-
<李>呈现视图控制器(正在显示的视图控制器)李>
<李>动画师(动画管理者)李>
<李>视图控制器(要显示的视图控制器)李>
<李>过渡委托对象(转场代理,用来提供动画师对象)李>
实现自定义转场动画,通常按照以下几个步骤来完成
-
<李>创建了视图控制器;李>
<李>创建动画师;李>
<李>设置了视图控制器的transitioningDelegate属性,并实现UIViewControllerTransitioningDelegate提供动画师对象,李>
<李>在呈现视图控制器中调用presentViewController:动画:完成:显示了视图控制器;李>
<强>呈现视图控制器强>
这里,我们将呈现视图控制器本身作为其转场代理,你也可以使用单独的代理对象。
类PresentedViewController: ui { 让imageView=UIImageView(图片:用户界面图像(命名为:“jd_add.jpg”)) 覆盖func viewDidLoad () { super.viewDidLoad ()//1。设置transitioningDelegate(转场代理) transitioningDelegate=自我 modalPresentationStyle=.custom view.addSubview (imageView) } 覆盖func viewDidLayoutSubviews () { super.viewDidLayoutSubviews () imageView.frame=CGRect中(x: 0 y: 120,宽度:UIScreen.main.bounds。宽度,高度:UIScreen.main.bounds。身高- 120) } 覆盖func touchesBegan(_触动:设置事件:uievent # 63;) { 自我。解雇(动画:真的,完成:nil) } }
<强>动画强>
动画师作为转场动画的管理者,主要负责呈现和解雇动画效果。
<强>动画时长强>
///转场动画时长 func transitionDuration(使用transitionContext: UIViewControllerContextTransitioning& # 63;)→TimeInterval { 返回TimeInterval (0.5) }
<>强执行动画强>
///执行转场动画 func animateTransition(使用transitionContext: UIViewControllerContextTransitioning) { 开关类型{ 案例.Present: 现在(transitionContext transitionContext): 案例.Dismiss: 解雇(transitionContext transitionContext): } }
<强>呈现动画强>
///显示动画 func礼物(transitionContext: UIViewControllerContextTransitioning) {/* * 1。从转场上下文中取出展示/提出视图控制器及容器视图*/让presentingVC=transitionContext。viewController (forKey:从今以后),# 63;ViewController其他{ 返回 } 让presentedVC=transitionContext。viewController (forKey:文等),# 63;其他PresentedViewController { 返回 } 让containerView=transitionContext.containerView/* * 2。设置呈现视图控制器所显示内容的属性*///对presentingVC的视图内容截屏,用于presentedVC显示出来时的背景 让presentingVCViewSnapshot=presentingVC.view。其他snapshotView (afterScreenUpdates: false) { 返回 }//隐藏presentingVC的视图,并将其截屏添加到containerView中 presentingVC.view。isHidden=true containerView.addSubview (presentingVCViewSnapshot)//改变presentingVCViewSnapshot的焦点 presentingVCViewSnapshot.layer。y anchorPoint=CGPoint (x: 0.5: 1)//更新presentingVCViewSnapshot的框架 presentingVCViewSnapshot.frame=presentingVC.view.frame/* * 3。设置了视图控制器所显示内容的属性*/presentedVC.view.frame=CGRect中(x: 0 y: containerView.bounds。高度、宽度:containerView.bounds。宽度,高度:containerView.bounds.height) containerView.addSubview (presentedVC.view)/* * 4。设置呈现转场动画*/UIView。动画(withDuration: transitionDuration(使用:transitionContext),动画:{//改变presentingVCViewSnapshot的层的变换,使其绕X轴旋转,并改变大小 presentingVCViewSnapshot.layer.transform。m34=-1/100.0 presentingVCViewSnapshot.layer。变换=presentingVCViewSnapshot.layer。变换=CATransform3DConcat (CATransform3DMakeRotation (CGFloat (0.1), 1, 0, 0), CATransform3DMakeScale (0.85, 0.95, 1))//改变presentedVC的视图的转换 presentedVC.view。变换=CGAffineTransform (translationX: 0, y: -containerView.bounds.height) }){(完成)//告知UIKit呈现转场动画结束(很重要) transitionContext.completeTransition(真正的) } }视图控制器过渡实现京东加购物车效果