0

我的目标是为我的 UI 设置动画,我正在使用 UIView 动画。问题是我一次需要多个动画,但显然我一次只能执行一个 UIView 动画。我之前已经问过这个主题的问题(多个 UIView 动画),所有响应者都说我必须使用类似的方法为动画设置一个委托,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];
4

3 回答 3

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.....
}

动画应按顺序发生

于 2012-06-03T20:04:34.163 回答
0

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

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

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

这是一个简单的教程

于 2012-06-03T20:49:28.780 回答
0

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

但是,使用新的基于块的动画方法(如 animateWithDuration:animations:completion)更简洁、更容易。

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

如果需要,动画块可以同时为多个视图设置动画。(对于这个问题,beginAnimations/commitAnimations 也是如此。您只需在 beginAnimations 和 commitAnimations 调用之间对多个视图应用更改。

于 2012-06-03T21:54:35.770 回答