iOS layer

iOS layeriOS layer

 //捏合手势方法。

-(void)pinchAction:(id)sender{

    NSLog(@"捏合");

    UIPinchGestureRecognizer *pin=(UIPinchGestureRecognizer *)sender;

//    self.myImageV.transform=CGAffineTransformMakeScale(pin.scale, pin.scale);

    pin.view.transform = CGAffineTransformScale(pin.view.transform, pin.scale, pin.scale);

    pin.scale = 1;

    

    float tempF = self.myImageV.size.height/self.myImageV.size.width;

    if (self.myImageV.size.width<150) {

        self.myImageV.size = CGSizeMake(150, 150*tempF);

    }

    

}

#if 0

//1iOS-对CALayer的最简单使用

iOS的Core Animation,有很多概念,包括Layer(层)、Animation(动画)和Timing(时序)、Layout(布局)和constraint(约束)、Transaction(处理)。其中Layer是最基础的。

Layer有多种,最基本的是CALayer,它也是其他种类Layer的父类。CALayer的子类有:

CAScrollLayer,用于简化显示层的一部分

CATextLayer,便于从字符串生成内容是文本的层

CATiledLayer,可用于显示复杂的图片

CAOpenGLLayer,提供OpenGLES渲染环境

Core Animation是基于QuartzCore的,需要在项目中引入框架

编写iOS视图UIView的动画效果需要很多代码,虽然iOS 4支持块定义,对视图动画的定义减少了不少代码,但语法依旧不好看。CPAnimationSequence是一个开源代码库,可以一种间接快捷的方式来定义描述动画队列,克服了写繁多的代码。下面一个使用例子:

查看源码打印?

01

CPAnimationSequence* shakespeare = [CPAnimationSequence sequenceWithSteps:

02

[CPAnimationStep for:0.2 animate:^{ self.romeo.alpha = 1.0; }],

03

[CPAnimationStep for:0.2 animate:^{ self.julia.alpha = 1.0; }],

04

[CPAnimationStep after:1.0 for:0.7 animate:^{

05

CGPoint love = CGPointMake((self.romeo.center.x + self.julia.center.x)/2,

06

(self.romeo.center.y + self.julia.center.y)/2);

07

self.romeo.center = love;

08

self.julia.center = love;

09

}],

10

[CPAnimationStep after:2.0 for:0.5 animate:^{ self.romeo.alpha = 0.0;

11

self.julia.alpha = 0.0; }]

12

nil];

13

[shakespeare run];

官方网站:http://www.open-open.com/lib/view/home/1326072094546

-(void)loadSimpleImageAnimation{

//创建图片对象

UIImage *image = [UIImage imageNamed:@"6.png"];

//创建层

CALayer *layer = [CALayer layer];

layer.backgroundColor = [[UIColor blackColor] CGColor];//设置背景色

layer.bounds = CGRectMake(0, 0, image.size.width,image.size.height);//层设置为图片大小

layer.contents = (id)[image CGImage];//层的内容设置为图片

layer.position = CGPointMake(1024/2 , 768/2);//层在view的位置

[self.view.layer addSublayer:layer];//将层加到当前View的默认layer下

[layer release];

[image release];

}

第二种方式相对复杂一些,但如果更好的进行控制,还是使用这种方法吧,

基本使用方法可以看一下如下例子:

CATransition *animation = [CATransition animation];

[animation setDuration:1.25f];

[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];

[animation setType:kCATransitionReveal];

[animation setSubtype: kCATransitionFromBottom];

[self.view.layer addAnimation:animation forKey:@"Reveal"];

这里使用了setType与setSubtype组合,这使用个比较保险,因为他的参数就是官方API里定义的,他们的参数说明可以参考如下:

[animation setType:@"suckEffect"];

这里的suckEffect就是效果名称,可以用的效果主要有:

rippleEffect 滴水效果

suckEffect 收缩效果,如一块布被抽走

cube 立方体效果

oglFlip 上下翻转效果

最后再给出一种常用代码供大家参考。

CATransition *animation = [CATransition animation];

[animation setDuration:0.35];

[animation setTimingFunction:UIViewAnimationCurveEaseInOut];

if (!curled)

{

//animation.type = @"mapCurl";

animation.type = @"pageCurl";

animation.fillMode = kCAFillModeForwards;

animation.endProgress = 0.99;

} else {

//animation.type = @"mapUnCurl";

animation.type = @"pageUnCurl";

animation.fillMode = kCAFillModeBackwards; animation.startProgress = 0.01;

}

[animation setRemovedOnCompletion:NO];

[view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];

[view addAnimation:animation forKey"pageCurlAnimation"];

// Disable user interaction where necessary

if (!curled) {

}

else {

}

curled = !curled;

一.基本方式:使用UIView类的UIViewAnimation扩展

函数说明

+ (void)beginAnimations:(NSString *)animationID context:(void *)context; // 开始准备动画

+ (void)commitAnimations; // 运行动画

// 没有get方法,下面的set在快外调用无效

+ (void)setAnimationDelegate:(id)delegate; // 委托default = nil

