iOS高级-QuartzCore框架-CoreAnimation和UIView动画的使用

一、UIView封装的动画
图层动画有2个致命的缺点:
1>默认情况下会反弹。
2>你所看到的动画都是假象,图层的属性一直都没有变过
所以建议能用UIView就用UIView,实在不行再用图层。
1.UIView的移动动画
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[UIView beginAnimations:nil context:nil];
//动画执行完毕后,会自动调用self的animateStop方法(用这种方式监听动画的执行

完毕)
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSecletor:@selector(animateStop)];
self.myView.center = CGPointMake(200,300);
[UIView commitAnimations];
}

2.UIView的转场动画
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[UIView transitionWithView:self.iconView duration:1.0 options:

UIViewAnimationOptionTransitionFlipFromTop animations:nil
completion:nil];
}

二、block动画
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[UIView animateWithDuration:1.0 animations:^{
self.myView.center = CGPointMake(200,300);
} completion:^(BOOL finished) {
//在这里监听动画的执行完毕
}];
}

三、实例:转盘
效果图

1.自定义一个View封装转盘。
2.创建一个xib用来描述转盘。(因为是固定的所以用xib)
3.提供一个类方法快速创建转盘。(在这个方法中加载xib)
+(instancetype)wheel
{
return [[[NSBundle mainBundle] loadNibNamed:@"MJWheel" owner:nil

options:nil] lastObject];
}
4.提供一个方法来设置旋转的动画效果
//开始不停地旋转
-(void)startRotating
{
if (self.link) return;
//1秒刷新60次
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self

selector:@selector(update)];
[link addToRunLoop:[NSRunLoop mainRunLoop]

forMode:NSDefaultRunLoopMode];
}

-(void)update
{
self.centerWheel.transform = CGAffineTrasformRotate:

(self.centerWheel.transform,M_PI /500);
}
PS:因为用核心动画是假象,可能会造成以后点不准,并且进入后台后动画就会停止,

故不采取核心动画这种方式

5.来到控制器的viewDidLoad中,调用类方法创建转盘
{
[super viewDidLoad];
MJWheel *wheel = [MJWheel wheel];
wheel.center = CGPointMake(self.view.frame.width *

0.5,self.view.frame.height * 0.5);
[wheel startRotating];
[self.view addSubview:wheel];
}

6.来到MJWheel,重写awakeFromNib方法(在这个方法里添加按钮)
//在这个方法中取得属性才是有值的
-(void)awakeFromNib
{
//imageView默认不能与用户交互,所以先设置为YES
self.centerWheel.userInteractionEnabled = YES;

//加载大图片
UIImage *bigImage = [UIImage imageNamed:LuckyAstrology];
UIImage *bigImageSelected = [UIImage imageNamed:LuckyAstrologyP];

//从大图片中裁剪出对应星座的图片
CGFloat smallW = bigImage.size.width / 12 * [UIScreen mainScreen].scale;
CGFloat smallH = bigImage.size.height * [UIScreen mainScreen].scale;

for(int index = 0; index<12; index++) {
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

CGRect smallRect = CGRectMake(index * smallW,0,smallW,smallH);

//CGImageCreateWithImageInRect:方法只认像素
CGImageRef smallImage = CGImageCreateWithImageInRect:

(bigImage.CGImage, smallRect);
CGImageRef smallImageSelected = CGImageCreateWithImageInRect:

(bigImageSelected.CGImage, smallRect);

[btn setImage:[UIImage imageWithCGImage:smallImage]

forState:UIControlStateNormal];
[btn setImage:[UIImage imageWithCGImage:smallImage]

forState:UIControlStateSelected];
[btn setBackgroundImage:[UIImage

imageNmaed:@"LuckyRototeSelected"] forState:UIControlSatateSelected];

btn.bounds = CGRectMake(0,0,68,143);

//设置锚点和位置
btn.layer.anchorPoint = CGPointMake(0.5,1);
btn.layer.position = CGPointMake(self.centerWheel.frame.size.width

*0.5,self.centerWheel.frame.size.height *0.5);

//设置旋转角度(绕着锚点进行旋转)
CGFloat angle = (30 * index) / 180.0 *M_PI;
btn.transform = CGAffineTransformMakeRotation(angle);

//监听按钮点击
[btn addTarget:self action:@selector(btnClick:)

forControlEvents:UIControlEventTouchDown];

[self.centerWheel addSubview:btn];

if (index == 0) {
[self btnClick:btn];
}
}
}

注意点:UIImage是按点来算的,CGImage是按像素来算的,后者是前者的2倍。
7.添加一个Button属性selectedBtn保存被选中的按钮
实现监听方法
-(void)btnClick:(UIButton *)btn
{
self.selectedBtn.selected = NO;
btn.selected = YES;
self.selectedBtn = btn;
}

