self.myMainView というスーパービューがあります
そのビューには、UIView *view1 (緑のビュー)、UIView *view2 (灰色のビュー)、UIImageView *view3 の 3 つのサブビューがあります。
ビュー3の動きをアニメ化したい
ビュー 3 が終了したら、スクリーンショットの例のように、ビュー階層を変更したいよりもこのアニメーションを終了します。
画像の例を次に示します。
あなたがしていることは、ビューのレイヤー順序を変更するための通常の標準的な方法です。したがって、問題はこれではなく、「しかし、それは私のアニメーションに違反しています」と「私のアニメーションをつぶす」という言葉です。問題は、レイヤーを再配置することによって「違反」および「粉砕」できる場合、アニメーションにあります。ただし、質問では、アニメーションに関する情報を提供していません。しかし、それが問題の核心であることは明らかです。
EDIT:アニメーションコードを投稿したので、テストできました。問題が何であるかがわかります。問題は、自動レイアウトを使用していることです。
view3
制約によって配置されます。の位置をアニメートするとview3
、これらの制約に違反しますが、これはすぐには明らかになりません。でも と の重ね順を入れ替えるview1
とview2
レイアウトができる!次に、上の制約view3
が適用されます。これらの制約は変更されていないため、view3
最初にあった場所を確認できます。
最も簡単な解決策は、必要がなければ自動レイアウトをオフにすることです。それ以外の場合は、アニメーションの後またはアニメーションの一部として、制約を変更する必要があります。実際、view3
その位置拘束をアニメートすることで再配置できます。私はこのすべてを私の本の中で説明しています。
問題は、アニメーション後に変更されないビュー 3 の制約にあり、ビュー階層を操作したい場合、アニメーションが適切に停止します。マットは彼の答えでそれについて言いました、また彼は彼の素晴らしい本から解決策を提供します:http://www.apeth.com/iOSBook/ch17.html#_animation_and_autolayout そのマットに感謝します。
このソリューションを少し変更し、これを必要とする人のためにここに投稿することにしました。しかし、これをよりよく理解したい場合は、本からアニメーションに関する章を読むことを強くお勧めします.リンクは上にあります.
まず、ビュー 3 の動きをアニメーション化する必要があります。次に制約を変更し、その後でのみビュー階層を変更します。この本には、これを行うためのいくつかの方法が見つかりましたが、これが私には最高のようです。
layout = -35.0; // new constraint constant of self.view3
NSArray *constraintsForAnimation = self.myMainView.constraints; // all constraints of superview
NSUInteger indexOfconstraintsAttribute = [constraintsForAnimation
indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){ // get index of constraint of view 3
NSLayoutConstraint *constraint = obj;
return (([constraint.firstItem isEqual: self.view3])) ? idx : NO; // return this index if we found constraint of view 3
}];
constraint.constant = layout; // changing the constraint of view3
[UIView animateWithDuration:0.3 animations:^{ // animation
[self.view3 layoutIfNeeded]; // apply new constraints to view3
}];
[self.myMainView exchangeSubviewAtIndex:3 withSubviewAtIndex:4];// toggle view 1 with view 2
ビュー 3 は制約を使用してのみ移動します。フレームまたは中央のビュー プロパティは設定しません。さて、私たちはやり遂げました。これは私が望むように機能します。これがあなたにも役立つことを願っています。
2 つのサブビューのどちらが重なり合っているかを切り替えるだけの場合[UIView bringSubviewToFront:]
、サブビュー配列の順序を直接いじるのではなく、単純に使用できますか? それはアニメーションの問題を解決するかもしれません。私が試みるもう1つのことは、アニメーション化されている他のビューに干渉しないようにするためにif( finished )
、あなたの呼び出しの周りに置くことです。exchangeSubviewAtIndex