swift中基本转场动画.



//-----------------------------------------------------在一个控制器中实现代码--------------------------------------------------------------------

            //默认的Modal,会将上一级的视图移走
            let photoBrowserController = PhotoBrowserController(urls: urls, indexPaht: indexPath)
            
            //指定动画的提供者,transitioningDelegate 隐式动画。
            photoBrowserController.transitioningDelegate = self?.photoBrowserAnimator
            
            //指定Model的样式是自定义的
            photoBrowserController.modalPresentationStyle = UIModalPresentationStyle.Custom
            self?.presentViewController(photoBrowserController, animated: false, completion: nil)


//-----------------------------------------------------定义转场动画类----------------------------------------------------------------------

import UIKit

/// 专门给控制器提供 ‘转场’ 的动画模型
class PhotoBrowserAnimator: NSObject , UIViewControllerTransitioningDelegate {
    
    //是否展示动画
    var isPresent = false
    
    /// 返回提供展现 Presented 转场动画的对象
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        
        isPresent = true
        
        return self
    }
    
    /// 返回消失时 Dismissed 转场动画的对象
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {

        isPresent = false
        return self
    }
}

extension PhotoBrowserAnimator: UIViewControllerAnimatedTransitioning{
    
    /// '转场'时长
    ///
    /// - parameter transitionContext: transition[转场]Context 上下文
    ///
    /// - returns: 时长
    func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval {
        
        return 0.5
    }
    
    /// 实现专场动画效果  - 一旦实现这个方法,必须完成动画效果
    ///
    /// - parameter transitionContext: transition[转场]Context 提供一转场动画效果的一切细节
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        
        isPresent ? presentAnimation(transitionContext) : dismissAnimation(transitionContext)
    }
    
    /// 消失时动画
    ///
    /// - parameter transitionContext: transitionContext
    private func dismissAnimation(transitionContext: UIViewControllerContextTransitioning){
        
        let fromView = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)?.view
        
        UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
            
            fromView?.alpha = 0
            
            }) { (_) -> Void in
                fromView?.removeFromSuperview()
                transitionContext.completeTransition(true)
        }
    }
    
    /// 出现时动画
    ///
    /// - parameter transitionContext: transitionContext
    private func presentAnimation(transitionContext: UIViewControllerContextTransitioning){
        //展示动哈
        let toView = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!.view
        toView.alpha = 0
        
        //获取容器视图
        let containerView = transitionContext.containerView()
        //将视图添加到容器视图上才能看到动画效果
        containerView?.addSubview(toView)
        
        UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in
            toView.alpha = 0
            
            }) { (_ ) -> Void in
                //动画完成后要声明方式
                transitionContext.completeTransition(true)
        }
        
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值