+ (void)setAnimationWillStartSelector:(SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context

+ (void)setAnimationDidStopSelector:(SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

+ (void)setAnimationDuration:(NSTimeInterval)duration; // default = 0.2动画时间

+ (void)setAnimationDelay:(NSTimeInterval)delay; // default = 0.0延迟多少时间开始执行动画

+ (void)setAnimationStartDate:(NSDate *)startDate; // default = now ([NSDate date])动画开始日期?不知道啥用.- -

+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // default = UIViewAnimationCurveEaseInOut动画方式

+ (void)setAnimationRepeatCount:(float)repeatCount; // default = 0.0. May be fractional重复次数

+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO. YES的话,动画(非最后一次)结束后动态复原到最开始状态

+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO. YES,停止之前的动画,从现在这里开始新动画the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default).

+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // 添加动画到view上,cache是YES的时候比较高效,但是动画过程中不能更新界面上的内容,NO时每一帧都重新画,可以实时更新

+ (void)setAnimationsEnabled:(BOOL)enabled; // 是否忽略一些动画设置

+ (BOOL)areAnimationsEnabled;

一个动画的代码

[UIView beginAnimations:nil context:nil];

[UIView setAnimationCurve:UIViewAnimationCurveLinear];

[UIView setAnimationDuration:2.7];

[UIView setAnimationTransition:transition forView:self.view cache:YES];

// operation>>>

[self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];

// end<<<<<<

[UIView commitAnimations];

其中transition取值范围

typedefenum {

UIViewAnimationTransitionNone,

UIViewAnimationTransitionFlipFromLeft,

UIViewAnimationTransitionFlipFromRight,

UIViewAnimationTransitionCurlUp,

UIViewAnimationTransitionCurlDown,

} UIViewAnimationTransition;

特点:基础,使用方便,但是效果有限

二.block方式:使用UIView类的UIViewAnimationWithBlocks扩展

函数说明

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);//间隔,延迟,动画参数(好像没用?),界面更改块,结束块

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // delay = 0.0, options = 0

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // delay = 0.0, options = 0, completion = NULL

+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // toView added to fromView.superview, fromView removed from its superview界面替换,这里的options参数有效

举例:

[UIView animateWithDuration:0.7 delay:0 options:0 animations:^(){

self.view.alpha = 0.2;

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];

self.view.alpha = 1;

} completion:^(BOOL finished)

{

}];

当areAnimationsEnabled为NO时,上面不能动画显示

[UIView transitionFromView:lImage toView:mImage duration:0.7 options:options completion:^(BOOL finished)

{

if (finished) {

[self.view addSubview:lImage];

[self.view sendSubviewToBack:lImage];

[self.view sendSubviewToBack:mImage];

}

}];

options取值范围

enum {

UIViewAnimationOptionLayoutSubviews = 1 << 0,

UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animating

UIViewAnimationOptionBeginFromCurrentState = 1 << 2, // start all views from current value, not initial value

UIViewAnimationOptionRepeat = 1 << 3, // repeat animation indefinitely

UIViewAnimationOptionAutoreverse = 1 << 4, // if repeat, run animation back and forth

UIViewAnimationOptionOverrideInheritedDuration = 1 << 5, // ignore nested duration

UIViewAnimationOptionOverrideInheritedCurve = 1 << 6, // ignore nested curve

UIViewAnimationOptionAllowAnimatedContent = 1 << 7, // animate contents (applies to transitions only)

UIViewAnimationOptionShowHideTransitionViews = 1 << 8, // flip to/from hidden state instead of adding/removing

UIViewAnimationOptionCurveEaseInOut = 0 << 16, // default

UIViewAnimationOptionCurveEaseIn = 1 << 16,

UIViewAnimationOptionCurveEaseOut = 2 << 16,

UIViewAnimationOptionCurveLinear = 3 << 16,

UIViewAnimationOptionTransitionNone = 0 << 20, // default

UIViewAnimationOptionTransitionFlipFromLeft = 1 << 20,

UIViewAnimationOptionTransitionFlipFromRight = 2 << 20,

UIViewAnimationOptionTransitionCurlUp = 3 << 20,

UIViewAnimationOptionTransitionCurlDown = 4 << 20,

UIViewAnimationOptionTransitionCrossDissolve = 5 << 20,//ios5

UIViewAnimationOptionTransitionFlipFromTop = 6 << 20,//ios5

UIViewAnimationOptionTransitionFlipFromBottom = 7 << 20,//ios5

};

typedef NSUInteger UIViewAnimationOptions;

特点:快捷方便,效果更多.可以如上示例1那样实现界面个元素属性渐进变化的动态展示

三.core方式:使用CATransition类

使用要引入QuartzCore.framework

官方有个示例:ViewTransitions

基本上就是

CATransition *transition = [CATransition animation];

transition.duration = 0.7;

transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

transition.type = kCATransitionMoveIn;//{kCATransitionMoveIn, kCATransitionPush, kCATransitionReveal, kCATransitionFade};

//更多私有{@"cube",@"suckEffect",@"oglFlip",@"rippleEffect",@"pageCurl",@"pageUnCurl",@"cameraIrisHollowOpen",@"cameraIrisHollowClose"};

transition.subtype = kCATransitionFromLeft;//{kCATransitionFromLeft, kCATransitionFromRight, kCATransitionFromTop, kCATransitionFromBottom};

