Проблемы с анимацией клавиатуры при вызове становления становиться возвращенным внутри модального контроллера вида - PullRequest
8 голосов
/ 25 марта 2010

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 02 мая 2010

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

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

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

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

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

1 голос
/ 09 мая 2014

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

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

0 голосов
/ 30 декабря 2011

Это то, что я сделал, чтобы заставить клавиатуру отображаться для анимации в то же время, что и контроллер modalview:

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

0 голосов
/ 29 апреля 2010

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

0 голосов
/ 28 апреля 2010

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

...