CATranstion:提供了影响整个层内容过渡的效果,在动画期间它使层产生fade(渐变),push(推拉)以及reveals(揭示)的动画效果。这些过渡的效果可以通过你自己自定义的core image filters来扩展。
@property float endProgress
定义过渡的结束点
结束点的值必须大于或者等于开始点。
默认值为1.0。
@property float startProgress
定义过度的开始点
开始点的值必须小于或者等于结束点。
默认值为0.0。
注:
这两个属性是float类型的。可以控制动画进行的过程,可以让动画停留在某个动画点上,值在0.0到1.0之间。endProgress要大于等于startProgress。
比如:立方体转,可以设置endProgress= 0.5,让动画停留在整个动画的特定位置(停止在旋转一般的状态)。
@property(retain) CIFilter *filter
为动画添加一个可选的滤镜。
如果指定,那么指定的filter必须同时支持x和y,否则该filter将不起作用。
默认值为nil。
如果设置了filter,那么,为layer设置的type和subtype属性将被忽略。
该属性只在iOS 5.0以及以后版本被支持。
@property(copy) NSString *subtype
指定预定义的过渡方向。
默认为nil。
如果指定了filter,那么该属性无效。
预定义的过渡方向为:
NSString * const kCATransitionFromRight;
NSString * const kCATransitionFromLeft;
NSString * const kCATransitionFromTop;
NSString * const kCATransitionFromBottom;
分别表示:过渡从右边、左边、顶部、底部 开始。
@property(copy) NSString *type
指定预定义的过渡效果。
默认为kCATransitionFade
如果指定了filter,那么该属性无效。
预定义的过渡效果:
NSString * const kCATransitionFade;
NSString * const kCATransitionMoveIn;
NSString * const kCATransitionPush;
NSString * const kCATransitionReveal;
分别表示:淡出、覆盖原图、推出、从底部显示。
注意:
还有很多私有API效果,使用的时候要小心,可能会导致app审核不被通过(悲剧啊,为啥有却不让用啊!好东西不应该被束之高阁!):
fade
push
moveIn
reveal
cube
oglFlip
suckEffect
rippleEffect
pageCurl
pageUnCurl
cameraIrisHollowOpen
cameraIrisHollowClose
第一种是UIView,UIView方式可能在低层也是使用CATransition进行了封装,它只能用于一些简单的、常用的效果展现,这里写一个常用的示例代码,供大家参考。
[UIView beginAnimations:@"Curl"context:nil];//动画开始
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:myview cache:YES];
[myview removeFromSuperview];
[UIView commitAnimations];
第二种方式相对复杂一些,但如果更好的进行控制,还是使用这种方法吧,基本使用方法可以看一下如下例子:
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里定义的,他们的参数说明可以参考如下(默认类型是淡入淡出类型。):
示例代码一:
// Curl the image up or down
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 {
}
urled = !curled;
示例代码二:
头部导入: #import <QuartzCore/QuartzCore.h>
- (void) startAction:(id) sender{
// 定义动画
CATransition *animation = [CATransition animation];
animation.delegate = self;
animation.duration =1.0f;
animation.timingFunction = UIViewAnimationCurveEaseInOut;
//可根据需要,设置type和subtype属性产生不同的动画效果
//animation.type = kCATransitionPush;
//animation.type = kCATransitionMoveIn;
//animation.type = kCATransitionReveal;
//animation.type = kCATransitionFade;
//animation.subtype = kCATransitionPush;
//animation.subtype = kCATransitionMoveIn;
//animation.subtype = kCATransitionReveal;
//animation.subtype = kCATransitionFade;
switch ([(UISegmentedControl *)self.navigationItem.titleView selectedSegmentIndex]) {
case 0:
animation.type = @"rippleEffect";
//animation.type = @"cube"; //立方体翻转
//animation.type = @"oglFlip"; //层翻转
//animation.type = @"cameraIrisHollowClose";
//animation.type = @"cameraIrisHollowOpen";
break;
case 1:
animation.type = @"pageCurl";
break;
case 2:
animation.type = @"pageUnCurl";
break;
case 3:
animation.type = @"suckEffect";
break;
default:
break;
}
switch (direction) { //方向
case 0:
animation.subtype = kCATransitionFromRight;
break;
case 1:
animation.subtype = kCATransitionFromTop;
break;
case 2:
animation.subtype = kCATransitionFromLeft;
break;
case 3:
animation.subtype = kCATransitionFromBottom;
break;
default:
break;
}
//执行动画
UIView *bgView = [self.view viewWithTag:150];
NSInteger front = [[bgView subviews] indexOfObject:[bgView viewWithTag:151]];
NSInteger back = [[bgView subviews] indexOfObject:[bgView viewWithTag:152]];
if (someThing) {
[bgView exchangeSubviewAtIndex:front withSubviewAtIndex:back]; //图形变换
}else {
[bgView exchangeSubviewAtIndex:back withSubviewAtIndex:front];
}
[[bgView layer] addAnimation:animation forKey:@"animation"]; //bgView层执行动画
//[[self.view layer] addAnimation:animation forKey:@"animation"]; //self.view层执行动画
}
From:http://www.cnblogs.com/bandy/archive/2012/03/27/2419332.html