transition.delegate = self;

[self.view.layer addAnimation:transition forKey:nil];

// 要做的

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];

UIView *aView=[[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]autorelease];

[self.view addSubview:aView];

//如果单纯的用UITouch 的时候只能用上面的,不能用下面的。

self.view=[[[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]autorelease];

//2

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch=[touches anyObject];

CGRect frame1=touch.view.frame;

CGRect frame2=bView.frame;

if (frame1.origin.x==frame2.origin.x) {

//旋转。。

CGAffineTransform transform;

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:2];

transform=CGAffineTransformRotate(bView.transform, M_PI/3);//相对的。

// transform=CGAffineTransformMakeRotate(M_PI/3);//这里是绝对的。

bView.transform=transform;

[UIView commintModelAnimations];

//还原.

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:2];

bView.transform=CGAffineTransformMakeScale(1.0f, 1.0f);

[UIView commintModelAnimations];

//翻转。

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:2];

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:bView cache:YES];

[UIView commintModelAnimations];

}

}

//3,用层,时需要QuartzCore/QuartzCore.h框架。

RootViewController *rootVC=[[RootViewController alloc] init];

self.window.rootViewController=rootVC;

[rootVC release];

//4用一个代理和一个类目实现顺序执行动画。

@interface UIViewDelegate : NSObject

{

CFRunLoopRef currentLoop;

}

-(id)initWithRunLoop:(CFRunLoopRef)runLoop;

-(void)animationFinished:(id)sender;

@end

@implementation UIViewDelegate

-(id)initWithRunLoop:(CFRunLoopRef)runLoop

{

self=[super init];

if (self) {

currentLoop=runLoop;

}

returnself;

}

-(void)animationFinished:(id)sender

{

CFRunLoopStop(currentLoop);

}

@end

@interface UIView (ModalAnimationHelper)

+(void)commintModelAnimations;

@end

#import "UIView+ModalAnimationHelper.h"

#import "UIViewDelegate.h"

@implementation UIView (ModalAnimationHelper)

+(void)commintModelAnimations

{

CFRunLoopRef currentLoop=CFRunLoopGetCurrent();

UIViewDelegate *uivdelegete=[[UIViewDelegate alloc] initWithRunLoop:currentLoop];

[UIView setAnimationDelegate:uivdelegete];

[uivdelegete release];

[UIView setAnimationDidStopSelector:@selector(animationFinished:)];

[UIView commitAnimations];

CFRunLoopRun();

}

@end

//5按钮控制的图片组合的动画。

self.view=[[[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds]autorelease];

[self.view setBackgroundColor:[UIColor grayColor]];

imageView=[[UIImageView alloc]initWithFrame:CGRectMake(50, 50, 200, 300)];

images=[[NSMutableArray alloc]initWithCapacity:8];

for (int i=0;i<8; i++) {

UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"h%d.jpeg",i+1]];

[images addObject:image];

}

imageView.animationImages=images;

[images release];

imageView.animationDuration=8;

//创建开始按钮。

UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];

button.frame=CGRectMake(100, 400, 150, 50);

[button setTitle:@"开始/停止" forState:UIControlStateNormal];

[button addTarget:self action:@selector(doStartOrStop) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:button];

[self.view addSubview:imageView];

[imageView release];

}

-(void)doStartOrStop{

if (m==0) {

[imageView startAnimating];

m=1;

}

else{

[imageView stopAnimating];

m=0;

}

}

//6触摸事件。

1.单击缩小视图。:

CGRect myFrame = self.view.frame;

myFrame.size.width -= self.frame.size.width * 0.1;

myFrame.size.height -= self.frame.size.height * 0.1;

myFrame.origin.x += (self.frame.origin.x * 0.1) / 2.0;

myFrame.origin.y += (self.frame.origin.y * 0.1) / 2.0;

[UIView beginAnimations:nil context:NULL];

[self.view setFrame:myFrame];

[UIView commitAnimations];

2.移动

UITouch *theTouch=[touches anyObject];

CGPoint currentTouchPosition=[theTouch locationInView:self];

if ((fabs(startTouchPosition.x-currentTouchPosition.x)>4&&fabs(startTouchPosition.y-currentTouchPosition.y)<=12)) {

if (startTouchPosition.x<currentTouchPosition.x) {

NSLog(@"swipe to right");

}

else{

NSLog(@"swipe to left");

}

}

CGPoint prevTouchPosition=[theTouch previousLocationInView:self];

CGRect viewFrame=self.frame;

float deltaX=currentTouchPosition.x-prevTouchPosition.x;

float deltaY=currentTouchPosition.y-prevTouchPosition.y;

viewFrame.origin.x+=deltaX;

viewFrame.origin.y+=deltaY;

[self setFrame:viewFrame];

UITouch *theTouch = [touches anyObject];

if (theTouch.tapCount == 2) {

[NSObject cancelPreviousPerformRequestsWithTarget:self];

}

startTouchPosition=[theTouch locationInView:self];

UIPinchGestureRecognizer *pinch=[[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(doPinch:)]autorelease];

[self addGestureRecognizer:pinch];

