UIDynamics и устройство вращения

Если я добавлю какой-либо 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 не следует тому, что говорится в сообщении autolayout (опять же, удаляя вызов setupCollisions исправляет это).

Границы автопрокладки на greenView являются:

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

3 ответа

Решение

Одно решение, которое я нашел, было переопределить willRotateToInterfaceOrientation: и удалите UIDynamicItems а затем снова добавить их в didRotateFromInterfaceOrientation:, Это кажется мне довольно хакерским и потенциально может привести к ошибкам, если я добавлю более сложные варианты поведения.

Пожалуйста, проверьте ваши автоматические ограничения макета.

У меня была очень похожая проблема:

В моем случае у меня есть подпредставление MyView, которое имело ряд ограничений: V:|-(0)-[MyView], V:[MyView]-(0)-|, H:[MyView:(==) 300)], и это хорошо работает без UIDynamics. Но после добавления UIDynamics в MyView ширина изменилась во время вращения, что очень похоже на вашу проблему.

Я исправил это, добавив еще одно ограничение: H:|-(0)-[MyView]

Динамический аниматор меняет кадры задействованных видов. В результате любая анимация будет нарушена вызовом -[UIView setNeedsLayout] (представления будут размещены в ограниченных позициях независимо от состояния динамической анимации.

Мое наблюдение состоит в том, что вы используете автоматически сгенерированные ограничения макета, динамический аниматор удаляет их из любого представления, участвующего в анимации.

Если вы добавите свои собственные ограничения макета - они сохранятся - но могут нарушить вашу анимацию, когда представление просят пересчитать макет.

Другие вопросы по тегам