1

多くの中から1つの特定のサブビューのトランジションをアニメーション化しようとしています。もともと、transitionFromView:toView:それを実行しようとすると、superView全体がアニメーション化されましたが、これは私が望んでいることではありません。特定のサブビューのみをアニメーション化する必要があります。そこで、これを検索して見つけました。transitionFromViewとtransitionWithViewを使用した遷移動作。これは、アニメーションを実行するためのコンテナビューを作成することを提案します。わかりました。簡単なので、次のコードを思いつきました。

UIView *container = [[UIView alloc] init];
container.frame = selected.frame;
selected.frame = container.bounds;
[selected.superview addSubview:container];
[container addSubview:selected];
[UIView transitionFromView:selected toView:normal duration:.2f options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL fin){
    normal.frame = container.frame;
    [container.superview addSubview:normal];
    [container removeFromSuperview];
}];

しかし、今はアニメーションがまったく表示されません。簡単なものが足りないかもしれませんが、見つかりません。何か案は?

アップデート

すべての値が初期化されます。このコードブロックが実行される直前に中断した場合は、デバッガコンソールからこれをプルアップします。

(gdb) po normal
<SLabel: 0x9c43150; frame = (0 0; 40 40); text = '28'; tag = 28; layer = <CALayer: 0x9c43190>>
(gdb) po selected
<SLabel: 0x9ca5f00; frame = (137 148; 45 37); text = '28'; tag = 28; layer = <CALayer: 0x9c596b0>>
(gdb) po [normal superview]
Can't print the description of a NIL object.
(gdb) po [selected superview]
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>>

コードが5行目を通過した後(遷移メソッドの直前)、次のようになります。

(gdb) po container
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>>
(gdb) po [container superview]
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>>
(gdb) po [selected superview]
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>>

したがって、すべてが正しいようです。コンテナは、選択したビュー(フリップしたいビュー)の場所に配置されます。選択したビューのスーパービューに追加されたコンテナ。選択したビューがコンテナ内に配置されます。そして最後に、遷移が実行されます(後でクリーンアップされます)。しかし、まだアニメーションが表示されません...遷移はすぐに発生します。

ビュー間の遷移が正しく行われていることに注意してください。アニメーションがまったく表示されません。

別の質問:アニメーションを実行するために、遷移するビューは、UINavigationControllerビューのサブビューである必要がありますか?私が覚えているこのような要件を見たことがありませんが、それは私のコードの1つの非標準的な側面です。各ビューのスーパービューをたどると、ウィンドウに到達する前にナビゲーションコントローラーの一部になることはありません。時々Appleのフレームワークは予想外の方法で互いに依存しています...私はこれがそれらの1つであるかどうか疑問に思いました。

最終的な答えは、私のコードはすべて正しかったということでした。何が起こっていlayoutSubviewsたのかというと、アニメーションを開始した後に呼び出され、アニメーションを開始する前にすべてのサブビューを再レイアウトしていました。なぜ呼ばれたのかよくわかりません。私は自分のコードからそれを呼び出さなかったので、何らかの理由で私の移動するビューがUIViewをトリガーしてそれを呼び出すようになりました。とにかく、私は自分のコードをlayoutSubviewsプライベートメソッドに移動し、ビューのサイズが変更されたときにのみ呼び出します。すべてが機能するようになりました。:)

4

1 に答える 1

0

あなたがそこに置いたコードにはエラーはありません、私が考えることができる唯一のことはあなたが他の場所で何か問題を抱えているということです。コンテナビューが表示されているビューに移動していることを確認しますか?

どの方法でそれを呼んでいますか?

アニメーションを実行するために必要なことは次のように示されているためです(そして、ここに投稿するコードから実行しています)。

UIView* normalView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[normalView setBackgroundColor:[UIColor redColor]];
UIView* selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
[selectedView setBackgroundColor:[UIColor blueColor]];

UIView* container = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
[container setBackgroundColor:[UIColor grayColor]];

[container addSubview:selectedView];
[self.view addSubview:container];

次に、メソッドを呼び出してフリップを実行します。

[UIView transitionFromView:selectedView toView:normalView duration:2.0 options:UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL fin){}];
于 2012-03-27T20:58:54.077 に答える