if (pinch.state==UIGestureRecognizerStateBegan) {

initialFontSize=label.font.pointSize;

}

else{

// label.font=[label.font fontWithSize:initialFontSize *pinch.scale];

self.frame=CGRectMake(self.frame.origin.x * pinch.scale,self.frame.origin.y * pinch.scale , self.frame.size.width *pinch.scale , self.frame.size.height *pinch.scale);

}

//7

//画一个正方形没有边框。

CGContextSetRGBFillColor(context, 0, 0.25, 0, 0.5);//创建设置颜色。最后一位是透明度。

CGContextFillRect(context, CGRectMake(2, 2, 70, 70));

CGContextStrokePath(context);

//写文字

CGContextSetLineWidth(context, 1.0);

CGContextSetRGBFillColor (context, 1, 1, 1, 1.0);

UIFont *font = [UIFont boldSystemFontOfSize:11.0];

[@"刘德华" drawInRect:CGRectMake(40, 40, 80, 20) withFont:font];

//画一条线

CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 0.5);//线条颜色

CGContextMoveToPoint(context, 20, 20);

CGContextAddLineToPoint(context, 200,20);

CGContextStrokePath(context);

//画正方形边框

CGContextSetRGBStrokeColor(context, 1, 1.0, 1.0, 1.0);

CGContextSetLineWidth(context, 2.0);

CGContextAddRect(context, CGRectMake(200, 200, 70, 70));

CGContextStrokePath(context);

CGContextDrawPath(context, kCGPathFillStroke);

//画一条线

CGContextSetRGBStrokeColor(context, 0.5, 0.5, 0.5, 0.5);//线条颜色

CGContextMoveToPoint(context, 20, 20);

CGContextAddLineToPoint(context, 200,20);

CGContextStrokePath(context);

//8 关灯游戏。

-(void)drawRect:(CGRect)rect{

//循环生成28个view。

for (int i=1; i<=54; i++) {

UIView *xiaoDengView=[[UIView alloc]init];

xiaoDengView.tag=i;

if (m==6) {

m=0;

n++;

}

xiaoDengView.frame=CGRectMake(79*m-150, 0+64*n-125, 70, 46);

xiaoDengView.backgroundColor=[UIColor redColor];

m++;

[self addSubview:xiaoDengView];

}

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

UITouch *theTouch=[touches anyObject];

a=theTouch.view.tag;//确定视图标签。

if (theTouch.tapCount==1) {

UIView *view1=[self viewWithTag:a];

UIView *view2=[self viewWithTag:(a+1)];

UIView *view3=[self viewWithTag:(a-1)];

UIView *view4=[self viewWithTag:(a+6)];

UIView *view5=[self viewWithTag:(a-6)];

//分别判断5个视图。

if ([view1.backgroundColor isEqual:[UIColor redColor]]) {

view1.backgroundColor=[UIColor blueColor];

}

else if([view1.backgroundColor isEqual:[UIColor blueColor]]){

view1.backgroundColor=[UIColor redColor];

}.......

}

}

//9轻拍",@"长按",@"轻扫",@"旋转",@"捏合",@"拖拽"

self.imageView=[[[UIImageView alloc]initWithFrame:CGRectMake(50, 40, 220, 320)]autorelease];

self.imageView.image=[UIImage imageNamed:@"h1.jpeg"];

self.imageView.userInteractionEnabled=YES;

[self.view addSubview:self.imageView];

//创建一个数组,该数组用于显示到segment上的文字。//单选按钮。

NSArray *titles=[NSArray arrayWithObjects:@"轻拍",@"长按",@"轻扫",@"旋转",@"捏合",@"拖拽",nil];

//创建UISegmentControl

UISegmentedControl *segment=[[UISegmentedControl alloc]initWithItems:titles];

segment.frame=CGRectMake(0, 420, 320, 40);

//为UISegmentControl添加方法。

segment.selectedSegmentIndex=0;

[segment addTarget:self action:@selector(clickSegment:) forControlEvents:UIControlEventValueChanged];

[self.view addSubview:segment];

[segment release];

//设置默认。

//创建轻拍手势,指定轻拍响应方法。

UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];

tap.numberOfTapsRequired=1;//默认为1.表示点击的次数。

//为imageView添加手势

[self.imageView addGestureRecognizer:tap];

[tap release];

//动画按钮。

UIButton *startButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];

startButton.frame=CGRectMake(50, 370, 100, 40);

[startButton addTarget:self action:@selector(startAction:) forControlEvents:UIControlEventTouchUpInside];

[startButton setTitle:@"动画开始" forState:UIControlStateNormal];

[self.view addSubview:startButton];

UIButton *stopButton=[UIButton buttonWithType:UIButtonTypeRoundedRect];

stopButton.frame=CGRectMake(170, 370, 100, 40);

[stopButton addTarget:self action:@selector(stopAction:) forControlEvents:UIControlEventTouchUpInside];

[stopButton setTitle:@"动画停止" forState:UIControlStateNormal];

[self.view addSubview:stopButton];

//动画播放速度。

UISlider *slider=[[UISlider alloc]initWithFrame:CGRectMake(60, 5, 200, 20)];

slider.minimumValue=0.1;

slider.maximumValue=1.0;

