0

self.myMainView というスーパービューがあります

そのビューには、UIView *view1 (緑のビュー)、UIView *view2 (灰色のビュー)、UIImageView *view3 の 3 つのサブビューがあります。

ビュー3の動きをアニメ化したい

ビュー 3 が終了したら、スクリーンショットの例のように、ビュー階層を変更したいよりもこのアニメーションを終了します。

画像の例を次に示します。

前:

そして、私たちの操作の後、それはあるに違いありません

4

3 に答える 3

2

あなたがしていることは、ビューのレイヤー順序を変更するための通常の標準的な方法です。したがって、問題はこれではなく、「しかし、それは私のアニメーションに違反しています」と「私のアニメーションをつぶす」という言葉です。問題は、レイヤーを再配置することによって「違反」および「粉砕」できる場合、アニメーションにあります。ただし、質問では、アニメーションに関する情報を提供していません。しかし、それが問題の核心であることは明らかです。

EDIT:アニメーションコードを投稿したので、テストできました。問題が何であるかがわかります。問題は、自動レイアウトを使用していることです。

view3制約によって配置されます。の位置をアニメートするとview3、これらの制約に違反しますが、これはすぐには明らかになりません。でも と の重ね順を入れ替えるview1view2レイアウトができる!次に、上の制約view3が適用されます。これらの制約は変更されていないため、view3最初にあった場所を確認できます。

最も簡単な解決策は、必要がなければ自動レイアウトをオフにすることです。それ以外の場合は、アニメーションの後またはアニメーションの一部として、制約を変更する必要があります。実際、view3その位置拘束をアニメートすることで再配置できます。私はこのすべてを私の本の中で説明しています。

于 2013-04-24T18:20:13.443 に答える
0

問題は、アニメーション後に変更されないビュー 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 は制約を使用してのみ移動します。フレームまたは中央のビュー プロパティは設定しません。さて、私たちはやり遂げました。これは私が望むように機能します。これがあなたにも役立つことを願っています。

于 2013-04-25T20:17:09.463 に答える
0

2 つのサブビューのどちらが重なり合っているかを切り替えるだけの場合[UIView bringSubviewToFront:]、サブビュー配列の順序を直接いじるのではなく、単純に使用できますか? それはアニメーションの問題を解決するかもしれません。私が試みるもう1つのことは、アニメーション化されている他のビューに干渉しないようにするためにif( finished )、あなたの呼び出しの周りに置くことです。exchangeSubviewAtIndex

于 2013-04-24T18:38:27.747 に答える