Tunda / tunda super lambat pada animasi keyboard awal UITextField

169

Baiklah, masalah ini membuat saya gila.

Diperlukan sekitar 3-4 detik untuk keyboard muncul setelah saya menyentuh layar saya UITextField. Ini hanya terjadi pada saat pertama kali keyboard muncul sejak aplikasi diluncurkan, setelah itu animasi dimulai secara instan.

Pada awalnya saya pikir itu masalah memuat terlalu banyak gambar, atau saya UITableView, tapi saya baru saja membuat proyek baru dengan hanya UITextField, dan saya masih mengalami masalah ini. Saya menggunakan iOS 5, Xcode ver 4.2, dan berjalan di iPhone 4S.

Ini kode saya:

#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

Apakah ini masalah umum untuk semua aplikasi?

Saat ini, satu-satunya cara saya dapat membuatnya agak lebih baik adalah dengan textFieldmenjadi / mengundurkan diri sebagai responden pertama viewDidAppear, tetapi itu tidak menyelesaikan masalah sepenuhnya - itu hanya memuat penundaan ke saat tampilan dimuat sebagai gantinya. Jika saya mengklik textFieldsegera ketika tampilan dimuat, saya masih mendapatkan masalah; jika saya menunggu 3-4 detik setelah tampilan dimuat sebelum menyentuh textField, saya tidak mendapatkan penundaan.

Vadoff
sumber

Jawaban:

291

Sebelum Anda menerapkan peretasan eksotis untuk mengatasi masalah ini, coba ini: hentikan sesi debug, tutup aplikasi dari multitasking, cabut perangkat Anda dari komputer dan jalankan aplikasi secara normal dengan mengetuk ikonnya. Saya telah melihat setidaknya dua kasus di mana penundaan hanya terjadi saat perangkat terhubung.

Abu
sumber
2
Ini adalah jawaban yang benar dalam kasus saya pada iPhone 5 yang menjalankan iOS 8.1 - Saya mengalami penundaan 1 detik untuk keyboard pertama.
bejonbee
7
Yap, lagg hanya terjadi saat debugging. Aneh.
Paul
16
Terima kasih. Masalah ini masih ada di iOS 9.1 / Xcode 7.1, Swift 2.1.
Yaroslav
4
FYVM Apple, FYVM. Waktu 90 menit pada tenggat waktu yang saya tidak mampu. 20 upvotes jika saya bisa. Masih ada di iOS9.2 / Xcode 7.2
BaseZen
1
Persis seperti itulah masalah saya. Setelah saya mencabut dari mac saya tidak ada penundaan (ios9) xcode 7.2
Darren
148

Jadi masalahnya BUKAN hanya terbatas pada instalasi pertama seperti yang saya pikirkan sebelumnya, tetapi terjadi setiap kali aplikasi diluncurkan. Inilah solusi saya yang menyelesaikan masalah sepenuhnya.

- (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];
}
Vadoff
sumber
1
@Vadoff bagus dan sederhana - ini adalah versi inline dari contoh UIResponder + KeyboardCache yang diberikan di bawah ini
amergin
4
Ini seharusnya sudah ditangani oleh OS ... tapi oh well: /
chakrit
9
Terima kasih! masalah masih tetap pada ios8 sayangnya, tetapi ini-sekitar masih menyelesaikannya
hitme
1
@Vadoff Solution berfungsi, tetapi memiliki 2 minus: 1) Saya memiliki sekitar 1 detik tambahan pemuatan aplikasi; 2) Menerima peringatan memori (tetapi, tidak setiap saat). Saya mencoba menambahkan kode ini ke UIViewController di viewDidLoad, tetapi tidak berpengaruh, mungkin saya membuat kesalahan? Bisakah Anda mengedit jawaban Anda dan menambahkan kode untuk view controller, jika ini memungkinkan.
Dima Deplov
16
Fakta bahwa ini adalah jawaban yang benar dan berhasil membuat saya menangis. Saya harus mandi setelah menerapkan hack ini.
Bill Burgess
27

Ya, saya juga mendapat penundaan beberapa detik pada iPhone 4 terbaru. Jangan panik. Untuk beberapa alasan, itu hanya terjadi saat aplikasi pertama kali dimuat dari Xcode di Debug. Ketika saya melakukan Release, saya tidak mendapatkan penundaan. Lupakan saja...

Halo Dunia
sumber
6
Ini karena tingkat optimasi: Fastest, Smallest [-Os]. Anda dapat mengubahnya diBuild Settings > Optimization Level
Carlos Ricardo
20

Ini adalah masalah yang diketahui.

Keyboard preloading tampaknya menjanjikan. Periksa Preloading the UIKeyboard.

Beberapa bahan bacaan tambahan:

Tampilan keyboard virtual iPhone awal lambat untuk UITextField. Apakah hack ini diperlukan?

