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]
(представления будут размещены в ограниченных позициях независимо от состояния динамической анимации.
Мое наблюдение состоит в том, что вы используете автоматически сгенерированные ограничения макета, динамический аниматор удаляет их из любого представления, участвующего в анимации.
Если вы добавите свои собственные ограничения макета - они сохранятся - но могут нарушить вашу анимацию, когда представление просят пересчитать макет.