Анимируйте добавление ограничения высоты в виде расширения клавиатуры - PullRequest
0 голосов
/ 29 сентября 2018

В моем расширении клавиатуры есть один конкретный viewController, который я бы хотел увеличить высоту клавиатуры.Перед представлением этого viewController основной UIInputViewController сам вызывает этот метод, передавая значение 400.0:

- (void)setKeyboardHeight:(CGFloat)height {
    if (self.heightConstraint) {
        [self.view removeConstraint:self.heightConstraint];
        self.heightConstraint = nil;
   }

    self.heightConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:height];

    [self.view addConstraint:self.heightConstraint];

    [UIView animateWithDuration:0.5 animations:^{
        [self.view layoutIfNeeded];
    }];
}

Высота клавиатуры изменяется на указанное значение, но она не анимируется.Это невозможно сделать, или я просто использую неправильный метод в расширении клавиатуры?

1 Ответ

0 голосов
/ 30 сентября 2018

Вот одно решение, которое я придумал.Вызовите animateKeyboardHeightTo: speed: и передайте высоту, которую вы хотите, чтобы клавиатура сменила на targetHeight, а количество точек в мс, равное speed, и клавиатура увеличится или уменьшится до указанной высоты.Я пытался использовать продолжительность, а не скорость, увеличивая на одну точку за итерацию и вычисляя продолжительность для dispatch_after, чтобы вся анимация происходила в течение указанной продолжительности, но я не мог заставить dispatch_after выполнить достаточно быстро.Я не знаю, является ли он просто недостаточно точным или не может выполняться с интервалами менее 1 секунды, но это было единственное решение, которое я мог бы найти.

Если вы хотите переключаться между размерамиВы можете сохранить self.view.frame.size.height в свойстве перед тем, как выполнить первоначальный вызов animateKeyboardHeightTo: speed:, а затем снова вызвать этот метод и передать сохраненную высоту, чтобы восстановить первоначальную высоту клавиатуры.

- (void)animateKeyboardHeightTo:(CGFloat)targetHeight speed:(CGFloat)speed {
    CGFloat initialHeight = self.view.frame.size.height;

    if (targetHeight < initialHeight) {
        speed = -speed;
    }
    [self setKeyboardHeight:initialHeight];
    [self increaseKeyboardHeightToTargetHeight:targetHeight speed:speed];
}

- (void)increaseKeyboardHeightToTargetHeight:(CGFloat)targetHeight speed:(CGFloat)speed {
    CGFloat currentHeight = self.heightConstraint.constant;
    CGFloat nextHeight = currentHeight + speed;
    if ((speed > 0 && nextHeight > targetHeight) || (speed < 0 && nextHeight < targetHeight)) {
        nextHeight = targetHeight;
    }
    [self setKeyboardHeight:nextHeight];

    if ((speed > 0 && nextHeight < targetHeight) || (speed < 0 && nextHeight > targetHeight)) {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
            [self increaseKeyboardHeightToTargetHeight:targetHeight speed:speed];
        });
    }
}

- (void)setKeyboardHeight:(CGFloat)height {
    [self removeHeightConstraint];
    [self addHeightConstraintWithHeight:height];
}

- (void)removeHeightConstraint {
    if (self.heightConstraint) {
        [self.view removeConstraint:self.heightConstraint];
        self.heightConstraint = nil;
    }
}

- (void)addHeightConstraintWithHeight:(CGFloat)height {
    self.heightConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:height];

    [self.view addConstraint:self.heightConstraint];
}
...