CollisionBehaviour не работает с autolayout
Я пытаюсь реализовать коллизии между двумя взглядами.
firstView
это просмотр с текстовыми полями. Если какое-то текстовое поле стало первым, распознаватель и кадр клавиатуры перекрываются firstView
, Он движется вверх, и если firstView
сталкивается с secondView
, это должно подтолкнуть его тоже. Но этого не происходит. Вместо firstView
движется вверх, пока не столкнется с secondView
а затем ставит обратно на старое место.
Вот код, который я использую:
- (void) keyboardChangeValueWithFrame:(CGRect)keyboardFrame isOpening:(BOOL)isOpening isClosing:(BOOL)isClosing {
CGFloat animTime = .3f;
if (isOpening && !isClosing) {
CGRect authFillerViewFrame = self.regFillerView.frame;
CGFloat rectDif = keyboardFrame.origin.y - authFillerViewFrame.origin.y - authFillerViewFrame.size.height;
if ([_animator.behaviors containsObject:_collision]) {
[_animator removeBehavior:_collision];
}
if (rectDif < 0) {
[self.view layoutIfNeeded];
self.regFillerViewHorizCenterConst.constant = rectDif;
[self.logoView layoutIfNeeded];
[UIView animateWithDuration:animTime animations:^{
_collision = [[UICollisionBehavior alloc] initWithItems:@[self.regFillerView, self.logoView]];
_collision.translatesReferenceBoundsIntoBoundary = NO;
_collision.collisionDelegate = self;
_collision.collisionMode = UICollisionBehaviorModeItems;
[_animator addBehavior:_collision];
_collision.action = ^{
};
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
if (finished) {
//
}
}];
}
} else if (!isOpening && isClosing) {
[self.view layoutIfNeeded];
self.regFillerViewHorizCenterConst.constant = 0.f;
[UIView animateWithDuration:animTime animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
//
}];
}
}
Может ли кто-нибудь сказать мою ошибку? Или, может быть, кто-то знает лучшее решение?
1 ответ
Я нашел решение. Моя ошибка состояла в том, чтобы добавить поведение столкновения к аниматору перед вызовом layoutIfNeeded
, Теперь я звоню layoutIfNeeded
перед добавлением поведения столкновения, и это работает хорошо.
[UIView animateWithDuration:animTime animations:^{
_collision = [[UICollisionBehavior alloc] initWithItems:@[self.regFillerView, self.logoView]];
[self.view layoutIfNeeded];
_collision.translatesReferenceBoundsIntoBoundary = NO;
_collision.collisionDelegate = self;
_collision.collisionMode = UICollisionBehaviorModeItems;
[_animator addBehavior:_collision];
_collision.action = ^{
};
} completion:^(BOOL finished) {
if (finished) {
//
}
}];