转场动画1-Push 动画
先上效果图:
这篇文章完全是为造轮子制作:原作者是码农界的吴彦祖
作者视频下载地址
好的,我梳理一下思路:
理清思路
||转场动画可以理解为一个对象,在这个对象里封装了一个动画.具体的我们跟着代码走
!.实现协议的方法
在一个继承NSObject的类中遵守协议实现代理
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface PushTranstion : NSObject<UIViewControllerAnimatedTransitioning>
@property (nonatomic,strong)id transitationContext;
@end
在这里遵守一个协议,声明一个属性变量全局操作
方法实现
// PushTranstion.m
// 专场动画
//
// Created by MAc on 16/5/27.
// Copyright © 2016年 MAc. All rights reserved.
//
#import "PushTranstion.h"
@implementation PushTranstion
//转场动画实现的时间 这里设置的长便于观察
- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
return 4.0;
}
//设置动画效果
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
_transitationContext=transitionContext;
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView * containerView = [transitionContext containerView];
[containerView addSubview:fromViewController.view];
[containerView addSubview:toViewController.view];
/* 创建一个矩阵The identity transform: [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1]. */
CATransform3D transform = CATransform3DIdentity;
//设置影射效果,是转场显得更真实
transform.m34 = - 1/1500.0;
toViewController.view.layer.transform =transform;
//设置锚点:(边长为1,锚点指的是(0.5,0.5))
toViewController.view.layer.anchorPoint = CGPointMake(1.0, 0.5);
//设置锚点之后,试图左移动了0.5个View.With,重写设置position(锚点在俯视图中的位置,)
/* The position in the superlayer that the anchor point of the layer's
* bounds rect is aligned to. Defaults to the zero point. Animatable. */
toViewController.view.layer.position= CGPointMake(CGRectGetMaxX(fromViewController.view.frame), CGRectGetMidY(fromViewController.view.frame));
CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
animation.duration = [self transitionDuration:transitionContext];
//从pi/2开始旋转
animation.fromValue = @(M_PI_2);
animation.toValue=@(0);
animation.delegate =self;
[toViewController.view.layer addAnimation:animation forKey:@"rotateAnimation"];
}
//动画结束的时候通知上下文
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
if (flag) {
//[_transitationContext finishInteractiveTransition];
[_transitationContext completeTransition:YES];
}
}
@end
转场对象设定好了,下面就去vc中实现转场动画
在这之前,要理解一件事.转场动画的两个界面是放在一个容器里面的,即前面提到的containerView中放着的两个view,一个fromView 一个toView
其实就是toView旋转铺在fromView上的操作 ,接着看vc中的代码
//
// ViewController.m
// 专场动画
//
// Created by MAc on 16/5/27.
// Copyright © 2016年 MAc. All rights reserved.
//
#import "ViewController.h"
#include "PushTranstion.h"
//#import "PushTransitionTest.h"
@interface ViewController ()<UINavigationControllerDelegate>{
//和手势搭配使用,单独使用会报不知名错
UIPercentDrivenInteractiveTransition * interaction;
}
@end
@implementation ViewController
- (IBAction)push:(id)sender {
// interaction = [[UIPercentDrivenInteractiveTransition alloc] init];
[self performSegueWithIdentifier:@"PushToS" sender:nil];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:YES];
self.navigationController.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.delegate = nil;
}
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC
{
if (operation == UINavigationControllerOperationPush) {
return [[PushTranstion alloc] init];
}
return nil;
}
@end
这样,这个转场动画的效果就实现了,后面还有对吴彦祖的视频的分析讲解,不清楚的地方相互交流,欢迎留言!
转场动画1-Push 动画的更多相关文章
- ios基础动画、关键帧动画、动画组、转场动画等
概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
- iOS开发UI篇—核心动画(转场动画和组动画)
转自:http://www.cnblogs.com/wendingding/p/3801454.html iOS开发UI篇—核心动画(转场动画和组动画) 一.转场动画简单介绍 CAAnimation的 ...
- 关于push动画中尺寸问题
由于是在sb中写的VC, 所以在跳转动画时, 就会有一些问题. 这是sb中的约束: 当在push动画时, 在中间界面添加imageView时, 如图: imageView的尺寸是如上图所示, 并不是屏 ...
- iOS 自定义Tabbar实现push动画隐藏效果
http://wonderffee.github.io/blog/2013/08/07/hide-custom-tab-bar-with-animation-when-push/ 在之前的一篇文章(链 ...
- 【Flutter 实战】动画序列、共享动画、路由动画
老孟导读:此篇文章是 Flutter 动画系列文章第四篇,本文介绍动画序列.共享动画.路由动画. 动画序列 Flutter中组合动画使用Interval,Interval继承自Curve,用法如下: ...
- iOS开发UI篇—核心动画(UIView封装动画)
iOS开发UI篇—核心动画(UIView封装动画) 一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画 ...
- 核心动画基础动画(CABasicAnimation)关键帧动画
1.在iOS中核心动画分为几类: 基础动画(CABasicAnimation) 关键帧动画(CAKeyframeAnimation) 动画组(CAAnimationGroup) 转场动画(CATran ...
- 核心动画(UIView封装动画)
一.UIView动画(首尾) 1.简单说明 UIKit直接将动画集成到UIView类中,当内部的一些属性发生改变时,UIView将为这些改变提供动画支持 执行动画所需要的工作由UIView类自动完成, ...
- Objective-C 使用核心动画CAAnimation实现动画
先来看看效果吧 整个核心动画就不多做介绍了,随便一搜就能有很多很详细的解释,主要使用以下四种 CABasicAnimation //经典动画 CAKeyframeAnimation //关键帧动画 C ...
- Core Animation 动画的使用:关键帧动画、基础动画、动画组
首先让我们了解下什么是 Core Animation,Core Animation 为核心动画,他为图形渲染和动画提供了基础.使用核心动画,我们只需要设置起点.终点.关键帧等一些参数,剩下的工作核心动 ...
随机推荐
- C++ 之再继续
1C++函数重载,内联函数(for程序性能优化),函数递归
- ar解压deb包
解压文件 ar -x libstdc++6_4.7.2-5_i386.deb tar -zxvf data.tar.gz
- 让ie支持placeholder属性,一段js搞定
placeholder属性真的是超级好用的新属性,可惜,只有新版浏览器才支持,为了写出输入框贴心提示,老方法就是加span标签覆盖,营造出placeholder提示的感觉,现在安利一款好用的js,好用 ...
- cookie的expires属性和max-age属性
expires属性 指 定了coolie的生存期,默认情况下coolie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户推出浏览器后这些值也会丢失,如果想让 cookie存在一段时间,就要为e ...
- EassyMock实践 捕获参数
在测试接口过程中,有时我们希望知道自己期望传入的参数是什么,以此来判断传入参数的正确行,这时就需要用到EassyMock的capture方法.该方法能捕获传入的参数存放到自定义的变量中,然后用捕获的参 ...
- 1.js编程风格。 --- 编写可维护的javascript
1. 使用4个空格字符作为一个缩进层级. 2. 不省略分号. ---> 自动插入分号机制非常复杂,且难于记忆. 3. 行的长度限定于80个字符. 4. 通常在运算符换行之后,下一行会增加两个层级 ...
- ecshop开发日志之虚拟商品发送邮件通知
购买虚拟商品,系统会在支付后自动发送邮件到用户填写的邮件地址中,追踪过程如下首先在订单列表中可以获得到处理订单的php文件为flow.php,之后在最后一步url地址显示为http://localho ...
- hadoop笔记之Hive的数据类型
Hive的数据类型 Hive的数据类型 前面说过,Hive是一个数据仓库,相当于一个数据库.既然是数据库,那么就必须能创建表,既然有表,那么当中就有列,列中就有对应的类型 总的来讲,hive的数据类型 ...
- linux杂记(一)各硬件装置在linux中的代号
装置 装置在linux内的代号 IDE硬盘机 /dev/hd[a-d] SCSI硬盘机 /dev/sd[a-p] U盘 /dev/sd[a-p](与SCSI硬盘一样) CDROM /dev/cdrom ...
- js/jQuery实现复制到剪贴板功能,兼容所有浏览器
因为工作的原因,需要实现这样一个功能:点击按钮,复制文本内容. 百度了一下,大都语焉不详,最终找到了一篇很好的博文,有讲解,有实例,捣鼓了一会,最终实现了功能. 网址在这里http://www.cnb ...