Вот одно решение, которое я придумал.Вызовите 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];
}