Проблемы с анимацией клавиатуры при вызове статьFirstResponder в контроллере модального представления

У меня возникли проблемы с вызовом -becomeFirstResponder на UITextField, содержащемся с контроллером представления, который представлен модально. Я вызываю этот метод в -viewDidLoad методе контроллера модального представления, чтобы клавиатура отображалась немедленно. Я ожидал, что и клавиатура, и контроллер модального представления будут анимировать одновременно снизу экрана. Однако я наблюдаю следующее:

  1. Задержка пользовательского интерфейса составляет ~ 0,2 секунды между нажатием кнопки, вызывающей метод -presentModalViewController:animated: на родительском контроллере представления, и моментом, когда контроллер дочернего представления начинает модально анимировать.
  2. Как только начинается анимация модального контроллера представления, клавиатура сразу же отображается без всякой анимации.
  3. Как только анимация модального контроллера представления завершена, все остальное, кажется, работает плавно.
  4. Отказ от контроллера модального представления приводит к его плавной анимации за пределами экрана (по совпадению вместе с клавиатурой).
  5. Нажатие кнопки, которая представляет контроллер модального представления в любое время после первого раза, приводит к тому же шаблону, за исключением того, что нет задержки пользовательского интерфейса ~ 0,2 секунды.

Это как если бы анимация клавиатуры и анимация контроллера модального представления одновременно конкурировали за некий базовый ресурс анимации нижнего уровня, но я не понимаю, почему это должно происходить. Что еще больше подтверждает эту догадку, так это то, что если я не прошу UITextField стать первым респондентом (то есть, если я не прошу клавиатуру представить себя), тогда нет абсолютно никакой задержки пользовательского интерфейса, и контроллер модального представления мгновенно оживляет.

Интересно, что если я сделаю что-то вроде [self.textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0001];, то анимация клавиатуры происходит почти одновременно с анимацией контроллера модального представления - чрезвычайно трудно сказать, что они оба не анимируются в одно и то же время при запуске на Симулятор iPhone. Однако при работе на реальном устройстве легко заметить, что клавиатура не появляется до тех пор, пока не будет представлен контроллер модального представления. Однако важно то, что задержек пользовательского интерфейса больше нет.

Кто-нибудь испытывал что-нибудь подобное?


person CIFilter    schedule 25.03.2010    source источник
comment
Вы пробовали использовать UIImageView клавиатуры в анимации, чтобы искусственно создать желаемый внешний вид?   -  person james_womack    schedule 02.05.2010
comment
На iPhone 6s с iOS 9.3.2 меня устраивает анимация клавиатуры, но я заметил эту задержку, когда в первый раз вызываю статьFirstResponder из viewDidLoad. После некоторого тестирования я обнаружил, что первая презентация клавиатуры после запуска приложения откладывается, независимо от того, как она запускается. И эта задержка происходит только при подключении отладчика.   -  person Sebastian Kirsche    schedule 11.06.2016


Ответы (5)


Я считаю, что у вас проблемы из-за того, что вы эффективно складываете анимации. Представление клавиатуры содержится в модальном представлении. Представление клавиатуры пытается анимировать свой переходящий слайд в контексте представления, которое само анимирует переходный слайд. Анимация клавиатуры пытается поразить движущуюся цель.

Пауза, скорее всего, является временем выполнения анимации перехода с клавиатуры. Я почти уверен, что анимация клавиатуры получает приоритет от других анимаций, так что она может управлять перестановкой пользовательского интерфейса, например. прокрутка таблицы так, чтобы клавиатура не перекрывала редактируемую строку таблицы. В любом случае анимация клавиатуры происходит в контексте супервизора. Это особенно верно в случае модального представления.

Таким образом, представление с клавиатуры анимируется, скользя, но поскольку супервизор на самом деле еще не виден, вы ничего не видите. Когда супервизор действительно вставляется, клавиатура уже присутствует, потому что его анимация была завершена до того, как супервизор начал свою анимацию.

Короче говоря, я не думаю, что вы действительно можете выполнить то, что хотите. Вместо этого, я думаю, вам придется сначала анимировать переход модального представления, а затем запустить анимацию клавиатуры, или вам придется согласиться с тем, чтобы клавиатура была видна сразу.

Я думаю, что предложение Cirrostratus, приведенное выше, является хорошим. Используйте изображение клавиатуры, которое будет выдвигаться вместе с модальным представлением, а затем немедленно замените его реальной клавиатурой.

person TechZen    schedule 02.05.2010
comment
Спасибо за Ваш ответ. Я подозревал это, но я хотел убедиться, что я не просто сумасшедший. Проблема с предложением Cirrostratus заключается в том, что клавиатура по-прежнему будет анимироваться, как только текстовое поле станет первым респондентом. Это выглядело бы странно, потому что уже существующее изображение создает иллюзию присутствия клавиатуры. Если бы существовал способ мгновенно отображать клавиатуру без ее анимации, не было бы проблем. Попробую что-нибудь придумать. Спасибо! - person CIFilter; 03.05.2010

Меня тоже беспокоила отложенная анимация клавиатуры. viewDidLayoutSubviews был магическим методом, который я искал. Размещение там вызова becomeFirstResponder заставляет клавиатуру скользить вверх вместе с модальным окном.

https://stackoverflow.com/a/19517739/3618864

person wanderingmatt    schedule 09.05.2014

Попробуйте переместить код, который отправляет статьFirstResponder, из viewDidLoad в viewWillAppear. Я думаю, что это начинается слишком рано, вы хотите, чтобы анимация клавиатуры появлялась, когда происходит анимация отображения представления.

person progrmr    schedule 28.04.2010

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

person Andrew Hooke    schedule 28.04.2010
comment
Проблема присутствует как на устройстве, так и в симуляторе iPhone. Это не так очевидно в симуляторе iPhone, потому что он быстрее. - person CIFilter; 29.04.2010

Вот что я сделал, чтобы клавиатура выглядела так, как будто она анимировалась в то же время, что и modalviewcontroller:

В методе (init) представления, представленного модально, я создал UITextField и сделал его первым респондентом. Затем, когда я представляю контроллер модального представления с анимацией, они оба появляются одновременно.

person Ngoan Nguyen    schedule 30.12.2011