iOS简单动画实现方案
生活随笔
收集整理的這篇文章主要介紹了
iOS简单动画实现方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、仿射變換--CGAffineTransform
1.仿射變換,一種基于二維坐標的轉換功能。CGAffineTransform數據結構代表一個二維坐標系的轉換矩陣。
2.通過CGAffineTransform數據結構,可以構造二維坐標系內的平移、伸縮、旋轉矩陣。詳情可以參看蘋果開發文檔中關于該數據結構的解釋。
3.UIView類的一個屬性:transform,該屬性相對于bounds的中心位置,該屬性的類型為CGAffineTransform。初始化一個CGAffineTransform結構的矩陣,然后賦值給這個屬性,就可以完成二維坐標系內的轉換。
4.要形成動畫,可以使用第三部分(UIView集成動畫API)表述的方式,通過指定該屬性的前后狀態來形成動畫,或者自己動態設置這個屬性的值來形成動畫。
二、三維變換--CATransform3D
1.CATransform3D數據結構代表一個三維坐標系的矩陣,通過它可以構造三維坐標系內的平移、伸縮、旋轉矩陣。
2.UIView類的layer.transform屬性,該屬性相對于bounds的中心位置。該屬性的類型為CATransform3D。該屬性的使用方式以及動畫的形成,同上一部分,但是使用這個屬性實現三維動畫,可能沒那么好控制。
三、UIView集成的動畫API
1.UIView集成了一系列的動畫API。她的原理類似于flash動畫的制作,我們指定物體(控件)某些屬性在動畫中的開始和結束狀態,動畫API就會自動生成中間的幀,從而生成動畫。
2.使用示例(iOS4之前):? ? //在這里指定控件的開始狀態? ? //xxxxxxxxxx? ? [UIView beginAnimations:context:];? ? [UIView setAnimationDuration:];? ? [UIView setAnimationCurve:];? ? [UIView setAnimationDelegate:];? ? [UIView setAnimationWillStartSelector:@selector(animationDidStart:context)];? ? [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context)];? ? //在這里指定控件的結束狀態? ? //xxxxxxxxx? ? [UIView commitAnimations];
? ? 代理方法的聲明要使用如下方式:? ? (void)animationDidStart:(NSString *)animationID context:(void *)context? ? (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
3.使用示例(iOS4及以后)
(1)從iOS4系統之后,第2點提到整套API被廢棄了,應該使用block的方式來生成動畫。API列表如下:? ?animateWithDuration:delay:options:animations:completion:? ?animateWithDuration:animations:completion:? ?animateWithDuration:animations:? ?transitionWithView:duration:options:animations:completion:? ?transitionFromView:toView:duration:options:completion:
(2)使用此套API的時候,將控件的結束狀態寫在block中就可以了。
4.因為此系列API只指定動畫的開始和結束狀態,所以只能做一些有規律的動畫,否則API會不知道如何生成中間幀。常用動畫舉例:平移,伸縮,旋轉,透明度變化,顏色變化等等。
四、核心動畫
1.比較常用的動畫類:CATransition和CAAnimation。(1)CATransition用于使用系統集成的動畫。(2)CAAnimation用于實現自定義動畫,但是它是一個抽象類,不能直接使用,要子類化才能使用。類庫中存在已經子類化的類可以使用,比如CAKeyframeAnimation,此類通過給一個layer的屬性指定一組值,包含開始、結束以及中間的一些用來修正動畫的值,然后根據這些值,生成每一幀,來生成動畫。
2.CATransition動畫實現示例:? ?CATransition *transition = [CATransition animation];? ?transition.duration = 0.8;? ?transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];? ?transition.type = @"cube";? ?transition.subtype = kCATransitionFromRight;? ?[xxxView.layer addAnimation:transition forKey:nil];
3.CAAnimation使用示例:? ?CGFloat perAngle = M_PI / 64;?? ?CAKeyframeAnimation *keyFrameAnination = [CAKeyframeAnimation animationWithKeyPath:@"transform"];? ?[keyFrameAnination setDuration:2.0f];? ?[keyFrameAnination setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];? ?[keyFrameAnination setRemovedOnCompletion:NO];? ?[keyFrameAnination setFillMode:kCAFillModeForwards];? ?[keyFrameAnination setDelegate:self];? ?NSMutableArray *values = [[NSMutableArray alloc]initWithCapacity:10];? ?for (CGFloat clipRdn = angle; clipRdn >= 0; clipRdn -= perAngle) {? ? ? ? CATransform3D transform = CATransform3DMakeRotation(clipRdn, 0.0f, 1.0f, 0.0f);? ? ? ? transform.m34 = sin(clipRdn) / 4000.0f;? ? ? ? transform.m14 = -sin(clipRdn) / 4000.0f;? ? ? ? [values addObject:[NSValue valueWithCATransform3D:transform]];? ?}? ?[keyFrameAnination setValues:values];? ?[values release];? ?[self.imageView.layer addAnimation:keyFrameAnination forKey:@"animation"];
1.仿射變換,一種基于二維坐標的轉換功能。CGAffineTransform數據結構代表一個二維坐標系的轉換矩陣。
2.通過CGAffineTransform數據結構,可以構造二維坐標系內的平移、伸縮、旋轉矩陣。詳情可以參看蘋果開發文檔中關于該數據結構的解釋。
3.UIView類的一個屬性:transform,該屬性相對于bounds的中心位置,該屬性的類型為CGAffineTransform。初始化一個CGAffineTransform結構的矩陣,然后賦值給這個屬性,就可以完成二維坐標系內的轉換。
4.要形成動畫,可以使用第三部分(UIView集成動畫API)表述的方式,通過指定該屬性的前后狀態來形成動畫,或者自己動態設置這個屬性的值來形成動畫。
二、三維變換--CATransform3D
1.CATransform3D數據結構代表一個三維坐標系的矩陣,通過它可以構造三維坐標系內的平移、伸縮、旋轉矩陣。
2.UIView類的layer.transform屬性,該屬性相對于bounds的中心位置。該屬性的類型為CATransform3D。該屬性的使用方式以及動畫的形成,同上一部分,但是使用這個屬性實現三維動畫,可能沒那么好控制。
三、UIView集成的動畫API
1.UIView集成了一系列的動畫API。她的原理類似于flash動畫的制作,我們指定物體(控件)某些屬性在動畫中的開始和結束狀態,動畫API就會自動生成中間的幀,從而生成動畫。
2.使用示例(iOS4之前):? ? //在這里指定控件的開始狀態? ? //xxxxxxxxxx? ? [UIView beginAnimations:context:];? ? [UIView setAnimationDuration:];? ? [UIView setAnimationCurve:];? ? [UIView setAnimationDelegate:];? ? [UIView setAnimationWillStartSelector:@selector(animationDidStart:context)];? ? [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context)];? ? //在這里指定控件的結束狀態? ? //xxxxxxxxx? ? [UIView commitAnimations];
? ? 代理方法的聲明要使用如下方式:? ? (void)animationDidStart:(NSString *)animationID context:(void *)context? ? (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
3.使用示例(iOS4及以后)
(1)從iOS4系統之后,第2點提到整套API被廢棄了,應該使用block的方式來生成動畫。API列表如下:? ?animateWithDuration:delay:options:animations:completion:? ?animateWithDuration:animations:completion:? ?animateWithDuration:animations:? ?transitionWithView:duration:options:animations:completion:? ?transitionFromView:toView:duration:options:completion:
(2)使用此套API的時候,將控件的結束狀態寫在block中就可以了。
4.因為此系列API只指定動畫的開始和結束狀態,所以只能做一些有規律的動畫,否則API會不知道如何生成中間幀。常用動畫舉例:平移,伸縮,旋轉,透明度變化,顏色變化等等。
四、核心動畫
1.比較常用的動畫類:CATransition和CAAnimation。(1)CATransition用于使用系統集成的動畫。(2)CAAnimation用于實現自定義動畫,但是它是一個抽象類,不能直接使用,要子類化才能使用。類庫中存在已經子類化的類可以使用,比如CAKeyframeAnimation,此類通過給一個layer的屬性指定一組值,包含開始、結束以及中間的一些用來修正動畫的值,然后根據這些值,生成每一幀,來生成動畫。
2.CATransition動畫實現示例:? ?CATransition *transition = [CATransition animation];? ?transition.duration = 0.8;? ?transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];? ?transition.type = @"cube";? ?transition.subtype = kCATransitionFromRight;? ?[xxxView.layer addAnimation:transition forKey:nil];
3.CAAnimation使用示例:? ?CGFloat perAngle = M_PI / 64;?? ?CAKeyframeAnimation *keyFrameAnination = [CAKeyframeAnimation animationWithKeyPath:@"transform"];? ?[keyFrameAnination setDuration:2.0f];? ?[keyFrameAnination setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];? ?[keyFrameAnination setRemovedOnCompletion:NO];? ?[keyFrameAnination setFillMode:kCAFillModeForwards];? ?[keyFrameAnination setDelegate:self];? ?NSMutableArray *values = [[NSMutableArray alloc]initWithCapacity:10];? ?for (CGFloat clipRdn = angle; clipRdn >= 0; clipRdn -= perAngle) {? ? ? ? CATransform3D transform = CATransform3DMakeRotation(clipRdn, 0.0f, 1.0f, 0.0f);? ? ? ? transform.m34 = sin(clipRdn) / 4000.0f;? ? ? ? transform.m14 = -sin(clipRdn) / 4000.0f;? ? ? ? [values addObject:[NSValue valueWithCATransform3D:transform]];? ?}? ?[keyFrameAnination setValues:values];? ?[values release];? ?[self.imageView.layer addAnimation:keyFrameAnination forKey:@"animation"];
總結
以上是生活随笔為你收集整理的iOS简单动画实现方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 获取iOS任意线程调用堆栈(三)符号化理
- 下一篇: CoreAnimation编程指南(九)