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方法