5

ビューに何らかの種類を追加するUIDynamicBehaviorと、デバイスが回転したときに完全に壊れます。これが縦向きのものです(正しく表示されています):

正しいレイアウト

そして、ここに横向きで、すべて壊れています:壊れたレイアウト

追加する呼び出しを削除する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
4

3 に答える 3

2

私が見つけた解決策の 1 つは、 をオーバーライドwillRotateToInterfaceOrientation:して削除し、UIDynamicItemsそれらを に再度追加することでしたdidRotateFromInterfaceOrientation:。これはかなりハックだと思います。より複雑な動作を追加すると、バグが発生する可能性があります。

于 2013-09-27T21:54:16.977 に答える
0

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

私は非常によく似た問題を抱えていました:

私の場合、V:|-(0)-[MyView]、V:[MyView]-(0)-|、H:[MyView:(== という一連の制約を持つサブビュー MyView があります。 300)] であり、UIDynamics がなくてもうまく機能します。しかし、UIDynamics を MyView に追加した後、回転中に幅が変更されました。これは問題と非常によく似ています。

もう1つの制約を追加して修正しました: H:|-(0)-[MyView]

于 2013-12-29T02:59:03.330 に答える