slider.value=1;

[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventTouchUpInside];

[self.view addSubview:slider];

[slider release];

}

-(void)clickSegment:(id)sender{

UISegmentedControl *segment=(UISegmentedControl *)sender;

//移除手势

for (UIGestureRecognizer *ges in self.imageView.gestureRecognizers) {

[self.imageView removeGestureRecognizer:ges];

}

//添加新的手势。

switch (segment.selectedSegmentIndex) {

case 0:

{

//创建轻拍手势,指定轻拍响应方法。

UITapGestureRecognizer *tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];

tap.numberOfTapsRequired=1;//默认为1.表示点击的次数。

//为imageView添加手势

[self.imageView addGestureRecognizer:tap];

[tap release];

}

break;

case 1:

{

//长按手势

UILongPressGestureRecognizer *longPress=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction:)];

[self.imageView addGestureRecognizer:longPress];

[longPress release];

}

break;

case 2:

{

//轻扫。

// for (int i=1; i<=8; i=i*2) {

// UISwipeGestureRecognizer *swip=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];

// swip.direction=i;

// [self.imageView addGestureRecognizer:swip];

// [swip release];

// }

}

break;

case 3:

{

//旋转。

UIRotationGestureRecognizer *rotation=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationAction:)];

rotation.rotation=9;//旋转的弧度。

[self.imageView addGestureRecognizer:rotation];

[rotation release];

}

break;

case 4:

{

//捏合。

UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAction:)];

[self.imageView addGestureRecognizer:pinch];

[pinch release];

}

break;

case 5:

{

//拖拽。

UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];

[self.imageView addGestureRecognizer:pan];

[pan release];

}

break;

default:

break;

}

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

UITouch *touch=[touches anyObject];

startPoint=[touch locationInView:self.view];

}

//-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

// UITouch *touch=[touches anyObject];

// CGPoint currentPoint=[touch locationInView:self.view];

// if (fabs(startPoint.x-currentPoint.x)>=4&&(fabs(startPoint.y-currentPoint.y)<=12)) {

// NSLog(@"轻扫");

// NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];

// self.imageView.image=[UIImage imageNamed:imageName];

// }

//}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch=[touches anyObject];

CGPoint currentPoint=[touch locationInView:self.view];

if (fabs(startPoint.x-currentPoint.x)>=4&&(fabs(startPoint.y-currentPoint.y)<=12)) {

NSLog(@"轻扫");

NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];

self.imageView.image=[UIImage imageNamed:imageName];

}

}

//轻拍手势方法。

-(void)tapAction:(id)sender{

NSLog(@"轻拍");

NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];

self.imageView.image=[UIImage imageNamed:imageName];

}

//长按手势方法。

-(void)longPressAction:(id)sender{

NSLog(@"长按");

NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];

self.imageView.image=[UIImage imageNamed:imageName];

}

//轻扫手势方法。

-(void)swipeAction:(id)sender{

NSLog(@"轻扫");

NSString *imageName=[NSString stringWithFormat:@"h%d.jpeg",arc4random()%7+1];

self.imageView.image=[UIImage imageNamed:imageName];

}

//旋转手势方法。

-(void)rotationAction:(id)sender{

NSLog(@"旋转");

UIRotationGestureRecognizer *ro=(UIRotationGestureRecognizer *)sender;

self.imageView.transform=CGAffineTransformMakeRotation(ro.rotation);

}

//捏合手势方法。

-(void)pinchAction:(id)sender{

NSLog(@"捏合");

UIPinchGestureRecognizer *pin=(UIPinchGestureRecognizer *)sender;

self.imageView.transform=CGAffineTransformMakeScale(pin.scale, pin.scale);

}

//拖拽手势方法。

-(void)panAction:(id)sender{

NSLog(@"拖拽");

UIPanGestureRecognizer *pan=(UIPanGestureRecognizer *)sender;

if (pan.state==UIGestureRecognizerStateBegan) {//拖拽开始。

//记录最初的坐标点。

oldPoint=[pan locationInView:self.view];

}

//当前的坐标点,并计算偏移量。

CGPoint newPoint=[pan locationInView:self.view];

CGFloat offSetX=newPoint.x-oldPoint.x;

CGFloat offSetY=newPoint.y-oldPoint.y;

//为ImageView的中心赋值。

self.imageView.center=CGPointMake(pan.view.center.x+offSetX, pan.view.center.y+offSetY);

//保留已经用过的坐标点。

oldPoint =newPoint;

}

//开始动画。

-(void)startAction:(id)sender{

//创建数组,保存一组图片。

NSMutableArray *mArray=[[NSMutableArray alloc]init];

for (int i=1; i<=6; i++) {

NSString *imageName=[[NSString alloc]initWithFormat:@"run%d.tiff",i];

UIImage *image=[UIImage imageNamed:imageName];

[mArray addObject:image];

[imageName release];

}

//为imageView的动画图片数组赋值。

self.imageView.animationImages=mArray;

//设定事件,默认持续时间

self.imageView.animationDuration=3;

//播放动画

[self.imageView startAnimating];

}

-(void)stopAction:(id)sender{

//动画停止。

[self.imageView stopAnimating];

}

