iOS 雷达扫描效果 实现
2016-01-13 18:18
309 查看
1 rotationAnimation.removedOnCompletion = NO; 2 3 rotationAnimation.fillMode = kCAFillModeForwards;
fillMode的作用就是决定当前对象过了非active时间段的行为. 比如动画开始之前,动画结束之后。如果是一个动画CAAnimation,则需要将其removedOnCompletion设置为NO,要不然fillMode不起作用.
下面来讲各个fillMode的意义
kCAFillModeRemoved 这个是默认值,也就是说当动画开始前和动画结束后,动画对layer都没有影响,动画结束后,layer会恢复到之前的状态
kCAFillModeForwards 当动画结束后,layer会一直保持着动画最后的状态
kCAFillModeBackwards 这个和kCAFillModeForwards是相对的,就是在动画开始前,你只要将动画加入了一个layer,layer便立即进入动画的初始状态并等待动画开始.你可以这样设定测试代码,将一个动画加入一个layer的时候延迟5秒执行.然后就会发现在动画没有开始的时候,只要动画被加入了layer,layer便处于动画初始状态
kCAFillModeBoth 理解了上面两个,这个就很好理解了,这个其实就是上面两个的合成.动画加入后开始之前,layer便处于动画初始状态,动画结束后layer保持动画最后的状态.
http://blog.csdn.net/yongyinmg/article/details/37931537
3D,顾名思义就是可以在z轴上动作,这里列举三个用例
//用例1 scale
CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D transform = CATransform3DMakeScale(0.5, 0.5, 1.0); //x,y,z放大缩小倍数
NSValue *value = [NSValue valueWithCATransform3D:transform];
[theAnimation setToValue:value];
transform = CATransform3DMakeScale(1.0, 1.0, 1.0);
value = [NSValue valueWithCATransform3D:transform];
[theAnimation setFromValue:value];
[theAnimation setAutoreverses:YES]; //原路返回的动画一遍
[theAnimation setDuration:1.0];
[theAnimation setRepeatCount:2];
[layer addAnimation:theAnimation forKey:nil];
//用例2 rotate
......
CATransform3D transform = CATransform3DMakeRotation(1.57, 1, 1, 0); //1.57表示所转角度的弧度 = 90Pi/180 = 90*3.14/180
NSValue *value = [NSValue valueWithCATransform3D:transform];
[theAnimation setToValue:value];
transform = CATransform3DMakeRotation(0, 1, 1, 0);
value = [NSValue valueWithCATransform3D:transform];
[theAnimation setFromValue:value];
......
//用例3 scale+rotate+position
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"];
CATransform3D rotateTransform = CATransform3DMakeRotation(1.57, 0, 0, -1);
CATransform3D scaleTransform = CATransform3DMakeScale(5, 5, 5);
CATransform3D positionTransform = CATransform3DMakeTranslation(0, 0, 0); //位置移动
CATransform3D combinedTransform =CATransform3DConcat(rotateTransform, scaleTransform); //Concat就是combine的意思
combinedTransform = CATransform3DConcat(combinedTransform, positionTransform); //再combine一次把三个动作连起来
[anim setFromValue:[NSValue valueWithCATransform3D:CATransform3DIdentity]]; //放在3D坐标系中最正的位置
[anim setToValue:[NSValue valueWithCATransform3D:combinedTransform]];
[anim setDuration:5.0f];
[layer addAnimation:anim forKey:nil];
[layer setTransform:combinedTransform]; //如果没有这句,layer执行完动画又会返回最初的state
前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形学,矩阵中m11--m44的各个含义都不清楚,经过几天研究总结如下:(供和我一样的菜鸟学习)
struct CATransform3D
{
CGFloat m11(x缩放), m12(y切变), m13(), m14();
CGFloat m21(x切变), m22(y缩放), m23(), m24();
CGFloat m31(), m32(), m33(), m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。当然,z方向上得有变化才会有透视效果);
CGFloat m41(x平移), m42(y平移), m43(z平移), m44();
};
ps:
整体比例变换时,也就是m11==m22时,若m33>1,图形整体缩小,若0<m33<1,图形整体放大,若m33<0,发生关于原点的对称等比变换。
单设m12或m21的时候是切变效果,当【m12=角度】和【m21=-角度】的时候就是旋转效果了。两个角度值相同。
()空的地方以后补充。
还有,要想使用CATransform3D,必须在工程里导入QuartzCore.framework。然后在文件中
#import <QuartzCore/CATransform3D.h>。
iphone 透视效果(perspective)
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 0.0005; //
透视效果
transform = CATransform3DRotate(transform,(M_PI/180*40), 0, 1, 0);
[piece.layer setTransform:transform];
第二行一定要写在第三行的前面!自己理解!
// // ViewController.m // test_scanAnimation_01 // // Created by admin on 1/13/16. // Copyright © 2016 jeffasd. All rights reserved. // #import "ViewController.h" @interface ViewController () { UIImageView *_bgImageView; UIImageView *_scanningImageView; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; UIImage *bgImage = [UIImage imageNamed:@"zapya_connect_radar"]; NSLog(@"the bgImage size is %@", NSStringFromCGSize(bgImage.size)); _bgImageView = [UIImageView new]; // _bgImageView.frame = CGRectMake(0, 200, self.view.frame.size.width, 300); _bgImageView.frame = CGRectMake(0, 200, bgImage.size.width, bgImage.size.height); _bgImageView.backgroundColor = [UIColor redColor]; [self.view addSubview:_bgImageView]; _bgImageView.image = bgImage; UIImage *scanningImage = [UIImage imageNamed:@"zapya_connect_radar_scanning"]; _scanningImageView = [UIImageView new]; _scanningImageView.frame = _bgImageView.frame; _scanningImageView.image = scanningImage; [self.view addSubview:_scanningImageView]; CABasicAnimation *scannigAnimation = [CABasicAnimation animationWithKeyPath:@"transform"]; // angle:旋转的弧度,所以要把角度转换成弧度:角度 * M_PI / 180。 CATransform3D transform = CATransform3DMakeRotation(90*M_PI/180, 0, 0, 1);//顺时针旋转 transform.m34 = 0.05;// 透视效果 // transform.autoreverses = YES; NSValue *value = [NSValue valueWithCATransform3D:transform]; [scannigAnimation setToValue:value]; scannigAnimation.autoreverses = NO;//原路返回动画一遍 scannigAnimation.duration = 2.0; scannigAnimation.repeatCount = HUGE_VALF; //basicAnimation.repeatCount=HUGE_VALF;//设置重复次数,HUGE_VALF可看做无穷大,起到循环动画的效果 // basicAnimation.removedOnCompletion=NO;//运行一次是否移除动画 scannigAnimation.fillMode = kCAFillModeBackwards; scannigAnimation.cumulative = YES; scannigAnimation.removedOnCompletion = NO; scannigAnimation.delegate = self; [_scanningImageView.layer addAnimation:scannigAnimation forKey:nil]; } #pragma mark - 动画代理方法 #pragma mark 动画开始 -(void)animationDidStart:(CAAnimation *)anim{ // NSLog(@"animation(%@) start.\r_layer.frame=%@",anim,NSStringFromCGRect(_layer.frame)); // NSLog(@"%@",[_layer animationForKey:@"KCBasicAnimation_Translation"]);//通过前面的设置的key获得动画 NSLog(@"%s", __func__); } #pragma mark 动画结束 -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ // NSLog(@"animation(%@) stop.\r_layer.frame=%@",anim,NSStringFromCGRect(_layer.frame)); // _layer.position=[[anim valueForKey:@"KCBasicAnimationLocation"] CGPointValue]; NSLog(@"%s", __func__); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
相关文章推荐
- iOS 初学者关于动态按钮代码创建
- IOS viewWithTag
- iOS:实现邮件和短信发送的简单示例
- Masonry介绍与使用实践
- RDVTabBarController--可自由定制的iOS底部导航控件的使用总结
- iOS7程序后台运行
- iOS小demo之为图层添加图片和边框
- IOS开发常用的开源类库
- ios Xcode7.2下创建本地化语言Localizable.strings
- iOS:延迟加载和上拉刷新/下拉加载的实现
- iOS开发笔记--静态库的制作与使用
- iOS故障排除指南:基本技巧
- 安装iOS开发环境Xcode
- iOS 百度地图_大头针点击_区别点击哪个_点击效果改变
- iOS微更新,热更新,局部更新,bug修复
- iOS小demo之弹出动画
- iOS-图片拉伸技巧
- ios 以后毛玻璃
- ios 指定角度圆角
- iOS图片浏览