супер медленная задержка/задержка при начальной анимации клавиатуры uitextfield

<p>хорошо, эта проблема сводит меня с ума. </p><p>после нажатия на <code>uitextfield</code> клавиатура выскакивает примерно через 3-4 секунды. это происходит только при первом появлении клавиатуры после запуска приложения, после чего анимация запускается мгновенно.</p><p>сначала я подумал, что это проблема загрузки слишком большого количества изображений или моего <code>uitableview</code>, но я только что создал новый проект только с <code>uitextfield</code>, и до сих пор испытываю эту проблему. я использую ios 5, xcode версии 4.2 и работаю на iphone 4s.</p><p>это мой код:</p><pre><code>#import "viewcontroller.h" @implementation viewcontroller - (void)viewdidload { [super viewdidload]; uitextfield *textfield = [[uitextfield alloc] initwithframe:cgrectmake(20, 20, 280, 30)]; textfield.borderstyle = uitextborderstyleroundedrect; textfield.delegate = self; [self.view addsubview:textfield]; } @end </code></pre><p>это общая проблема для всех приложений?</p><p>прямо сейчас, единственный способ сделать его несколько лучше, это сделать так, чтобы <code>textfield</code> стал первым респондентом в <code>viewdidappear</code>, но это не решает проблему полностью - он просто загружает задержку, когда вместо этого загружается представление. если я сразу нажимаю на <code>textfield</code> при загрузке представления, я все равно получаю проблему; если я подожду 3-4 секунды после загрузки представления, прежде чем дотронуться до textfield, я не получу задержку.</p>

<p>таким образом, проблема не ограничивается первой установкой, как я думал ранее, а возникает каждый раз, когда приложение запускается. вот мое решение, которое решает проблему полностью. </p><pre><code>- (bool)application:(uiapplication *)application didfinishlaunchingwithoptions:(nsdictionary *)launchoptions { // preloads keyboard so there's no lag on initial keyboard appearance. uitextfield *lagfreefield = [[uitextfield alloc] init]; [self.window addsubview:lagfreefield]; [lagfreefield becomefirstresponder]; [lagfreefield resignfirstresponder]; [lagfreefield removefromsuperview]; } </code></pre>

<p>прежде чем применять какие-либо экзотические методы взлома, чтобы обойти эту проблему, попробуйте следующее: остановите сеанс отладки, закройте приложение от многозадачности, отключите устройство от компьютера и запустите приложение, нажав его значок. я видел по крайней мере два случая, в которых задержка происходит, только когда устройство подключено.</p>

<p>да, я также получил несколько секунд задержки на последнем iphone 4s. не паникуйте по некоторым причинам это происходит только при первой загрузке приложения из xcode в debug. когда я сделал релиз, я не получил задержку. просто забудь это...</p>

<p>это известная проблема.</p><p>предварительная загрузка клавиатуры кажется многообещающей. проверьте <a href="http://web.archive.org/web/20120708055451/http://blog.weareuproar.com/preloading-the-uikeyboard">предварительная загрузка uikeyboard.</a> </p><p>некоторые дополнительные материалы для чтения:</p><p> <a href="https://stackoverflow.com/questions/1628915/initial-iphone-virtual-keyboard-display-is-slow-for-a-uitextfield-is-this-hack">начальное отображение виртуальной клавиатуры iphone медленное для uitextfield. требуется ли этот взлом?</a> </p><p> <a href="https://stackoverflow.com/questions/8862659/uitextfield-keyboard-blocks-runloop-while-loading">uitextfield клавиатура блокирует runloop во время загрузки?</a> </p><p> <a href="http://www.iphonedevsdk.com/forum/iphone-sdk-development/12114-uitextfield-loooong-delay-when-first-tapped.html">http://www.iphonedevsdk.com/forum/iphone-sdk-development/12114-uitextfield-loooong-delay-when-first-tapped.html</a> </p>

<p>вы можете использовать решение vadoff в swift, добавив его в didfinishlaunchingwithoptions:</p><pre><code>// preloads keyboard so there's no lag on initial keyboard appearance. let lagfreefield: uitextfield = uitextfield() self.window?.addsubview(lagfreefield) lagfreefield.becomefirstresponder() lagfreefield.resignfirstresponder() lagfreefield.removefromsuperview() </code></pre><p>это работает для меня в ios 8.</p>

<p>код в блоке добавляется в основную очередь и выполняется асинхронно. (не заблокирован основной поток)</p><pre><code>dispatch\_async(dispatch\_get\_main\_queue(), ^(void){ [textfield becomefirstresponder]; }); </code></pre>

<p>смотрите <a href="https://stackoverflow.com/a/19668174/168594">этот ответ</a> . они предлагают <a href="https://github.com/mbrandonw/uiresponder-keyboardcache">uiresponder + keyboardcache</a> . это просто и круто. протестировано на ios 7.</p>

<p>связанная проблема, когда uiviewcontroller будет отображаться медленно, была решена путем использования системного шрифта вместо пользовательского шрифта в uitextfield. возможно, использование системного шрифта также подойдет для этой проблемы?</p>

<p>этот выбранный ответ вызывает сбой bad\_exc на ios 11 - удалить из приложения, чтобы исправить</p>

<p>эта ошибка, кажется, исправлена в ios 9.2.1. после обновления моего устройства у меня больше не возникает задержка между прикосновением к текстовому полю и отображением клавиатуры, когда мое устройство подключено к компьютеру.</p>