文档章节

UIView Animations 学习笔记(二)定制动画效果及切换效果

灰大羊
 灰大羊
发布于 2015/08/12 22:12
字数 1304
阅读 192
收藏 3

目录

二、视图切换定制

2.1 基础说明

要创建定制切换效果,你需要做如下的事情:

  1. 创建一个类来实现UIViewControllerAnimatedTransitioning协议。在这个类中将编写代码来执行动画,这个类将作为动画控制器被关联。
  2. 在呈现一个视图控制器之前,设置一个类作为它的切换效果委托。这个委托将为动画控制器获取一个回调方法,这个回调方法用于视图控制器的呈现。
  3. 实现回调方法来返回一个在第一步创建的动画控制器的实例。

2.1.1 UIViewControllerAnimatedTransitioning协议

UIViewControllerAnimatedTransitioning协议用于描述视图控制器切换的动画效果,我们可以通过实现这个协议,并利用该类来实现在视图间切换过程中的动画效果。可以在这个类中定义一个动画对象,这个动画对象创建一个视图控制器在一个固定的时间内出现/消失在屏幕上的动画效果。使用这个协议创建的动画 必须 是无法交互的。如果要创建可以交互的切换,必须混合动画对象和另一个控制动画时间的对象。

在动画对象中,实现transitionDuration:方法来指定切换的过程,实现animateTransition:方法来创建动画。在切换过程中使用的对象的信息在一个上下文对象中传递给animateTransition:方法。使用这个上下文对象(UIViewControllerContextTransitioning)提供的信息,来移动目标视图控制器的视图在指定的区间内出现/消失在屏幕上。

从一个实现了UIViewControllerTransitioningDelegate协议的切换委托对象中创建一个动画对象。当呈现一个视图控制器时,设置呈现类型为UIModalPresentationCustom,并指定切换委托到视图控制器的transitioningDelegate属性。视图控制器从切换委托中接受动画对象,并使用这个切换委托来执行动画。可以为视图控制器的出现、消失分别定制不同的动画对象。

为了添加用户交互到一个视图控制器的切换效果中,必须一起使用一个动画对象和一个交互动画对象(一个实现UIViewControllerInteractiveTransitioning协议的定制类)。

执行切换

切换过程:

具体实现如下所示。

import Foundation
import UIKit

class AnimatedTransitioning: NSObject, UIViewControllerAnimatedTransitioning {

    func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval {
        return 5
    }
    
    func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
        let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
        let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
        
        let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController)
        
        let containerView = transitionContext.containerView()
        let bounds = UIScreen.mainScreen().bounds
        
        toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height)
        containerView.addSubview(toViewController.view)
        
        UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: {
            fromViewController.view.alpha = 0.5
            toViewController.view.frame = finalFrameForVC
            }, completion: {
                finished in
                transitionContext.completeTransition(true)
                fromViewController.view.alpha = 1.0
        })
    }
}

2.1.2 UIViewControllerTransitioningDelegate

import UIKit

class ViewController: UIViewController, UIViewControllerTransitioningDelegate {

    // ...

    let customPresentAnimationController = CustomPresentAnimationController()
    let customDismissAnimationController = CustomDismissAnimationController()

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        
        if segue.identifier == "showAction" {
            let toViewController = segue.destinationViewController as! UIViewController

            // 用于给目标视图指定切换动画代理
            toViewController.transitioningDelegate = self
        }
    }

    // 用于视图出现
    func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return customPresentAnimationController
    }
    
    // 用于视图消失
    func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
        return customDismissAnimationController
    }

    // ...
}

2.1.3 UIViewControllerInteractiveTransitioning

注意:

UIPercentDrivenInteractiveTransitionUIViewControllerInteractiveTransitioning的子类

import UIKit

class CustomInteractionController: UIPercentDrivenInteractiveTransition {
    
    var navigationController: UINavigationController!
    var shouldCompleteTransition = false
    var transitionInProgress = false
    
