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) {
                    //
                }
            }];
Другие вопросы по тегам