UIView 動(dòng)畫
UILabel *lab = [[UILabel alloc]initWithFrame:CGRectMake(10, 40, 100, 80)];
lab.textAlignment = NSTextAlignmentCenter;
lab.text = @"測試滑塊";
lab.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:lab];
/*
[UIView animateWithDuration:2.0f animations:^{
lab.center = CGPointMake(200, 300);
} completion:^(BOOL finished) {
NSLog(@"動(dòng)畫完成!");
}];*/
[UIView animateKeyframesWithDuration:2.0f/*動(dòng)畫時(shí)長*/ delay:1.0f/*延時(shí)時(shí)長*/ options:UIViewKeyframeAnimationOptionRepeat/*動(dòng)畫類型*/ animations:^{/*動(dòng)畫執(zhí)行內(nèi)容*/
lab.center = CGPointMake(200, 300);
} completion:^(BOOL finished) {/*動(dòng)畫結(jié)束處理*/
NSLog(@"動(dòng)畫完成!");
}];
UIImageView 動(dòng)畫
NSMutableArray *array = [NSMutableArray array];
for (int i = 1 ; i < 16; i++) {
NSString *imageName = [NSString stringWithFormat:@"login_%d",i];
UIImage *image = [UIImage imageNamed:imageName];
[array addObject:image];
}
_imageView.animationImages = array;//動(dòng)畫圖片內(nèi)容
_imageView.animationDuration = 1.0f;//動(dòng)畫時(shí)長
_imageView.animationRepeatCount = 10;//動(dòng)畫重復(fù)次數(shù)
[_imageView startAnimating];//開始執(zhí)行動(dòng)畫
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(6 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if ([_imageView isAnimating]/*判斷當(dāng)前是否正在動(dòng)畫執(zhí)行中*/) {
[_imageView stopAnimating];//結(jié)束執(zhí)行動(dòng)畫
}
});
CABasicAnimation 動(dòng)畫
// 創(chuàng)建CABasicAnimation
CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
anim.duration = 1.5; // 動(dòng)畫持續(xù)1.5s
anim.repeatCount = 2;//動(dòng)畫重復(fù)次數(shù) default is 1
anim.beginTime = 1.0f;// 動(dòng)畫延遲時(shí)間 default is 0
//動(dòng)畫執(zhí)行的過程中 先快后慢 先慢后快 勻速 等方式完成動(dòng)畫
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.autoreverses = NO;//動(dòng)畫結(jié)束的時(shí)候是否要按原來返回到原來的狀態(tài)
anim.fromValue = @1.0f;//動(dòng)畫改變起始值
anim.toValue = @0.5;//動(dòng)畫改變結(jié)束值
// anim.byValue 和初始狀態(tài)相比的改變量
anim.delegate = self;//delegate 可以監(jiān)聽到動(dòng)畫開始和動(dòng)畫結(jié)束
// 動(dòng)畫結(jié)束的時(shí)候敷存,保持結(jié)束時(shí)的狀態(tài)
anim.removedOnCompletion = NO;
// 始終保持最新的效果
anim.fillMode = kCAFillModeForwards;
[textView.layer addAnimation:anim forKey:nil];
//動(dòng)畫開始時(shí)
- (void)animationDidStart:(CAAnimation *)anim
{
NSLog(@"開始了");
}
//動(dòng)畫結(jié)束時(shí)
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
//方法中的flag參數(shù)表明了動(dòng)畫是自然結(jié)束還是被打斷,比如調(diào)用了removeAnimationForKey:方法或removeAnimationForKey方法恨旱,flag為NO,如果是正常結(jié)束屏积,flag為YES读整。
NSLog(@"結(jié)束了");
}
給一個(gè)視圖添加layer動(dòng)畫時(shí),真正移動(dòng)并不是我們的視圖本身骇径,而是 presentation layer 的一個(gè)緩存。動(dòng)畫開始時(shí) presentation layer開始移動(dòng)者春,原始layer隱藏破衔,動(dòng)畫結(jié)束時(shí),presentation layer從屏幕上移除钱烟,原始layer顯示晰筛。
解釋了為什么我們的視圖在動(dòng)畫結(jié)束后又回到了原來的狀態(tài)。
可以解釋為什么在動(dòng)畫移動(dòng)過程中拴袭,不能響應(yīng)任何操作读第。
完成layer動(dòng)畫之后,一般是將layer屬性設(shè)置為最終狀態(tài)的屬性
// 動(dòng)畫結(jié)束的時(shí)候拥刻,保持結(jié)束時(shí)的狀態(tài)
anim.removedOnCompletion = NO;
// 始終保持最新的效果
anim.fillMode = kCAFillModeForwards;
如果有特殊需求怜瞒,希望動(dòng)畫完成后 再回到原來的狀態(tài) 就不用設(shè)置這兩個(gè)屬性
一些常用的animationWithKeyPath值的總結(jié)
值 說明 使用形式
transform.scale 比例轉(zhuǎn)化 @(0.8)
transform.scale.x 寬的比例 @(0.8)
transform.scale.y 高的比例 @(0.8)
transform.rotation.x 圍繞x軸旋轉(zhuǎn) @(M_PI)
transform.rotation.y 圍繞y軸旋轉(zhuǎn) @(M_PI)
transform.rotation.z 圍繞z軸旋轉(zhuǎn) @(M_PI)
cornerRadius 圓角的設(shè)置 @(50)
backgroundColor 背景顏色的變化 (id)[UIColor purpleColor].CGColor
bounds 大小,中心不變
[NSValue valueWithCGRect:CGRectMake(0, 0, 200, 200)];
position 位置(中心點(diǎn)的改變) [NSValue valueWithCGPoint:CGPointMake(300, 300)];
contents 內(nèi)容般哼,比如UIImageView的圖片 imageAnima.toValue = (id)[UIImage imageNamed:@"to"].CGImage;
opacity 透明度 @(0.7)
contentsRect.size.width 橫向拉伸縮放 @(0.4)最好是0~1之間的
多謝 方弘毅 寫的文章 再寫一遍之為加深理解吴汪!
原文鏈接:http://www.reibang.com/p/02c341c748f9
CGAffineTransform 動(dòng)畫
這種只能進(jìn)行一次改變,它的改變參照是最初使得imageView
CGAffineTransform t = CGAffineTransformMakeScale(1.5, 1.5);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformMakeTranslation(10, 10);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformMakeRotation(M_PI/4);
self.imageView.transform = t;
這種可以連續(xù)改變 每次是以上次改變的結(jié)果 為參照
CGAffineTransform t = CGAffineTransformTranslate(self.imageView.transform, 10, 10);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformScale(self.imageView.transform, 0.9, 0.9);
self.imageView.transform = t;
CGAffineTransform t = CGAffineTransformRotate(self.imageView.transform, M_PI/8);
self.imageView.transform = t;
//清空所有的 效果 回到原來的位置
self.imageView.transform = CGAffineTransformIdentity;