    var completionSeed: CGFloat {
        return 1 - percentComplete
    }
    
    func attachToViewController(viewController: UIViewController) {
        navigationController = viewController.navigationController
        setupGestureRecognizer(viewController.view)
    }
    
    private func setupGestureRecognizer(view: UIView) {
        view.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: "handlePanGesture:"))
    }
    
    func handlePanGesture(gestureRecognizer: UIPanGestureRecognizer) {
        let viewTranslation = gestureRecognizer.translationInView(gestureRecognizer.view!.superview!)
        switch gestureRecognizer.state {
        case .Began:
            transitionInProgress = true
            navigationController.popViewControllerAnimated(true)
        case .Changed:
            var const = CGFloat(fminf(fmaxf(Float(viewTranslation.x / 200.0), 0.0), 1.0))
            shouldCompleteTransition = const > 0.5
            updateInteractiveTransition(const)
        case .Cancelled, .Ended:
            transitionInProgress = false
            if !shouldCompleteTransition || gestureRecognizer.state == .Cancelled {
                cancelInteractiveTransition()
            } else {
                finishInteractiveTransition()
            }
        default:
            println("Swift switch must be exhaustive, thus the default")
        }
    }
}

2.1.4 UIViewControllerContextTransitioning

UIViewControllerContextTransitioning协议的方法为切换的两个视图控制器提供上下文信息。在一次切换当中,切换中使用的动画对象从UIKit接受一个完整的配置上下文对象,UIViewControllerAnimatorTransitioningUIViewControllerInteractiveTransitioning协议的方法从提供的对象中提取它们需要的信息。

访问切换对象

获取切换框体矩形

finalFrameForViewController用于获取指定的视图控制器视图最终的框体矩形。

获取切换行为

反馈切换进度

获取屏幕方向

常量

View Controller Transition Keys用于标识在切换执行过程中所存在的视图控制器,包含两个值,一个是UITransitionContextFromViewControllerKey用于标识在动画开始时就已经存在的视图控制器,一个是UITransitionContextToViewControllerKey用于标识在动画完成后应该存在的视图控制器。

View Transition Keys用于标识在切换执行过程中所存在的视图,包含两个值,一个是UITransitionContextFromViewKey用于标识在动画开始时就已经存在的视图,一个是UITransitionContextToViewKey用于标识在动画完成后应该存在的视图。

© 著作权归作者所有

灰大羊
粉丝 4
博文 96
码字总数 95147
作品 0
浦东
项目经理
私信 提问
UIView Animations 学习笔记(一)简介及API说明

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animation 学习笔记 应用示例 一、简介 随着iOS7的发布,动画与运动效果变成了Apple和第三方开发者进行app设计的中心。iOS7介绍...

灰大羊
2015/08/01
221
0
UIView Animation 学习笔记 应用示例

目录 UIView Animations 学习笔记(一)简介及API说明 UIView Animation 学习笔记 应用示例 示例一 视图内动画 1. 准备 使用Xcode创建一个"Single View Application"项目 从控件库中选择一个...

灰大羊
2015/08/01
192
0
iOS动画开发之三——UIView的转场切换

iOS动画开发之三——UIView的转场切换 前两篇博客中,我们分别介绍了UIView动画的两种使用方式,分别为,带block的方式:http://my.oschina.net/u/2340880/blog/484457 ,传统的属性配置的方式...

珲少
2015/07/28
2K
0
iOS动画开发之一——UIViewAnimation动画的使用

iOS动画开发之一——UIViewAnimation动画的使用 一、简介 一款APP的成功与否,除了完善的功能外,用户体验也占有极大的比重,动画的合理运用,可以很好的增强用户体验。iOS开发中,常用的动画...

珲少
2015/07/27
8.7K
1
iOS开发UI篇—核心动画(UIView封装动画)

一、UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成,但仍要在希望...

Daniel_s
2016/01/04
13
0

没有更多内容

加载失败,请刷新页面

加载更多

Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
49分钟前
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部