5

UIDynamicBehaviorを私のビューに追加すると、デバイスを回転させたときに完全に分割されます。ここでは、それは肖像画にあるものだ(正しく表示さ):UID力学とデバイスローテーション

Correct Layout

そして、ここでは、それは風景の中にある、すべてが壊れた:Broken layout

を私は呼び出しを削除した場合ので、それが自動レイアウトの問題だとは思いませんUIDynamicBehaviorを追加すると、自動レイアウトの問題がなくても正常に動作します。自動レイアウトエラーもまったく投げられません。ここでは、コードです:

@interface SWViewController() { 
    UICollisionBehavior *coll; 
    UIDynamicAnimator *dynamicAnimator; 
} 

@implementation SWViewController 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    dynamicAnimator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self setupCollisions]; // commenting this out fixes the layout 
} 

- (void)setupCollisions { 
    NSArray *dynamicViews = @[greenView]; 
    coll = [[UICollisionBehavior alloc] initWithItems:dynamicViews];  
    CGFloat topBound = CGRectGetMinY(greenView.frame); 
    [coll addBoundaryWithIdentifier:@"top" 
         fromPoint:CGPointMake(0, h1) 
          toPoint:CGPointMake(CGRectGetWidth(greenView.frame), h1)];  
    [dynamicAnimator addBehavior:coll]; 
} 

私はdidRotateFromInterfaceOrientationをオーバーライドする場合、私はgreenViewの上部境界は、それが(再び、setupCollisions修正これへの呼び出しを削除する)必要があります言う自動レイアウトに従っていないことがわかります。 greenView

自動レイアウトの境界は、以下のとおりです。私が見つけ

height = 200 
trailing space to Superview = 0 
leading space to Superview = 0 
bottom space to Superview = 0 
+0

こんにちは、私はあなたがここに衝突挙動を使用していることがわかります。これは重力行動なしで何をするのですか?ありがとう。 – Unheilig

+0

この例では、Gravity Behaviorを使用していません。私がそれを切り出すと、同じことが起こります。 – swilliams

+1

件名のWWDCビデオを視聴することを強くお勧めします。今年のセッション206と221。 https://developer.apple.com/wwdc/videos/あなたが持っている場合は、あなた自身の質問を作成してください。 – swilliams

答えて

2

一つの解決策は、彼らがdidRotateFromInterfaceOrientation:に再度追加willRotateToInterfaceOrientation:をオーバーライドして、UIDynamicItemsを除去するためにでした。これはかなりハッキリと私を襲い、より複雑な振る舞いを加えるとバグを招く可能性があります。

+0

アニメーターに振る舞いを再適用することによってアニメーションが繰り返され、回転ごとにアニメーションが繰り返されるため、この問題の答えとして実際にはこれを買っていません。 –

+0

私はより良いものを見るのが大好きです(お願いします)!はい、私は物事の状態を追跡し、慎重に行動を再適用して、アニメーションが不自然に繰り返されないようにしなければなりませんでした。 – swilliams

+0

あなたはこれに対してより良い解決策を見つけましたか?特にiOS8 .. – Jan

0

ダイナミックアニメーターは、関連するビューのフレームを変更しています。結果として、-[UIView setNeedsLayout]の呼び出しによってアニメーションが乱れることがあります(動的アニメーション状態に関係なく、ビューは制約駆動位置に置かれます)。

ダイナミックアニメーターが自動的に生成したレイアウト制約を使用していますアニメーションに関わるすべてのビュー

独自のレイアウト制約を追加する場合 - 。彼らは存続 - 。しかし、ビューはレイアウトを再計算するように要求されたときにアニメーションを邪魔することができます

0

あなたの自動レイアウト制約を再確認してください

私は非常にシムを持っていた私の場合、V:| - (0) - [MyView]、V:[MyView] - (0) - |、HというサブビューMyViewがあります。 :[MyView:(== 300)]、それはUID力学でうまくいきます。しかし、MyViewにUIDynamicsを追加すると、回転中に幅が変わりました。これはあなたの問題と非常によく似ています。

私は1つの以上の制約追加することによって、それを修正:H:| - (0) - [MYVIEW]

関連する問題