objective-c - 改行 - textview キーボード 閉じる




UITextFieldの初期キーボードアニメーションでの超遅い遅延/遅延 (8)

申し訳ありませんが、この問題は私をナットにしています。

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

最初は、あまりにも多くの画像、または私の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最初のレスポンダーにviewDidAppearですが、それは問題を完全には解決しません。代わりにビューが読み込まれるときに遅延をロードするだけです。 ビューが読み込まれたときにすぐにtextFieldをクリックすると、問題は発生します。 私がtextFieldに触れる前にビューが読み込まれてから3〜4秒待っても、私は遅れは得られません。


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


viewControllerのビューがロードされたときに、viewDidAppear.Notのようなコードを以下のように追加できます。アプリケーション:didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];

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


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


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



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

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

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

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




uitextfield