动画学习1 Animating Views with Blocks

有五个函数

 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:

这三个函数,用来支持多个不同的view(view1,view2。。。。。。)的动画
Animate changes to one or more views
  • + animateWithDuration:delay:options:animations:completion:
  • + animateWithDuration:animations:completion:
  • + animateWithDuration:animations:

这个函数,用来对一个容器view的一个动画进行操作,这个容器内的所有subview将一起动画
  • + transitionWithView:duration:options:animations:completion:

这个函数,用来对一个容器view的多个subview进行动画,容器view中的FromView到toView的切换等动画
比如:subview1翻转后显示subview2
  • + transitionFromView:toView:duration:options:completion:

/* 翻转示例

     这个方法完成firstView翻转过来显示背面的secondview,并且将firstview移除。

     需要注意的事情是,我们在翻转的时候要给firstViewsecondview增加一个共同的容器view

     将这两个view作为一个容器viewsubview,才能正确执行,否则系统将会默认将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) {

        }];

     }

*/

     



options的选项:
看下面代码中的注释:


- (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;
}






























你可能感兴趣的:(ios,animation,action,UIView,button,delay)