0

私の目標は、UI をアニメーション化することであり、UIView アニメーションを使用しています。問題は、一度に複数のアニメーションを実行する必要があることですが、一度に 1 つの UIView アニメーションしか実行できないようです。以前にこのトピック (複数の UIView アニメーション)について質問したことがありますが、すべてのレスポンダーは、次のような方法でアニメーションにデリゲートを設定する必要があると言っていますが、animationDidStop:performSelector:代わりにサブビューをメイン ビューに追加してアニメーションを同時に実行できるかどうか疑問に思っていました。各サブビューで。また、アニメーションを連続して実行することはできません。委任せずにビュー 1 でアニメーションを実行し、次にビュー 2 でアニメーションを実行できるのではないかと考えていました。

例えば:

//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

2 つの異なるビューを一度にアニメーション化する必要がある場合は、次の手順を実行します。

//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 に答える