0

Xcodeについて質問があります。画面上で画像を移動できるチュートリアルをネットで見つけました。ワンクリックでボタンを左に移動させ、右に戻す方法を説明していただけますか(これはどこにも見つかりません...)、その直後に別の IBAction を実行して、別のサブビューに切り替えることができますか? (私はすでにこのコードを自然に持っています...)。両方の IBAction を 1 つの集中型に追加しようとしましたが、うまくいかないようでした :-( この場合、アニメーションを表示せずにすぐにサブビューが開きます。

私が試したこと:

今までに得たコード:

-(IBAction) aMove: (id) sender{

    if (bMove == NO) {

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        btnTarget.transform = CGAffineTransformMakeTranslation(-30,0);
        [UIView commitAnimations];
        bMove = YES;

    }else{

        btnTarget.transform = CGAffineTransformIdentity;
        bMove = NO;

    }

}

-(IBAction) aAnimateActivate: (id) sender {

    [self aMove:nil];
    [self targetOpenView:nil]; //Opens the subview

}

私はあなたの助けに感謝します!ありがとう!

4

2 に答える 2

2

concatenate はアニメーションを結合するために機能し、アニメーションの 2 つのブロック (以下に示す 2 つ) を互いの後に配置するだけです...:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

CGAffineTransform transform = CGAffineTransformConcat(CGAffineTransformMakeScale(1, 1),CGAffineTransformMakeTranslation(10, -50));       
btnGuide.transform = transform;
[btnGuide setAlpha:0.0];

[UIView commitAnimations]; 

基本的に、このコードを実装するとうまくいきました...簡単です!ただし...さらに実装するには、次のような追加のコードが必要でした。

[self performSelector:@selector(aGuide) withObject:self afterDelay:0.0];

(セレクター名は気にしないでください)および:

[NSTimer scheduledTimerWithTimeInterval:.5 target:self selector:@selector(targetOpenView:) userInfo:nil repeats:NO];  
于 2011-08-16T16:44:40.190 に答える
0

すべてのプログラムフローを確認したり、実際のテストを行ったりすることなく(Core Animationを使用する場合、正しく機能することを確認する唯一の方法は、コードを記述して機能するかどうかを確認することです)、サブビューがすぐに開くという問題が発生します。メソッドを呼び出して"aMove"最初のアニメーションを設定した直後に、スレッドは次のコード行、つまり[self] targetOpenView:nilステートメントに進みます。このステートメントはすぐにサブビューを開き、最初のアニメーションシーケンスを表示できません。 最初のアニメーションが完了するのを待つための一時停止はありません。 アニメーションは、コミットされると、コードが現在のスレッド(おそらくアプリケーションのメインスレッド)で実行され続けている間、独自のスレッドで実行されます。これは最も賢明な方法ではないように思われるかもしれませんが、作成するコードは、一度コミットされると、(コードの横で)単独で自由に実行できる別個のエンティティであるアニメーションを設定するプロセスと考える必要があります。 。Appleの実装の利点は、同時に発生するさまざまなアニメーションを大量に設定できることです。Core Animationの設計目標の1つは、プログラマーがさまざまなアニメーションの開始と停止をすべて処理する必要をなくし、代わりにさまざまな遅延継続時間の方法を使用してアニメーションの調整を行うことです。または、あるアニメーションイベントが他のアニメーションによって観察(および実行)されるための手段を提供します。

アニメーションを希望どおりに実行するには、最初のアニメーションが終了したときにのみ2番目のアニメーションを開始できる方法を使用する必要があります。1つの方法(サブビューの変更がアニメーション自体として設定されると想定)は、completion:ハンドラーを使用することです。これは、最初のアニメーションの完了時にのみ開始されるアニメーションブロックです。もう1つの方法は、2つのアニメーションを「一緒に開始」させdelay:ますが、最初のアニメーションの長さに等しいパラメーターを2番目のアニメーションに含めることです。サブビューの変更がアニメーションではなく、メインスレッドのコードで行われる場合は、アニメーションデリゲートを設定する必要がありますこれは、アニメーションで特定のイベントが発生したときに呼び出されます。その1つが完了です。パラメータがデリゲートに渡され、何が発生していて、どのアニメーションに送信されているかが示されます。

これらすべては、例を挙げて、iOSのViewプログラミングガイドのアニメーションセクションで説明されています(約10ページで、おそらくあなたが望むことをほぼ正確に行う方法が示されます)。

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/AnimatingViews/AnimatingViews.html#//apple_ref/doc/uid/TP40009503-CH6

また、ボタンをどこかに移動して元に戻す最初のアニメーションを設定するには、上記のガイドの同じセクションにあるサブトピック「自分自身を反転させるアニメーションの実装」を読むことをお勧めします。それがあなたがやりたいことをするための最もクリーンな方法だと思います。

(参考までに、私はiOS側よりもCore AnimationのMacOS側の方が優れていますが、「なぜこれがすぐに起こったのですか?」という問題は、動作に慣れるときによくある落とし穴です。この説明がお役に立てば幸いです。 )。

于 2011-08-09T08:56:36.103 に答える