ios两个子视图同一时间进入和离开动画

来源:互联网 发布:阿里云 ace 编辑:程序博客网 时间:2024/05/18 02:38
在一个视图控制器中,加入了两个视图targetSubview和sourceSubview。targetSubview默认是隐藏的,sourceSubview默认是可见的。

现在,我有这样一个需求。通过手指下滑,将targetSubview从上向下拉入到屏幕中,同时,sourceSubview将随着从屏幕下方离开。两个视图同步进入和离开是同步操作,用动画来实现。

第一种方法,使用UIView的类方法transition来实现,

   [UIView transitionFromView:sourceSubview toView:targetSubview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];

但,只能实现上下或左右翻转的效果,没有找到上下滑入滑出的效果。而且,该方法还将sourceSubview给remove掉了。

因此,这种方法不能满足要求。

第二种方法,使用使用UIView的类方法Animations来实现,是用delegate做一些前置或后置操作。

    targetSubview.frame = CGRectMake(0, targetSubview.frame.size.height + 50, targetSubview.frame.size.width, targetSubview.frame.size.height);

    

[UIView beginAnimations:@"Anim1" context:nil];

    [UIView setAnimationDuration:1];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

    [UIView setAnimationDelegate:self];

    

targetSubview.hidden = NO;

    targetSubview.frame = CGRectMake(0, 0, targetSubview.frame.size.width, targetSubview.frame.size.height);

    

    [UIView commitAnimations];

    [UIView beginAnimations:@"Anim2" context:nil];

    [UIView setAnimationDuration:3];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

    [UIView setAnimationDelegate:self];

    

    sourceSubview.frame = CGRectMake(0, -50, sourceSubview.frame.size.width, sourceSubview.frame.size.height);

    sourceSubview.hidden = YES;

    [UIView commitAnimations];

//动画结束后执行

//sourceSubview.hidden = YES;

这个方法实现了targetSubview视图的动画方式缓缓进入,但sourceSubview立即消失,没有动画效果。

因此在第二个动画设置中,我将sourceSubview.hidden设置为了yes,如果不设置会有动画效果,但是sourceSubview视图因为过高会有部分遗留在屏幕上。

即使,在动画结束后设置也该属性,也不行。

这个动画的效果,实际上是在后台执行的,类似多线程方式在运行。动画运行时间设置为1秒,但最后程序不会等待的,因此,这里需要设置delegate才能实现这个效果了。在动画结束后,delegate方法+ (void)setAnimationDidStopSelector:(SEL)selector必须实现,在该方法中调用sourceSubview.hidden = YES;才行。

在动画开始前,也有一个delegate方法+ (void)setAnimationWillStartSelector:(SEL)selector,可以做一些设置。

第三种方法,还是使用使用UIView的类方法Animations来实现,但是是用block实现,需要在ios4.0以上才能执行。现在苹果都将ios版本都升级到7.0,老版本的用户越来越少了。

        targetSubview.alpha=0.0;

        targetSubview.hidden = NO;

        [UIView animateWithDuration:2 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{

            targetSubview.frame = CGRectMake(0, -50, targetSubview.frame.size.width, targetSubview.frame.size.height);

            targetSubview.alpha=1.0;

            targetSubview.frame = CGRectMake(0, 0, targetSubview.frame.size.width, targetSubview.frame.size.height);

            sourceSubview.frame = CGRectMake(0, sourceSubview.frame.size.height, sourceSubview.frame.size.width, sourceSubview.frame.size.height);

            sourceSubview.alpha=0.0;

        } completion:^(BOOL finished) {

            [self printSubviews];

             sourceSubview.hidden = YES;

             sourceSubview.alpha=1.0;

        }];

最后,使用这个简单点的方法实现了需求。

在动画结束后,将sourceSubview设置为隐藏。

UIView中可以设置动画效果的属性:
frame
bounds
center
transform
alpha
backgroundColor
contentStretch
原创粉丝点击