В моем приложении у меня есть текстовое поле в каком-то виде, которое закрывается клавиатурой, когда оно появляется.Так что я должен прокрутить представление (или даже переставить подпредставления).Для этого я:
регистрируюсь для уведомлений клавиатуры:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moveViewUp)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(moveViewDown)
name:UIKeyboardWillHideNotification
object:nil];
после получения уведомления перемещаю вид, используя блочную анимацию, подобную этой:
- (void)moveViewUp {
void (^animations)(void) = nil;
oldViewFrame = self.view.frame;
animations = ^{
CGRect newViewFrame = oldViewFrame;
newViewFrame.origin.y -= kViewOffset;
self.view.frame = newViewFrame;
};
[UIView animateWithDuration:1.0
animations:animations];
}
- (void)moveViewDown {
void (^animations)(void) = nil;
animations = ^{
self.view.frame = oldViewFrame;
};
[UIView animateWithDuration:1.0
animations:animations];
}
Это прекрасно работает, вид прокручивается вверх и вниз, пока я не добавлю еще анимацию.В частности, я добавляю переход к следующему представлению, когда пользователь нажимает кнопку:
- (IBAction)switchToNextView:(id)sender {
// [self presentModalViewController:nextViewController animated:YES];
[UIView transitionFromView:self.view
toView:self.nextView
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromRight
completion:nil];
}
Теперь мы подошли к проблеме.
Если первое представление было смещено при нажатии кнопки (чтоозначает, что клавиатура была видимой), переход к следующему представлению начинается одновременно с скольжением клавиатуры вниз, но само представление не перемещается вниз , поэтому в течение доли секунды мы можем фактически увидеть базовое представление,Это не правильно.Когда я представляю следующий вид модально (см. Закомментированную строку), все анимации идут так, как я хочу: т. Е. Клавиатура прячется, вид переворачивается справа и , прокручивая вниз - все одновременно,Это было бы хорошо, но проблема в том, что у меня на самом деле нет UIViewController
для этого представления.На самом деле я пытаюсь смоделировать модальное поведение без UIViewController
(почему так? возможно, это просто плохой дизайн, я выложу еще один вопрос по этому вопросу ).
Так почему же в этом случае анимация из метода moveViewDown
не запускается в нужное время?
Обновление 1
Я добавил отладочную печать для каждой функции впроверьте порядок звонков, вот что я получаю:
-[KeyboardAnimationViewController moveViewUp]
__-[KeyboardAnimationViewController moveViewUp]_block_invoke_1 <-- scroll up animation
-[KeyboardAnimationViewController switchToNextView:]
-[KeyboardAnimationViewController moveViewDown]
__-[KeyboardAnimationViewController moveViewDown]_block_invoke_1 <-- scroll down animation
Даже если я передвигаю вид вниз перед переходом, как это
- (IBAction)switchToNextView:(id)sender {
// [self presentModalViewController:nextViewController animated:YES];
NSLog(@"%s", __PRETTY_FUNCTION__);
if (self.view.frame.origin.x < 0)
[self moveViewDown];
[UIView transitionFromView:self.view
toView:self.nextView
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromRight
completion:nil];
}
Я получаю точно тот же журнал.
Обновление 2
Я экспериментировал еще немного и сделал следующие выводы:
- Если я позвоню
moveViewDown
или resignFirstResponder:
явно анимация откладывается до конца текущего цикла выполнения, когда все ожидающие анимации фактически начинают воспроизводиться.Хотя блок анимации сразу записывается на консоль - мне кажется странным! - Метод
transitionFromView:toView:duration:options:completion:
(возможно, transitionWithView:duration:options:animations:completion:
тоже не проверял этот), очевидно, делаетснимок «from-view» и «to-view» и создает анимацию, используя исключительно эти снимки.Поскольку прокрутка представления откладывается, снимок сделан, когда представление все еще смещено.Этот метод каким-то образом игнорирует даже параметр UIViewAnimationOptionAllowAnimatedContent
. - Мне удалось получить желаемый эффект, используя любой из
animateWithDuration: ... completion:
методов.Кажется, что эти методы игнорируют параметры перехода подобно UIViewAnimationOptionTransitionFlipFromRight
. - Клавиатура начинает скрываться (неявно) и отправляет соответствующее уведомление при вызове
removeFromSuperview
.
Пожалуйста, поправьте меня, если я где-то ошибаюсь.