//加速控制UISlider的方法。

-(void)sliderAction:(id)sender{

UISlider *slider=(UISlider *)sender;

//判断imageView动画是否开始。

if ([self.imageView isAnimating]) {

[self.imageView stopAnimating];

self.imageView.animationDuration=slider.value;

[self.imageView startAnimating];

}

}

//10不同先画画,小鸟会走。

smallImage =[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];

smallImage.image=[UIImage imageNamed:@"鸟.png"];

[self addSubview:smallImage];

[smallImage release];

UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];

button.frame=CGRectMake(250, 320, 60, 40);

[button setTitle:@"走" forState:UIControlStateNormal];

[button addTarget:self action:@selector(doFlay) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:button];

// [button release];//没有初始化时候,release就没有了。

// Initialization code

lineArray =[[NSMutableArray alloc]init];

colorArray=[[NSMutableArray alloc]init];

color=0;

//初始化两个按钮。

UIButton *btn1=[[UIButton alloc]initWithFrame:CGRectMake(250, 420, 70, 40)];

[btn1 setTitle:@"撤销" forState:UIControlStateNormal];

[btn1 addTarget:self action:@selector(undo) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:btn1];

UIButton *btn2=[[UIButton alloc]initWithFrame:CGRectMake(20, 420, 70, 40)];

[btn2 setTitle:@"重新画" forState:UIControlStateNormal];

[btn2 addTarget:self action:@selector(undoAll) forControlEvents:UIControlEventTouchUpInside];

[self addSubview:btn2];

//初始化segment

NSArray *titles=[[NSArray alloc]initWithObjects:@"红",@"绿",@"蓝", nil];

UISegmentedControl *segment=[[UISegmentedControl alloc]initWithItems:titles];

segment.frame=CGRectMake(0, 380, 320, 40);

[segment addTarget:self action:@selector(segment:) forControlEvents:UIControlEventValueChanged];

[self addSubview:segment];

[segment release];

}

returnself;

}

- (void)drawRect:(CGRect)rect

{

//开始画画了。

context =UIGraphicsGetCurrentContext();

for (int i=0; i<[lineArray count]; i++) {

pointArray =[lineArray objectAtIndex:i];

if ([[colorArray objectAtIndex:i]intValue]==0) {

CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);

}

if ([[colorArray objectAtIndex:i]intValue]==1) {

CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);

}

if ([[colorArray objectAtIndex:i]intValue]==2) {

CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

}

CGContextSetLineWidth(context, 4.0f);

if ([pointArray count]>1) {

for (int j=0; j<[pointArray count]-1; j++) {

NSValue *a=[pointArray objectAtIndex:j];

CGPoint c=[a CGPointValue];

NSValue *b=[pointArray objectAtIndex:j+1];

CGPoint d=[b CGPointValue];

CGContextMoveToPoint(context, c.x, c.y);

CGContextAddLineToPoint(context, d.x, d.y);

}

}

CGContextStrokePath(context);

}

}

-(void)doFlay{//设置经过的点。也就是路径。

CAKeyframeAnimation *animation=[CAKeyframeAnimation animationWithKeyPath:@"position"];

// NSArray *values=[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(100, 20)],[NSValue valueWithCGPoint:CGPointMake(40, 80)],[NSValue valueWithCGPoint:CGPointMake(30, 60)],[NSValue valueWithCGPoint:CGPointMake(20, 40)],[NSValue valueWithCGPoint:CGPointMake(0, 10)], nil];

NSArray *values=[NSArray arrayWithArray:pointArray];

[animation setValues:values];

[animation setDuration:4.0];

// [animation setDelegate:self];

// [bigImage.layer addAnimation:animation forKey:@"image-position"];

[smallImage.layer addAnimation:animation forKey:@"image-position"];

}

-(void)undo{

[lineArray removeLastObject];

[colorArray removeLastObject];

[self setNeedsDisplay];

}

-(void)undoAll{

[lineArray removeAllObjects];

[colorArray removeAllObjects];

[self setNeedsDisplay];

}

-(void)segment:(id)sender{

UISegmentedControl *tempSegment=(UISegmentedControl *)sender;

color=tempSegment.selectedSegmentIndex;

}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

UITouch *touch=[touches anyObject];

firstPoint=[touch locationInView:self];

pointArray=[[NSMutableArray alloc]init];

[lineArray addObject:pointArray];

[colorArray addObject:[NSNumber numberWithInt:color]];

[pointArray release];

}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{

UITouch *touch=[touches anyObject];

lastPoint=[touch locationInView:self];

NSValue *value=[NSValue valueWithCGPoint:lastPoint];

pointArray =[lineArray lastObject];

[pointArray addObject:value];

// [self setNeedsDisplayInRect:CGRectMake(firstPoint.x, firstPoint.y, lastPoint.x-firstPoint.x, lastPoint.y-firstPoint.y)];

[self setNeedsDisplay];

}

//11唐老师最后一节课层动画。

bigImage=[[UIImageView alloc]initWithFrame:CGRectMake(20, 20, 150, 250)];

NSString *str=[[NSBundle mainBundle]pathForResource:@"气球" ofType:@"png"];

bigImage.image=[UIImage imageWithContentsOfFile:str];

