を使用して片側からプッシュアニメーションを作成しようとしていCATransition
ます。UIViews
これは、背景用と前景用の2つを処理するメソッドで行います。アニメーションUIView
は前景になります。ただし、新しいコンテンツで古いコンテンツを置き換えたくないので、これを行うために、すべての古いコンテンツをフォアグラウンドからバックグラウンドに移動します。これは、一方の側からUIView
のプッシュトランジションをアニメーション化するだけUIView
で、代わりに古いものを置き換えますUIView
。UIViews
前景と背景UIViews
に適切なコンテンツが含まれている瞬間からの状態をロックするなど、私がやろうとしていることを実行する方法はありますか?
私のコードは次のようなものです:
UIView *newView = argView; // argView is the view passed as a parameter to the method
// move views from foreground to background
for (UIView *v in [fgView subviews]) {
[v removeFromSuperview];
[bgView addSubview:v];
}
// Slide animation
CATransition *transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = kCATransitionFromLeft;
[fgView.layer addAnimation:transition forKey:nil];
[fgView addSubview:newView];
[編集] 私はいくつかの研究を行ってきました。どうやら(または私が起こっていると思うこと)は、背景のUIViewsの削除が暗黙のアニメーションを採用していることです。アニメーション化を停止する方法はありますか?
[編集] 回答:はい、実行できます(暗黙のアニメーションを無効にします)。次のコードで実行できます。
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];
for (UIView *v in [fgView subviews]) {
[v removeFromSuperview];
[bgView addSubview:v];
}
[CATransaction commit];
これは私がしたことであり、(アップルの開発者ポータルによると)機能するはずですが、機能しないので、質問はまだ開いています。
[編集] 多くのテストと読み取りを行った結果、ビューをスーパービューから削除すると、トランジションまたはアニメーションがこの変更を認識しないため、最新の変更が古くなって応答することが問題であることがわかりました。更新を強制したり、removeFromSuperview
またはaddSubview
がいつ終了したかを確認する方法はありますか?
[編集] 私が正確に必要としているのはこれです:1)UIViewsの現在の状態は次のとおりです:影付きのUIViewまたはmidViewの背後にある古いビューを持つbgView(このビューはアニメーション化されるべきではありません)。決してアニメーション化されないmidView。現在のUIViewを備えたfgView。2)fgViewのコンテンツをbgView(アニメーション化されない)に移動し、fgViewに追加された新しいUIViewの外観をアニメーション化します(スライド、フェードイン/アウト、またはフリップアニメーションを使用)。