动画学习1 Animating Views with Blocks
2013-03-14 15:58 三戒1993 阅读(138) 评论(0) 编辑 收藏 举报
有五个函数
ios 4.0 以后才支持
Animating Views with Blocks
+ animateWithDuration:delay:options:animations:completion:
+ animateWithDuration:animations:completion:
+ animateWithDuration:animations:
+ transitionWithView:duration:options:animations:completion:
+ transitionFromView:toView:duration:options:completion:
+ animateWithDuration:delay:options:animations:completion:
+ animateWithDuration:animations:completion:
+ animateWithDuration:animations:
/* 翻转示例
这个方法完成firstView翻转过来显示背面的secondview,并且将firstview移除。
需要注意的事情是,我们在翻转的时候要给firstView和secondview增加一个共同的容器view
将这两个view作为一个容器view的subview,才能正确执行,否则系统将会默认将self.view作为容器view,导致效果不正确。
在viewdidload中增加一下代码:
- (void)viedDidLoad{
[self.secondView removeFromSuperview];
UIView *containerView = [[UIView alloc] initWithFrame:self.firstView.frame];
self.firstView.frame = containerView.bounds;
self.secondView.frame = containerView.bounds;
[containerView addSubview:self.secondView];
[containerView addSubview:self.firstView];
[self.view addSubview:containerView];
[super viewDidLoad];
}
- (void)animation {
[UIView transitionFromView:self.firstView toView:self.secondView duration:2.f options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews completion:^(BOOL finished) {
}];
}
- - (NSInteger)animationOption: (NSInteger)index {
- NSInteger type = 0;
- switch (index) {
- case 0: {// 跟父类作为一个整体一起动画,此方式为默认方式
- type = UIViewAnimationOptionLayoutSubviews;
- break;
- }
- case 1: {// 在动画运行过程中,允许用户与之交互操作
- /*
- 注意1,UIViewAnimationOptionAllowUserInteraction只是说允许用户点击,但在动画过程中,
- 比如一个让btnOne从(0,0)移动到(100,0)的动画,在动画播放的过程中其实btnOne的坐标已经是(100,0)了 你点击在view上显示的btn是没办法获取响应的,你需要在(100,0)处进行点击才能让btnOne响应你的点击事件。
- 解决这个问题的一种方法就是用定时器不断刷,把动画微分化:
- - (void)viewDidLoad
- {
- _btnMove = [UIButton buttonWithType:UIButtonTypeRoundedRect];
- [_btnMove addTarget:self action:@selector(btnMoveDidSelect) forControlEvents:UIControlEventTouchUpInside];
- _btnMove.frame = CGRectMake(0, 0, 80, 40);
- [_btnMove setTitle:@"touch me!" forState:UIControlStateNormal];
- [self.view addSubview:_btnMove];
- [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(buttonMoved) userInfo:nil repeats:YES];
- [super viewDidLoad];
- return;
- }
- - (void)buttonMoved
- {
- if(_btnMove.frame.origin.x != 250)
- {
- [UIView beginAnimati*****:nil context:nil];
- [UIView setAnimationDuration:0.01f];
- [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
- [_btnMove setFrame: CGRectMake(_btnMove.frame.origin.x+1, _btnMove.frame.origin.y,_btnMove.frame.size.width, _btnMove.frame.size.height)];
- [UIView commitAnimati*****];
- }
- }
- 注意2:如果你设置了UIViewAnimationOptionAllowUserInteraction,界面上其他的button等控件可以接受事件,但是你不设置UIViewAnimationOptionAllowUserInteraction,其他的控件事件都收不到。也就是说如果设置了UIViewAnimationOptionAllowUserInteraction,在动画期间,主线程会有时间接受事件。
- */
- type = UIViewAnimationOptionAllowUserInteraction;
- break;
- }
- case 2: {// 从当前状态开始动画。例如如下代码
- /*
- - (void)doAnimation1 {
- [UIView animateWithDuration:5.0
- delay:0.0
- options:nil
- animations:^{
- self.firstView.frame = CGRectMake(0, 0, 200, 200);
- [self performSelector:@selector(doAnimation2) withObject:nil afterDelay:1];
- }
- completion:^(BOOL finished){}];
- }
- - (void)doAnimation2 {
- [UIView animateWithDuration:5.0
- delay:0.0
- options:UIViewAnimationOptionBeginFromCurrentState
- animations:^{
- self.firstView.frame = CGRectMake(660, 660, 200, 200);
- }
- completion:^(BOOL finished){}];
- }
- 当5秒的doAnimation1动画运行1秒后,开始doAnimation2动画(doAnimation2设定了UIViewAnimationOptionBeginFromCurrentState参数),则doAnimation2的动画是从doAnimation1运行到1秒的状态为开始状态继续运行。如果不传入这个参数,则doAnimation2的开始状态为doAnimation1完整运行结束后的状态。
- */
- type = UIViewAnimationOptionBeginFromCurrentState;
- break;
- }
- case 3: {// 重复执行一个动画,从初始状态到结束状态,然后瞬间跳到初始状态继续无限次的执行同一动作
- type = UIViewAnimationOptionRepeat;
- break;
- }
- case 4: {// 反向执行一个动画。当动画执行完一遍后,沿原路径反向执行一遍。这个属性必须跟UIViewAnimationOptionRepeat一起使用
- type = UIViewAnimationOptionAutoreverse;
- break;
- }
- case 5: {// 忽略子层嵌套的动画的时间间隔。例如如下代码
- /*
- [UIView transitionWithView:self.firstView duration:4.f options:nil animations:^{
- self.firstView.frame = CGRectMake(0, 0, 200, 200);
- [UIView transitionWithView:self.firstView duration:1.f options:nil animations:^{
- self.secondView.frame = CGRectMake(0, 0, 200, 200);
- } completion:^(BOOL finished) {}];
- } completion:^(BOOL finished) {}];
- self.firstView的动画时间是4秒,self.secondView的动画时间是1秒,
- 如果子层不设置UIViewAnimationOptionOverrideInheritedDuration(如父层和子层都是nil),
- 则子层默认继承父层的时间,忽略自己的时间。
- 若是子层设置UIViewAnimationOptionOverrideInheritedDuration属性,
- 则子层将按照自身设置的1秒的时间执行。
- */
- type = UIViewAnimationOptionOverrideInheritedDuration;
- break;
- }
- case 6: {// 忽略子层嵌套的动画属性的时间 (如UIViewAnimationOptionCurveEaseInOut) 同上
- type = UIViewAnimationOptionOverrideInheritedCurve;
- break;
- }
- case 7: {// 允许同一个view的多个动画同时进行
- type = UIViewAnimationOptionAllowAnimatedContent;
- break;
- }
- case 8: {// 控制两个subview的显示和隐藏
- /*
- 控制两个subview的显示和隐藏(功能类似于addsubview和removefromsuperview),使用这个属性(一般在transitionFromView:toView:duration:options:completion:这个方法中使用),FromView会被隐藏,toView会被显示
- - (void)viedDidLoad{
- [self.secondView removeFromSuperview];
- UIView *containerView = [[UIView alloc] initWithFrame:self.firstView.frame];
- self.firstView.frame = containerView.bounds;
- self.secondView.frame = containerView.bounds;
- [containerView addSubview:self.secondView];
- [containerView addSubview:self.firstView];
- [self.view addSubview:containerView];
- [super viewDidLoad];
- }
- - (void)animation {
- [UIView transitionFromView:self.firstView toView:self.secondView duration:2.f options:UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews completion:^(BOOL finished) {}];
- }
- */
- type = UIViewAnimationOptionShowHideTransitionViews;
- break;
- }
- // ========= 动画过渡动作的速度
- case 9: {// 先慢后快再慢
- type = UIViewAnimationOptionCurveEaseInOut;
- break;
- }
- case 10: {// 先慢后快
- type = UIViewAnimationOptionCurveEaseIn;
- break;
- }
- case 11: {// 先快后慢
- type = UIViewAnimationOptionCurveEaseOut;
- break;
- }
- case 12: {// 匀速
- type = UIViewAnimationOptionCurveLinear;
- break;
- }
- // ========= 动画过渡过程的方式:
- case 13: {// 不指定方式
- type = UIViewAnimationOptionTransitionNone;
- break;
- }
- case 14: {// 翻转
- type = UIViewAnimationOptionTransitionFlipFromLeft;
- break;
- }
- case 15: {// 翻转
- type = UIViewAnimationOptionTransitionFlipFromRight;
- break;
- }
- case 16: {// 翻转
- type = UIViewAnimationOptionTransitionFlipFromTop; // 5.0以后
- break;
- }
- case 17: {// 翻转
- type = UIViewAnimationOptionTransitionFlipFromBottom;// 5.0以后
- break;
- }
- case 18: {// 重叠,当一个view从一个位置到另一个位置时,当前的view会由透明状态逐渐显示到目的位置,原来的位置将会保留一个影子,并逐渐消失
- type = UIViewAnimationOptionTransitionCrossDissolve;// 5.0以后
- break;
- }
- case 19: {// 翻页
- type = UIViewAnimationOptionTransitionCurlUp;
- break;
- }
- case 20: {// 翻页
- type = UIViewAnimationOptionTransitionCurlDown;
- break;
- }
- default:
- break;
- }
- return type;
- }