[self.view addSubview:bigImage];

[bigImage release];

smallImage=[[UIImageView alloc]initWithFrame:CGRectMake(0, 80, 30, 30)];

smallImage.image=[UIImage imageNamed:@"鸟.png"];

[bigImage addSubview:smallImage];

[smallImage release];

//layer

[bigImage.layer setCornerRadius:20];/////////图上是绿矩形的角平滑度。

[bigImage.layer setShadowColor:[UIColor blackColor].CGColor];//阴影颜色。

//bigImage.layer.masksToBounds=YES;//给视图添加注释。和阴影不能一起写。

[bigImage.layer setShadowOffset:CGSizeMake(20, 20)];//设置阴影的起点位置

[bigImage.layer setShadowOpacity:0.5];//不透明度。0为全透明。

[bigImage.layer setBorderColor:[UIColor greenColor].CGColor];

[bigImage.layer setBorderWidth:2];

//生成对应的十个按钮。

for (int i=0; i<10; i++) {

UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];

button.tag=i+1;

if (button.tag>7) {

button.frame=CGRectMake(15+80*(i-7), 415, 60, 40);

}

else{

button.frame=CGRectMake(255, 20+i*60, 60, 40);

}

[self.view addSubview:button];

}

NSArray *array=[NSArray arrayWithObjects:@"1",@"2", nil];

segmented=[[UISegmentedControl alloc]initWithItems:array];

segmented.frame=CGRectMake(30, 350, 100, 40);

[self.view addSubview:segmented];

[segmented release];

//分别给按钮关联方法。

UIButton *move=(UIButton *)[self.view viewWithTag:1];

[move setTitle:@"move" forState:UIControlStateNormal];

[move addTarget:self action:@selector(doChangeFrameToMove) forControlEvents:UIControlEventTouchUpInside];

//转动。

UIButton *translate=(UIButton *)[self.view viewWithTag:2];

[translate setTitle:@"translate" forState:UIControlStateNormal];

[translate addTarget:self action:@selector(doTranslate) forControlEvents:UIControlEventTouchUpInside];

//旋转。

UIButton *rotate=(UIButton *)[self.view viewWithTag:3];

[rotate setTitle:@"rotate" forState:UIControlStateNormal];

[rotate addTarget:self action:@selector(doRotate) forControlEvents:UIControlEventTouchUpInside];

//比例,规模。

UIButton *scale=(UIButton *)[self.view viewWithTag:4];

[scale setTitle:@"scale" forState:UIControlStateNormal];

[scale addTarget:self action:@selector(doScale) forControlEvents:UIControlEventTouchUpInside];

//转化为

UIButton *invert=(UIButton *)[self.view viewWithTag:5];

[invert setTitle:@"invert" forState:UIControlStateNormal];

[invert addTarget:self action:@selector(doInvert) forControlEvents:UIControlEventTouchUpInside];

//卷。

UIButton *curlUp=(UIButton *)[self.view viewWithTag:6];

[curlUp setTitle:@"curlUp" forState:UIControlStateNormal];

[curlUp addTarget:self action:@selector(doCurlUp) forControlEvents:UIControlEventTouchUpInside];

//轻击,弹

UIButton *flip=(UIButton *)[self.view viewWithTag:7];

[flip setTitle:@"flip" forState:UIControlStateNormal];

[flip addTarget:self action:@selector(doFlip) forControlEvents:UIControlEventTouchUpInside];

//不透明。

UIButton *opacity=(UIButton *)[self.view viewWithTag:8];

[opacity setTitle:@"opacity" forState:UIControlStateNormal];

[opacity addTarget:self action:@selector(doOpacity) forControlEvents:UIControlEventTouchUpInside];

//花费

UIButton *expend=(UIButton *)[self.view viewWithTag:9];

[expend setTitle:@"expend" forState:UIControlStateNormal];

[expend addTarget:self action:@selector(doExpend) forControlEvents:UIControlEventTouchUpInside];

UIButton *flay=(UIButton *)[self.view viewWithTag:10];

[flay setTitle:@"flay" forState:UIControlStateNormal];

[flay addTarget:self action:@selector(doFlay) forControlEvents:UIControlEventTouchUpInside];

}

-(void)doChangeFrameToMove{

[UIView beginAnimations:nil context:nil];//第一个参数是动画的标石,第二个参数是应用程序传递给动画的代理的信息。通常不写,

[UIView setAnimationDuration:2];//动画持续时间。

// [UIView setAnimationDelegate:self];//设置动画的回调函数,设置后可以使用回调方法。也就 是代理方法。

// [UIView setAnimationDidStopSelector:@selector(a:)];//动画完毕后调用的方法。“”不被新IOS版本支持。、

if (n==0) {

smallImage.frame=CGRectMake(130, 80, 30, 30);

n++;

}

else{

smallImage.frame = CGRectMake(0, 80, 30, 30);

n=0;

}

[UIView commitAnimations];

}

-(void)doTranslate

{

// NSLog(@"%s",__FUNCTION__);

CGAffineTransform transform;

if (segmented.selectedSegmentIndex==0) {

transform=CGAffineTransformTranslate(bigImage.transform, 10.0, 10.0);

}

else

{

transform=CGAffineTransformMakeTranslation(10.0, 10.0);

}

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:1.2];