Keyboard UITextField memblokir runloop saat memuat?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/12114-uitextfield-loooong-delay-when-first-tapped.html

Rok Jarc
sumber
3
Terima kasih, banyak tautan menyebutkan penundaan sekitar "1 detik pada iPhone lama", "tidak terlalu terlihat pada 3g", dan "memuat langsung pada perangkat baru" tetapi saya mengalami penundaan yang jauh lebih lama dari 3-4 detik pada iphone 4s. Saya akan mencoba preloading keyboard berikutnya, tapi saya khawatir ada hal lain yang mungkin menjadi masalah (mungkin ios5 atau xcode ver saya?).
Vadoff
Apakah Anda mencoba bagaimana UITextField & keyboard berperilaku di aplikasi asli? Pastikan untuk menghapusnya dari memori sebelum tes ini (klik dua kali pada tombol beranda ...). Tidak ada yang salah dengan potongan kode yang Anda posting dan 3-4 detik benar-benar tampak banyak - terlalu banyak. Saya tidak pernah mencoba preloading ini tetapi sepertinya satu-satunya solusi.
Rok Jarc
Ya, Search textField untuk Maps menampilkan keyboard secara instan ketika diklik setelah diluncurkan. Saya menghapusnya dari memori dan mencoba beberapa kali, instan setiap kali. Saya tidak yakin ada apa dengan mengapa milik saya sangat lambat.
Vadoff
Baru saja melakukan tes pada salah satu aplikasi saya yang menggunakan UITextField - lag harus benar-benar minimal. Kode yang Anda posting tampaknya baik-baik saja sehingga pasti ada sesuatu yang menahan utas utama. Ini mungkin saat yang tepat untuk meluncurkan Instrumen terkenal.
Rok Jarc
23
Oke, untuk orang lain yang sepertinya memiliki masalah ini. Saya menemukan itu hanya terjadi pada saat pertama kali aplikasi diperbarui di iphone dari xcode. Setelah aplikasi dimuat di iphone, penggunaan lebih lanjut dengan aplikasi akan menghasilkan perilaku normal (saya menghapus program dari memori beberapa kali / me-restart iphone saya untuk memastikan).
Vadoff
18

Anda dapat menggunakan solusi Vadoff di Swift dengan menambahkan ini ke 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()

Ini bekerja untuk saya di iOS 8.

Greg
sumber
5

Kode dalam blok ditambahkan ke antrian utama dan berjalan secara tidak sinkron. (jangan mengunci utas)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });
Sergey Petruk
sumber
6
Cobalah untuk menambahkan penjelasan tekstual yang menjelaskan mengapa kode Anda berfungsi dan tidak hanya memberikannya sehingga orang lain dapat belajar darinya.
Kereta luncur
7
Kode ini sebenarnya memblokir utas utama, Anda mengirim pada antrian utama ...
Werner Altewischer
Anda tahu perbedaan antara dispatch_async / dispatch_sync? Dan menurut Anda [textField menjadiFirstResponder]; sangat sulit untuk utas utama?
Sergey Petruk
@Spetruk Utas yang menelepon dispatch_async tidak diblokir, tetapi utas yang Anda jalankan benar-benar diblokir. Satu utas tidak dapat melakukan dua hal sekaligus, jadi kode ini memblokir utas utama (karena dispatch_get_main_queue) tetapi tidak memblokir utas tempat dispatch_async dipanggil.
Kevin
@Kevin tetapi ada sesuatu yang menghalangi utas utama dan hasilnya animasi keyboard tidak berfungsi. Saya setuju dengan Anda, tetapi pendapat saya, solusi dengan textFiled di appDelegate baunya tidak enak.
Sergey Petruk
1

Masalah terkait, di mana UIViewController akan lamban untuk dipresentasikan, diselesaikan dengan menggunakan font sistem alih-alih font kustom pada UITextField. Mungkin menggunakan font sistem mungkin juga berfungsi untuk masalah ini?

Crashalot
sumber
0

Bug ini sepertinya diperbaiki di iOS 9.2.1. Sejak memutakhirkan perangkat saya, saya tidak lagi memiliki penundaan antara mengetuk bidang teks dan keyboard yang muncul saat perangkat saya terhubung ke komputer saya.

Jeff Bowen
sumber
1
tampaknya diperbaiki pada iPhone tetapi saya masih memiliki lag di iPad.
Adarkas2302
0

Jawaban yang dipilih ini menyebabkan BAD_EXC macet di iOS 11 - hapus dari aplikasi untuk diperbaiki

Manesh
sumber
-2

Anda dapat menambahkan kode di bawah ini ketika tampilan viewController dimuat, seperti aplikasi viewDidAppear. Tidak hanya: didFinishLaunchingWithOptions:

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