您的位置:首页 > 移动开发 > Swift

swift 自定义Modal动画

2016-07-27 00:00 218 查看
摘要: swift 自定义Modal动画

//
//  PopoverAnimator.swift
//  DS11WB
//
//  Created by xiaomage on 16/4/6.
//  Copyright © 2016年 小码哥. All rights reserved.
//

import UIKit

class PopoverAnimator: NSObject {
var isPresented : Bool = false
}

// MARK:- 自定义转场代理的方法
extension PopoverAnimator : UIViewControllerTransitioningDelegate {
// 目的:改变弹出View的尺寸
func presentationControllerForPresentedViewController(presented: UIViewController, presentingViewController presenting: UIViewController, sourceViewController source: UIViewController) -> UIPresentationController? {
return XMGPresentationController(presentedViewController: presented, presentingViewController: presenting)
}

// 目的:自定义弹出的动画
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
isPresented = true
return self
}

// 目的:自定义消失的动画
func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
isPresented = false
return self
}
}

// MARK:- 弹出和消失动画代理的方法
extension PopoverAnimator : UIViewControllerAnimatedTransitioning {
/// 动画执行的时间
func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
return 0.5
}

/// 获取`转场的上下文`:可以通过转场上下文获取弹出的View和消失的View
// UITransitionContextFromViewKey : 获取消失的View
// UITransitionContextToViewKey : 获取弹出的View
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
isPresented ? animationForPresentedView(transitionContext) : animationForDismissedView(transitionContext)
}

/// 自定义弹出动画
private func animationForPresentedView(transitionContext: UIViewControllerContextTransitioning) {
// 1.获取弹出的View
let presentedView = transitionContext.viewForKey(UITransitionContextToViewKey)!

// 2.将弹出的View添加到containerView中
transitionContext.containerView()?.addSubview(presentedView)

// 3.执行动画
presentedView.transform = CGAffineTransformMakeScale(1.0, 0.0)
presentedView.layer.anchorPoint = CGPointMake(0.5, 0)
UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
presentedView.transform = CGAffineTransformIdentity
}) { (_) -> Void in
// 必须告诉转场上下文你已经完成动画
transitionContext.completeTransition(true)
}
}

/// 自定义消失动画
private func animationForDismissedView(transitionContext: UIViewControllerContextTransitioning) {
// 1.获取消失的View
let dismissView = transitionContext.viewForKey(UITransitionContextFromViewKey)

// 2.执行动画
UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
dismissView?.transform = CGAffineTransformMakeScale(1.0, 0.00001)
}) { (_) -> Void in
dismissView?.removeFromSuperview()
// 必须告诉转场上下文你已经完成动画
transitionContext.completeTransition(true)
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: