web-dev-qa-db-ja.com

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

申し分なく、この問題は私に夢中にさせてきました。

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

最初はあまりにも多くの画像、または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

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

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

168
Vadoff

したがって、問題は、以前考えていたように最初のインストールだけに限定されず、アプリが起動するたびに発生します。問題を完全に解決する私のソリューションを次に示します。

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

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

283
Ash

ええ、最新のiPhone 4sでも数秒の遅延がありました。パニックにならないでください。何らかの理由で、アプリがデバッグでXcodeから初めてロードされたときにのみ発生します。リリースしたとき、遅延はありません。それを忘れて...

27
SmallChess
20
Rok Jarc

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

// 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で機能しています。

17
Greg

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

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

この回答 を参照してください。 IResponder + KeyboardCache を推奨します。シンプルで素晴らしいです。 iOS 7でテスト済み。

4
zekel

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

1
Crashalot

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

0
Manesh

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

0
Jeff Bowen