[bigImage setTransform:transform];

[UIView commitAnimations];

}

-(void)doRotate{

NSLog(@"%s",__FUNCTION__);

CGAffineTransform transform;

if (segmented.selectedSegmentIndex==0) {

//根据目标对象当前的transform进行旋转。

transform=CGAffineTransformRotate(bigImage.transform,M_PI/6.0);

}

else{

//根据原始位置旋转。

transform=CGAffineTransformMakeRotation(M_PI/6.0);

}

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:1.2];

[bigImage setTransform:transform];

[UIView setAnimationDelegate:self];

// [UIView setAnimationDidStopSelector:@selector(animationAction)];

[UIView commitAnimations];

}

-(void)doScale{

NSLog(@"%s",__FUNCTION__);

CGAffineTransform transform;

if (segmented.selectedSegmentIndex==0) {

transform=CGAffineTransformScale(bigImage.transform,1.2,1.2);

}

else{

transform=CGAffineTransformMakeScale(1.2, 1.2);

}

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:1.2];

[bigImage setTransform:transform];

[UIView commitAnimations];

}

-(void)doInvert{

NSLog(@"%s",__FUNCTION__);

CGAffineTransform transform;

if (segmented.selectedSegmentIndex==0) {

transform=CGAffineTransformIdentity;

}

else{

transform=CGAffineTransformInvert(bigImage.transform);

}

[UIView beginAnimations:nil context:nil];

[UIView setAnimationDuration:1.2];

[bigImage setTransform:transform];

[UIView commitAnimations];

}

-(void)doCurlUp{

NSLog(@"%s",__FUNCTION__);

[UIView beginAnimations:nil context:nil];

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];//指定动画曲线类型。淡入淡出。

[UIView setAnimationDuration:1];

[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:bigImage cache:YES];//设置动画的样式,forview为哪个动画实现这个效果。yes 时候阴影一起走。

[UIView commitAnimations];

}

-(void)doFlip{

NSLog(@"%s",__FUNCTION__);

[UIView beginAnimations:nil context:nil];

[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

[UIView setAnimationDuration:1];

if (m==0) {

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:bigImage cache:YES];

NSLog(@"xiang you");

m=1;

}

else{

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:bigImage cache:YES];

m=0;

NSLog(@"xiang zuo");

}

[UIView commitAnimations];

}

-(void)doOpacity{

NSLog(@"%s",__FUNCTION__);

//创建基本动画。@里的字符串有多种,必须写对才行,这个是透明度。

CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"opacity"];//制定操作的属性

//操作属性的起始值;透明度的。

[animation setFromValue:[NSNumber numberWithFloat:1.0]];

//操作属性的终点。

[animation setToValue: [NSNumber numberWithFloat:0.0]];

//动画持续时间。

[animation setDuration:3.0];

//重复次数。

[animation setRepeatCount:3.0];

[animation setDelegate:self];

[animation setAutoreverses:YES];//默认的是NO即透明完毕后立马恢复,YES是延迟恢复。

[bigImage.layer addAnimation:animation forKey:@"img-opacity"];//执行动画。

}

-(void)doExpend{

CABasicAnimation *animation=[CABasicAnimation animationWithKeyPath:@"bounds.size"];

[animation setFromValue:[NSValue valueWithCGSize:CGSizeMake(1.0, 1.0)]];

[animation setToValue: [NSValue valueWithCGSize:bigImage.bounds.size]];//设置回原来的大小。

[animation setDuration:1.2];

[animation setDelegate:self];

[bigImage.layer addAnimation:animation forKey:@"image-bounds.size"];

}

-(void)doFlay{//设置经过的点。也就是路径。

CAKeyframeAnimation *animation=[CAKeyframeAnimation animationWithKeyPath:@"position"];

NSArray *values=[NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(100, 20)],[NSValue valueWithCGPoint:CGPointMake(40, 80)],[NSValue valueWithCGPoint:CGPointMake(30, 60)],[NSValue valueWithCGPoint:CGPointMake(20, 40)],[NSValue valueWithCGPoint:CGPointMake(0, 10)], nil];

[animation setValues:values];

[animation setDuration:1.0];

[animation setDelegate:self];

[bigImage.layer addAnimation:animation forKey:@"image-position"];

}

//动画开始时调用。

-(void)animationDidStart:(CAAnimation *)anim{

NSLog(@"%s",__FUNCTION__);

}

//动画结束时,他们都是自动调用,

-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{

NSLog(@"%s",__FUNCTION__);

if (flag) {

CAPropertyAnimation *propertAn=(CAPropertyAnimation *)anim;

[bigImage.layer removeAnimationForKey:propertAn.keyPath];

NSLog(@"keyPath=%@",propertAn.keyPath);

}

}

//指定动画的代理对象,两个代理方法的selector应该满足一下格式。、但是现在不允许用了。,

-(void)animationDidStop:(NSString *)animationId finished:(NSNumber *)finished context:(void*)context{

NSString *str=(NSString *)context;

if ([str isEqualToString:@"move"]) {

[smallImage setAlpha:0];

}

}

ios

相关推荐