iOS動畫的簡單介紹

1.圖形上下文Graphics context,是一個CGContextRef類型的數據。它能夠:數組

①保存繪圖信息、繪圖狀態等
②決定繪圖的輸出目標,覺得繪製到什麼地方去。繪製目標能夠是PDF文件或當前窗口等。
畫弧形時的座標以下(下邊寫錯了,「正方形」應爲「正方向」):iview

添加弧形時函數的參數以下:函數

因此要想畫以下的弧形,那麼能夠用oop

-(void)drawHalfArc{ CGContextRef ctx = UIGraphicsGetCurrentContext(); // 參數含義 // x,y爲圓心,radius爲半徑 // startAngle爲起始角度,endAngle爲終點角度 // clockwise爲繪製方向,只有兩個值,0爲順時針,1爲逆時針
 CGContextAddArc(ctx, 100, 350, 80, -M_PI_2, M_PI_2*1.4, 0); CGContextStrokePath(ctx); }

設置線條的顏色,最簡單的可用相似動畫

[[UIColor brownColor] set];

而不用管線是空心的仍是實心。ui

 

2.CALayer的屬性position和anchorPointspa

這兩者是相對於不一樣的座標系的,position是相對於superLayer,anchorPoint是相對於layer的。3d

@property CGPoint point

決定了layer在父層中的位置,以父層的左上角爲原點(0,0);code

 

@property CGPoint anchorPoint

爲錨點,它以本身的左上角爲原點(0,0),x、y取值範圍都爲0~1,默認值爲(0.5,0.5)。意爲即便layer長寬都爲100,但它的錨點範圍仍爲0~1。
layer能以錨點爲基準點旋轉或是移動,作動畫時能用到。
設置layer時,orm

layer.frame = CGRectMake(110, 110, 100, 100);

CGRectMake前兩項參數是沒有做用的,只能以position來決定。
以一段代碼爲例

//沒設置anchorPoint,爲默認值
-(void)setUpBackground{ CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor redColor].CGColor; layer.frame = CGRectMake(110, 110, 100, 100); layer.position = CGPointZero; [self.view.layer addSublayer:layer]; }

效果爲

若設置anchorPoint

-(void)setUpBackground{ CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor redColor].CGColor; layer.frame = CGRectMake(110, 110, 100, 100); layer.position = CGPointZero; layer.anchorPoint = CGPointZero; [self.view.layer addSublayer:layer]; }

則效果變爲:

 

由上能夠得出,position在superLayer中的位置與anchorPoint在layer中的位置是重疊的

 

3.UIView的旋轉默認是圍繞view.center或view.layer.anchorPoint旋轉。

 

4.對於NSNumber對象,有兩種寫法

①工廠方法寫

NSNumber *num = [NSNumber numberWithFloat:1.0f];

②直接寫

NSNumber *num = @(2);

 

5.iOS的三種動畫

第一種:基本動畫CABasicAnimation
主要屬性:

fromValue:keyPath對應的初始值
toValue:keyPath對應的結束值。

CABasicAnimation經常使用動畫的keyPath,basicAnimation的屬性只能從一種值(fromValue)轉爲另外一種值(toValue)
它的位移其實是view.layer.position的位置變化。這裏toValue指的是移動的距離而不是移動到這個點

CABasicAnimation *anima = [CABasicAnimation animation];

①位移

anima.keyPath = @"transform.translation"; anima.toValue = [NSValue valueWithCGPoint:CGPointMake(200, 300)];

②旋轉

anima.keyPath = @"transform.rotation"; anima.toValue = @(M_PI_4);

③縮放

//x、y方向同時縮放到1.5倍
anima.keyPath = @"transform.scale"; anima.toValue = @(1.5); //x方向縮放到1.5倍
anima.keyPath = @"transform.scale.x"; anima.toValue = @(1.5);

若縮放時x、y方向的倍數不一樣,那麼須要實例化兩個animation對象,再添加到view.layer上

第二種:關鍵幀動畫CAKeyframeAnimation
CAKeyframeAnimation可使用NSArray保存一組動畫值,比CABasicAnimation只能進行一個動畫要多,它會按照元素的順序依次執行
主要屬性:

values:用來保存動畫的數組,裏邊的元素被稱爲關鍵幀。
paths:能夠設置個CGPathRef/CGMutablePathRef,讓層跟着路徑走,path只對CALayer的anchorPoint和position起做用。假如設置了path,那麼values將被自動忽略。
①values的動畫,效果以下,就是圖標抖動效果

//角度轉弧度,宏定義
#define Angle2Radian(angle) ((angle)/180.0 * M_PI) CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@"transform.rotation"]; anima.values = @[@(Angle2Radian(-5)),@(Angle2Radian(5)),@(Angle2Radian(-5))];

 

②path動畫,效果是view作圓形運動

CAKeyframeAnimation *anima = [CAKeyframeAnimation animationWithKeyPath:@"position"]; UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(SCREEN_WIDTH/2-100, SCREEN_HEIGHT/2-100, 200, 200)]; anima.path = path.CGPath;

第三種:組動畫CAAnimationGroup
CAAnimationGroup就是保存一組動畫,其中的執行順序是並行的,全部動畫並行執行。這也是與CAKeyframeAnimation的區別。
主要屬性:
animations : 用來保存一組動畫對象的NSArray

第四種:轉場動畫CATransition
用來在轉場時提供動畫效果。
主要屬性:
type:轉場的動畫效果
subtype:轉場的動畫方向
以下圖的效果

點「下一張」

CATransition *anima = [CATransition animation]; anima.type = @"cube"; anima.subtype = kCATransitionFromLeft;

點「上一張」

anima.type = @"cube"; anima.subtype = kCATransitionFromRight;

 layer動畫結束時,若想位置不發生變化,那麼須要設置兩個屬性

anima.removedOnCompletion = NO; anima.fillMode = kCAFillModeForwards;

不然會返回到原位置。

核心動畫(上述三個基本動畫)的缺點:

作動畫時,儘可能使用UIView的封裝動畫,只有在uiview知足不了時再使用layer的動畫。由於layer動畫都是假象,在執行過程當中,layer的position屬性一直沒變。在轉場中常使用layer動畫

//UIView的動畫
[UIView animateWithDuration:0.25 animations:^{ //位移
 CGRect rect; CGPoint a = [[self.itemDesArr objectAtIndex:i] CGPointValue]; rect.size = _bottomView.frame.size; btn.frame = rect; btn.centerX = a.x; btn.centerY = a.y; //旋轉
 [btn.layer addAnimation:anima2 forKey:nil]; }];

 

6.CADisplayLink定時器通常用來UI的不停重繪,刷新頻率比較高。如

-(void)testA{ CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateView)]; [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode]; } -(void)updateView{ }

表示1秒鐘執行60次updateView方法

相關文章
相關標籤/搜索