7

iOSアプリでアニメーションを作成しようとしています。このアニメーションでは、新しいビューが画面上で左からスライドし、メインビューが右にスライドしてスペースを確保します。メインビューはビューコントローラのトップビューのサブビューであり、スライドインするサイドビューは別のxibファイルからロードされます。

関連する場合は、メインビューコントローラーのviewDidLoadメソッドから呼び出されたサイドビューをロードするためのコードを次に示します。

sideViewController = [[SideViewController alloc] init];
[sideViewController loadView];

sideView = sideViewController.topView;
[self.view addSubview:sideView];
sideView.hidden = YES;
sideView.frame = CGRectMake(-200, 0, 200, 460);

そして、2つのビューをアニメーション化するために呼び出されるコードは次のとおりです。

sideView.hidden = NO;
[UIView animateWithDuration:0.25f
                 animations:^{                         
                     mainView.frame = CGRectMake(200, 0, 320, 460);
                     sideView.frame = CGRectMake(0, 0, 200, 460);
                 }];

これは十分に単純なようです。しかし、何らかの理由で、sideViewのみがアニメートします。mainViewはどこにも移動しません。さらに混乱させるために、sideViewを移動するアニメーションブロックの行をコメントアウトすると、mainViewのアニメーションが機能し始めます。

誰かが何が悪いのか知っていますか?私が読んだすべての検索とドキュメントから、私がしていることはうまくいくはずです。単純なアニメーションになると思っていたものが、何時間もの欲求不満に変わりました。どんな助けでも大歓迎です!

編集:

Guo Luchuanの提案から離れて、2つのUIViewの異なるプロパティをアニメーション化してみました。ほとんど同じ結果が得られましたが、両方の変換プロパティのアニメーション化はほぼ機能しました。その場合、両方のUIViewがアニメーション化されますが、mainViewは間違ったことをしました。アニメーションは、別の位置で開始され、間違った場所で終了しました。私が指示した変換を実行しているように見えますが、ベクトル計算で表されるこの位置から開始します。

starting_point - 0.5 * total_translation

で終わることを意味します:

starting_point + 0.5 * total_translation

ただし、sideViewは正しくアニメーション化されます。

これはうっとうしいです。このようにiOSでアニメーションを実行するのがとても壊れていることに気づきませんでした。次に試すのはCABasicAnimationを使用することですが、非常に単純なもののためにこのような低レベルのAPIを試す必要があるのは不幸です。

4

4 に答える 4

4

私はあなたとまったく同じ問題に遭遇しました。

2つのビューに同じプロパティ(frameまたはなどtransform)を同時に設定すると、で、UIView animation block期待どおりに機能しません。

だから、ビューframeを設定して別のビューを設定するとtransform、うまく機能しますが、なぜそうなるのかわかりません。

私はそれがあなたのためにうまくいくと思います。

sideView.hidden = NO;
[UIView animateWithDuration:0.25f
                 animations:^{                         
                     mainView.frame = CGRectMake(200, 0, 320, 460);
                     sideView.transform = CGAffineTransformMakeTranslation(200,0);
                 }];

CABasicAnimationそして、2を作成してからそれらをに追加できると思いますCAAnimationGroup。それはまたあなたのために働くことができます

于 2013-03-17T06:42:49.360 に答える
3

問題は、xib ファイルの自動サイズ変更をオンにしていたことでした。オフにするとすぐに、元のアニメーション コードが問題なく動作しました。

于 2013-03-18T01:14:49.410 に答える
0

私は最終的に解決策を見つけましたが、それはかなり凶悪だと思います。動作するコードは次のとおりです。

mainView.transform = CGAffineTransformMakeTranslation(400,0);
CABasicAnimation *move = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ];
[move setFromValue:[NSNumber numberWithFloat:200]];
[move setToValue:[NSNumber numberWithFloat:400]];
[move setDuration:0.25];
move.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[[mainView layer] addAnimation:move forKey:@"transform.translation.x"];

sideView.center = CGPointMake(100, 230);
CABasicAnimation *sideMove = [CABasicAnimation animationWithKeyPath:@"transform.translation.x" ];
[sideMove setFromValue:[NSNumber numberWithFloat:-200]];
[sideMove setToValue:[NSNumber numberWithFloat:0]];
[sideMove setDuration:0.25];
sideMove.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[[sideView layer] addAnimation:sideMove forKey:@"transform.translation.x"];

まず、mainView の変換を設定しなかった場合、このすべてが機能せず、アニメーションが完了した後、mainView はどこにも移動しません。フレームとセンターを設定してみましたが、どちらも効果がありませんでした。変換のみが機能しました。この詳細は、animateWithDuration メソッドの使用に似ています。

第二に、これは私が最も混乱している部分です.なぜ数字が何であるか? なんらかの理由で、適切に整列させるために、mainView を右 (sideView の幅) に 200 ピクセル余分にオフセットする必要がありました。そうしなければ、アフィン変換を恒等から右へ 200 ピクセルの移動に変更していたとしても、元の場所に正確にアニメーション化されてしまいます。

私が知る限り、sideView は何らかの奇妙な方法で mainView に影響を与えていますが、それらはビュー コントローラーのトップ レベル ビューの直下にある兄弟であり、いかなる種類の階層関係も持つべきではありません。私の推測では、これはxibからsideViewをロードすることと関係があると思いますが、私が知る限り、私はそれを正しく行っています。

願わくば、この解決策が同様の状況に陥った他の誰かに役立つことを願っており、彼らは私がやったのと同じ厄介な死んだ鶏のプログラミングをする必要はありません.

また、誰かがこのすべてについて説明を提供できる場合は、非常に感謝しています! 理解できないことをコーディングするのは好きではありません。なぜこのようなことが起こったのかを知りたいので、将来このような状況を避けることができます.

于 2013-03-17T17:15:14.783 に答える
0

sideViewが のサブビューである場合は、次のmainViewアニメーション メソッドを使用します。

+animateWithDuration:delay:options:animations:completion:

オプション付き:

UIViewAnimationOptionAllowAnimatedContent
于 2013-03-17T08:27:49.983 に答える