UIView动画子视图

时间:2012-06-03 20:00:55

标签: objective-c ios animation core-animation subview

我的目标是动画我的UI,我正在使用UIView动画。问题是我一次需要不止一个动画,但显然我一次只能执行一个UIView动画。我之前已经就此主题提出了问题(Multiple UIView Animations),并且所有响应者都说我必须使用类似animationDidStop:performSelector:的方法设置动画的委托,但我想知道是否可以改为将子视图添加到主视图并在每个子视图上同时执行动画。此外,我无法执行背靠背动画,我想也许我可以在view1上执行动画,然后在view2上执行动画而不委托。

例如:

//Header
@property (nonatomic, strong) UIView *view1;
@property (nonatomic, retain) UIView *view2;

//Implementation
@synthesize view1;
@synthesize view2;

//ViewDidLoad
view1 = [[UIView alloc]initWithFrame:CGRectMake(0,0,480,640)];
view2 = [[UIView alloc]initWithFrame:CGRectMake(0,0,480,640)];

view1.backgroundColor = [UIColor clearColor];
view2.backgroundColor = [UIColor clearColor];

[performAnimationsOn View1]; //I don't know the code I would put here because the code 
                             //I usually use is [UIView beginAnimation:@"animation"
                             //context:nil]; but that is a class method and I am not
                             //sure how to perform an animation on a specific subview.
[performAnimationsOn View2];

3 个答案:

答案 0 :(得分:1)

我在这里看不到问题,如果您需要的是同时动画两个不同的视图,请执行以下操作:

//First add these subviews
[self.view addSubview:view1];
[self.view addSubview:view2];


[UIView beginAnimations:@"Animation1" context:nil];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:1];
//Do something with view 1 move, change alpha, change transformation etc..    
[UIView commitAnimations];

还添加以下功能

- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
    if ([animationID isEqualToString:@"Animation1"]) {
        [UIView beginAnimations:@"Animation2" context:nil];
        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:1];
        //Do something with view 2 move, change alpha, change transformation etc..    
        [UIView commitAnimations];
    }
    else if ([animationID isEqualToString:@"Animation2"]) {
        [UIView beginAnimations:@"Animation3" context:nil];
        [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:1];
        //Do something with view 3 move, change alpha, change transformation etc..    
        [UIView commitAnimations];
    }
    //And so on.....
}

动画应按顺序发生

答案 1 :(得分:0)

这听起来像是您可以考虑使用CABasicAnimations并可能使用CAAnimation组来执行动画的情况。

当您使用UIView beginAnimationsContext时,您在上下文范围内修改的隐式属性(例如,在调用[UIView commitAnimations]之前)将同时进行动画处理。

使用CABasicAnimations稍微复杂一些,但适合您想要的行为类型。例如,您可以将动画添加到特定视图(而不是其图层)。

这是一个简单的tutorial

答案 2 :(得分:0)

您可以使用多个方法,并让animationDidStop方法依次调用每个动画,正如另一张海报建议的那样。

然而,使用像animateWithDuration这样的新的基于块的动画方法更简洁,更容易:动画:完成。

该方法允许您传入一个动画完成后执行的完成块。然后,该代码可以调用序列中的下一个动画。

如果需要,动画块可以同时为多个视图设置动画。 (因此可以使用beginAnimations / commitAnimations。您只需对beginAnimations和commitAnimations调用之间的多个视图应用更改。