8.调整按钮内部imageView的大小
1>自定义UIButton
2>重写imageRectForContextRect:方法
{
CGFloat imageW = 40;
CGFloat imageH = 47;
CGFloat imageX = (contentRect.size.width - imageW) * 0.5;
CGFloat imageY = 20;

return CGRectMake(imageX,imageY,imageW,imageH);
}
3>长按按钮不想让它变灰---重写setHighlighted:方法(什么都不用写)

9.开始选号
1>监听开始选号按钮并实现方法

时间: 2024-10-21 06:23:25

iOS高级-QuartzCore框架-CoreAnimation和UIView动画的使用的相关文章

iOS高级-QuartzCore框架-CALayer图层

掌握CALayer的基本属性CALayer和UIView的关系position和anchorPoint的作用 CALayer CALayer的基本使用 CALayer的属性 //边框宽度(从Layer里面圈出一块出来作为边框)self.purpleView.layer.borderWidth = 10;//边框颜色self.purpleView.layer.borderColor = [UIColor redColor] .CGColor;//圆角self.purpleView.layer.co

iOS高级-QuartzCore框架-2D绘图

一.理论知识什么是Quartz2D Quartz2D实例 Quartz2D在iOS开发中的价值 图形上下文 自定义View drawRect:方法 绘图顺序(后盖前) Quartz2D须知 二.画线段1.新建一个类MJLineView,继承自UIView.2.拖一个UIView,Class为MJLineView3.在drawRect:方法里画图-(void)drawRect:(CGRect)rect{ //1.获得图形上下文 CGContextRef ctx = UIGraphicsGetCur

iOS高级-QuartzCore框架-图形上下文栈、矩阵操作、裁剪、重绘(刷帧)

一.图形上下文栈1.自定义一个MJView,继承自UIView2.将默认View的Class设置为MJView3.实现drawRect:方法-(void)drawRect:(CGRect)rect{ //1.获得上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(): //将当前的ctx拷贝一份放到栈中 CGContextSaveGState(ctx): //设置绘图状态 CGContextSetLineWidth(ctx,10): [[UICo

iOS高级-QuartzCore框架-2D绘图-实例:小黄人

#define MJColor(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] 1.自定义一个MJHumanView,继承自UIView2.默认View(整一个View)的Class设置为MJHumanView3.实现drawRect:方法-(void)drawRect:(CGRect)rect{ //1.上下文 CGContextRef ctx = UIGraphicsGetCur

iOS动画和特效(一)UIView动画和CoreAnimation

一个简单的例子作为iOS动画系类的开始 QuickExampleViewController UIView的方法中有几个易用的静态方法可以做出动画效果,分别是UIView.beginAnimations() -> UIView.commitAnimations() 和UIView.animateWithDuration()方法 我们以一个UIView,每点击一次向右移动100,变色,加速运动这个简单的动效作为例子. 转载请注明出处 使用UIView.beginAnimations() -> U

iOS UIView动画详解

现在的iOS开发中,有很多的动画框架可以使用,包括苹果自带的CoreAnimation框架,Facebook的Pop等等,这些的确都是程序员的利器.但是如果我们仅仅是想要实现一些比较简单的动画呢?杀鸡焉用牛刀.我们直接用UIView就可以了.今天我们就来好好聊聊UIView动画,使用Swift编写(大家可以看到我有时候用OC,有时候用Swift,现在的iOS学习的基本技能看着OC代码能写出Swift,照着Swift能写出OC,哈哈).本示例代码上传至  https://github.com/ch

iOS核心动画以及UIView动画的介绍

我们看到很多App带有绚丽狂拽的特效,别出心裁的控件设计,很大程度上提高了用户体验,在增加了实用性的同时,也赋予了app无限的生命力.这些华丽的效果很多都是基于iOS的核心动画原理实现的,本文介绍一些iOS开发中最基本的动画效果实现,掌握了基本属性,才可以绘制出更华丽的效果. 一.概念扩充  1.核心动画: Core Animation,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍. Core Animation可以用在Mac OS X和iOS平台.在iO

iOS UIView动画详解(Objective-C)

我在之前的一篇博客中<iOS UIView动画详解(Swift)>讲解了使用Swift来实现UIView类下面提供的多种动画效果,如位置动画.旋转动画.缩放动画.颜色动画.透明度动画等等.为了这个题目的完整性,今天我使用Objective-C来完全重写以上的所有的动画.项目案例已经上传至:https://github.com/chenyufeng1991/iOS-UIView-Animation  中的Animation-OC文件夹下,另一个目录下则是Swift实现的动画. (1)位置动画 P

iOS开发UIView动画的使用方法

一.使用UIView类实现动画 基本写法,代码必须放在Begin和Commit之间: [UIView beginAnimations:nil context:nil]; // 开始动画 // Code... [UIView commitAnimations]; // 提交动画 简单例子: [UIView beginAnimations:nil context:nil]; // 开始动画 [UIView setAnimationDuration:10.0]; // 动画时长 /** * 图像向下移