多くの中から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
プライベートメソッドに移動し、ビューのサイズが変更されたときにのみ呼び出します。すべてが機能するようになりました。:)