UITextFieldの初期キーボードアニメーションの遅延が非常に遅い/遅延


169

申し分なく、この問題は私に気が遠くなりました。

に触れてからキーボードがポップアップするまで、約3〜4秒かかりますUITextField。これは、アプリが起動してから初めてキーボードがポップアップしたときにのみ発生し、その後アニメーションが即座に開始されます。

最初は、画像またはmyをロードしすぎる問題だと思っていましたがUITableView、だけで新しいプロジェクトを作成したばかりでUITextField、まだこの問題が発生しています。iOS 5、Xcode ver 4.2を使用しており、iPhone 4Sで実行しています。

これは私のコードです:

#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

これはすべてのアプリに共通の問題ですか?

現在、私がそれをいくらか良くすることができる唯一の方法は、でtextField最初のレスポンダーになる/辞任するviewDidAppearことですが、それは問題を完全に解決するわけではありません-代わりにビューがロードされたときに遅延をロードするだけです。textFieldビューが読み込まれた直後にクリックしても、問題が発生します。ビューが読み込まれてから3〜4秒待ってからtextFieldに触れると、遅延が発生しません。

回答:


291

エキゾチックなハックを実装してこの問題を回避する前に、次のことを試してください。デバッグセッションを停止し、アプリをマルチタスクから閉じ、デバイスをコンピューターから取り外し、アイコンをタップして通常どおりアプリを実行します。デバイスが接続されているときにのみ遅延が発生するケースを少なくとも2つ見ました。


2
これは、iOS 8.1を実行しているiPhone 5での私の正解でした。最初のキーボードで約1秒の遅延が発生していました。
bejonbee 2015年

7
はい、遅延はデバッグ時にのみ発生します。変だ。
Pauls

16
ありがとうございました。この問題は、iOS 9.1 / Xcode 7.1、Swift 2.1でも発生します。
Yaroslav、

4
FYVM Apple、FYVM。余裕のない締め切り時間の90分。できれば20票。7.2 iOS9.2 / Xcodeで依然として存在
BaseZen

1
これはまさに私の問題でもありました。Macから取り外した後、遅延はありませんでした(ios9)xcode 7.2
推奨のDarren

148

したがって、問題は以前考えていた最初のインストールだけに限らず、アプリが起動されるたびに発生します。これが問題を完全に解決する私の解決策です。

- (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];
}

1
素晴らしくシンプルな@Vadoff-これは、以下に示すUIResponder + KeyboardCacheの例のインラインバージョンです
2014年

4
これはOSによって処理されるべきでした...しかし、まあ:/
chakrit

9
ありがとう!残念ながらios8にはまだ問題が残っていますが、この回避策で問題は解決します
14年

1
@Vadoffソリューションは機能しますが、マイナスが2つあります。2)メモリ警告を受け取りました(ただし、常にではありません)。このコードをviewDidLoadのUIViewControllerに追加しようとしましたが、効果がありませんでした。可能であれば、回答を編集してビューコントローラのコードを追加してください。
ディマデプロフ2015年

16
これが正解で機能するという事実は私を泣かせます。このハックを適用した後、シャワーを浴びる必要がありました。
ビルバージェス

27

ええ、最新のiPhone 4sでも数秒の遅延がありました。慌てる必要はありません。なんらかの理由で、アプリがデバッグでXcodeから初めて読み込まれたときにのみ発生します。リリースしたとき、遅延はありません。それを忘れて...


6
最適化レベルが原因です:Fastest, Smallest [-Os]。変更することができますBuild Settings > Optimization Level
Carlos Ricardo

20

3
おかげで、多くのリンクで遅延が「古いiphoneでは1秒」、「3gではそれほど目立たない」、「新しいデバイスではすぐに読み込まれる」と記載されていますが、3〜4秒の遅延が発生しています。 iphone 4sの秒。次にキーボードをプリロードしてみますが、他に何か問題があるのではないかと心配しています(おそらくios5か私のxcodeバージョン?)。
Vadoff

ネイティブアプリでのUITextFieldとキーボードの動作を試しましたか?このテストの前に必ずメモリから削除してください(ホームボタンをダブルクリックします...)。あなたが投稿したコードの一部に問題はなく、3〜4秒は実際には多くのように見えます。私はこのプリロードを試したことはありませんが、それが唯一の回避策のようです。
Rok Jarc、2012

ええ、マップのテキストフィールドの検索では、起動後にクリックするとすぐにキーボードが表示されます。私はそれをメモリから削除して数回試しましたが、それは毎回インスタントです。なぜ私の速度が遅いのか、よくわかりません。
Vadoff

UITextFieldを使用する私のアプリの1つでテストを実行しました-ラグは本当に最小限でなければなりません。あなたが投稿したコードは問題ないようですので、メインスレッドを妨げている何かがあるはずです。これは悪名高いインストゥルメントを起動する良い機会かもしれません。
Rok Jarc、2012

23
さて、この問題があると思われる他の人のために。アプリがiphoneでxcodeから更新されたときに初めて発生することがわかりました。アプリがiphoneにロードされたら、それ以降アプリを使用すると通常の動作になります(プログラムを数回メモリから削除した/ iphoneを再起動して確認した)。
Vadoff

18

これをdidFinishLaunchingWithOptionsに追加することで、SwiftでVadoffのソリューションを使用できます。

// 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()

iOS 8で動作しています。


5

ブロック内のコードがメインキューに追加され、非同期で実行されます。(メインスレッドをロックしないでください)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });

6
コードが機能する理由を説明するテキストの説明を追加し、他の人がそれを学ぶことができるようにコードを説明するだけではありません。
2014

7
このコードは、実際にはメインスレッドをブロックし、メインキューにディスパッチします...
Werner Altewischer '11 / 11/15

あなたはdispatch_async / dispatch_syncの違いを知っていますか?[textFieldがFirstResponder]になると思いますか。メインスレッドは非常に難しいですか?
Sergey Petruk 2015年

@Spetruk dispatch_asyncを呼び出すスレッドはブロックされませんが、実際にコードを実行するスレッドは確実にブロックされます。単一のスレッドは一度に2つのことを実行できないため、このコードは(dispatch_get_main_queueのため)メインスレッドをブロックしますが、dispatch_asyncが呼び出されるスレッドはブロックしません。
Kevin

@Kevinがメインスレッドをブロックしているため、キーボードアニメーションが機能していません。私はあなたに同意しますが、私の意見では、appDelegateのtextFiledを使用した解決策は悪臭がします。
Sergey Petruk、2016年


1

UIViewControllerの表示が遅いという関連する問題は、UITextFieldでカスタムフォントの代わりにシステムフォントを使用することで解決されました。おそらく、システムフォントを使用してもこの問題が解決するでしょうか?


0

このバグはiOS 9.2.1で修正されているようです。デバイスをアップグレードしてから、デバイスをコンピューターに接続したときにテキストフィールドをタップしてからキーボードが表示されるまでの遅延がなくなりました。


1
iPhoneで修正されたようですが、iPadではまだ遅れがあります。
Adarkas2302 16

0

この選択された回答により、iOS 11でBAD_EXCがクラッシュします-アプリから削除して修正してください


-2

viewDidAppearのように、viewControllerのビューが読み込まれたときに以下のコードを追加できます。application:didFinishLaunchingWithOptionsだけではありません。

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.