UITextField'in ilk klavye animasyonunda süper yavaş gecikme / gecikme


169

Pekala, bu sorun beni deli ediyor.

Klavyeme dokunulduktan sonra klavyenin çıkması yaklaşık 3-4 saniye sürer UITextField. Bu, yalnızca uygulama başlatıldığından beri klavyenin ilk açılışında gerçekleşir, daha sonra animasyon anında başlar.

İlk başta bunun çok fazla resim yükleme sorunu olduğunu düşündüm, ya da benim UITableView, ama sadece a ile yepyeni bir proje oluşturdum UITextFieldve hala bu sorunu yaşıyorum. İOS 5, Xcode ver 4.2 kullanıyorum ve bir iPhone 4S üzerinde çalışıyorum.

Bu benim kodum:

#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

Bu, tüm uygulamalar için ortak bir sorun mu?

Şu anda, onu daha iyi hale getirebilmemin tek yolu, textFieldilk yanıtlayıcı haline gelmek / istifa etmektir viewDidAppear, ancak bu sorunu tamamen çözmez - görünüm yerine yüklendiğinde sadece gecikmeyi yükler. textFieldGörünüm yüklendiğinde hemen tıklarsam, yine de sorunu alıyorum; textField öğesine dokunmadan önce görünüm yüklendikten sonra 3-4 saniye beklersem gecikmeyi alamıyorum.

Yanıtlar:


291

Bu sorunu çözmek için herhangi bir egzotik hack uygulamadan önce şunu deneyin: hata ayıklama oturumunu durdurun, uygulamayı çoklu görevden kapatın, cihazınızı bilgisayardan çıkarın ve simgesine dokunarak uygulamayı normal bir şekilde çalıştırın. Gecikmenin yalnızca cihaz takılıyken gerçekleştiği en az iki durum gördüm.


2
İOS 8.1 çalıştıran bir iPhone 5'teki benim durumumda bu doğru cevaptı - ilk klavye için yaklaşık 1 saniye gecikme yaşıyordum.
bejonbee

7
Evet, gecikme yalnızca hata ayıklama sırasında ortaya çıkar. Tuhaf.
Pauls

16
Teşekkür ederim. Bu sorun iOS 9.1 / Xcode 7.1, Swift 2.1'de hala mevcut.
Yaroslav

4
FYVM Elma, FYVM. 90 dakika süresinde param yetmez. Yapabilirsem 20 oy. İOS9.2 / Xcode 7.2'de hala mevcut
BaseZen

1
Benim sorunum da aynen buydu. Mac'imden çıkarıldıktan sonra hiçbir gecikme olmadı (ios9) xcode 7.2
Onaylanmadı Darren

148

Bu nedenle, sorun daha önce düşündüğüm gibi sadece ilk kurulumla sınırlı DEĞİL, ancak uygulama her başlatıldığında gerçekleşir. İşte sorunu tamamen çözen çözümüm.

- (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
Güzel ve basit @Vadoff - bu, aşağıda verilen UIResponder + KeyboardCache örneğinin satır içi bir sürümüdür
amergin

4
Bu işletim sistemi tarafından ele alınmalıydı ... ama oh iyi: /
chakrit

9
Teşekkürler! sorun ne yazık ki hala ios8'de kalıyor, ancak bu geçici çözüm hala
çözüyor

1
@Vadoff Çözüm çalışıyor, ancak 2 eksi var: 1) Uygulama yüklemesi için yaklaşık 1 saniye daha var; 2) Alınan bellek uyarısı (ancak her zaman değil). Bu kodu viewDidLoad UIViewController eklemek için çalıştı, ancak hiçbir etkisi yoktu, belki bir şey yanlış yaptım? Yanıtınızı düzenleyebilir ve mümkünse görüntüleme denetleyicisi için kod ekleyebilir misiniz?
Dima Deplov

16
Bunun doğru cevap ve işe yarar olması beni ağlatıyor. Bu hack uygulandıktan sonra duş almak zorunda kaldım.
Bill Burgess

27

Evet, ayrıca en son iPhone 4s'de birkaç saniye gecikme var. Panik yapma. Bazı nedenlerden dolayı, uygulama yalnızca Debug'daki Xcode'dan ilk yüklendiğinde olur. Serbest bıraktığımda gecikmeyi alamıyorum. Unut gitsin...


6
Bu optimizasyon seviyesine nedeniyle olduğunu: Fastest, Smallest [-Os]. DeğiştirebilirsinizBuild Settings > Optimization Level
Carlos Ricardo

20

3
Teşekkürler, bağlantıların çoğu gecikme "eski iPhone'larda 1 saniye", "3g üzerinde fark değil" ve "anında yeni cihazlara yükler" olmak için söz ama 3-4 çok daha uzun bir gecikme yaşıyorum bir iphone 4s saniyede. Şimdi klavyeyi önceden yüklemeyi deneyeceğim, ancak başka bir şeyin sorun olabileceğinden endişeleniyorum (belki ios5 veya xcode ver?).
Vadoff

UITextField ve klavyenin yerel bir uygulamada nasıl davrandığını denediniz mi? Bu testten önce hafızadan çıkardığınızdan emin olun (ana sayfa düğmesine çift 'tıklayın'). Gönderdiğiniz kodda yanlış bir şey yok ve 3-4 saniye gerçekten çok fazla görünüyor - çok fazla. Bu önyüklemeyi hiç denemedim ama tek geçici çözüm gibi görünüyor.
Rok Jarc

Evet, Haritalar için Search textField, lansmandan sonra tıklandığında klavyeyi anında açar. Bellekten kaldırdım ve birkaç kez denedim, her seferinde anında. Madenin neden bu kadar yavaş olduğuna dair emin değilim.
Vadoff

UITextField kullanan uygulamalarımdan birinde bir test yaptım - gecikme gerçekten çok az olmalı. Gönderdiğiniz kod iyi görünüyor, bu nedenle ana iş parçacığını geri tutan başka bir şey olmalı. Bu meşhur Enstrümanları başlatmak için iyi bir zaman olabilir.
Rok Jarc

23
Tamam, bu sorunu yaşayan herkes için. Ben sadece app iphone xcode gelen ilk kez güncellendi keşfetti. Uygulama iphone'a yüklendikten sonra, uygulama ile başka kullanımlar normal davranışa neden olur (programı bellekten birkaç kez kaldırdım / emin olmak için iphone'umu yeniden başlattım).
Vadoff

18

DidFinishLaunchingWithOptions'a ekleyerek Vadoff'un Swift'teki çözümünü kullanabilirsiniz:

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

İOS 8'de benim için çalışıyor.


5

Bloktaki kod ana kuyruğa eklendi ve eşzamansız olarak çalıştırıldı. (ana ipliği kilitlemeyin)

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

6
Kodunuzun neden çalıştığını açıklayan metinsel bir açıklama eklemeye çalışın ve başkalarının ondan öğrenebilmesi için vermeyin.
Kızak

7
Bu kod aslında ana iş parçacığını engelliyor, ana kuyruğa gönderiyorsunuz ...
Werner Altewischer 11.11.2015

dispatch_async / dispatch_sync arasındaki farkı biliyor musunuz? Ve sizce [textField beFirstResponder]; ana iplik için çok zor?
Sergey Petruk

@ Disppet_async adlı iş parçacığı çağıran iş parçacığı engellenmez, ancak kodu gerçekten çalıştırdığınız iş parçacığı kesinlikle engellenir. Tek bir iş parçacığı aynı anda iki şey yapamaz, bu nedenle bu kod ana iş parçacığını (dispatch_get_main_queue nedeniyle) engeller, ancak dispatch_async'in çağrıldığı iş parçacığını engellemez.
Kevin

@Kevin ama bir şey ana iş parçacığını engelliyor ve sonuç olarak klavye animasyonu çalışmıyor. Sana katılıyorum, ama benim düşüncem, textD çözüm uygulamasıDosyaDosyası'nda kötü kokuyor.
Sergey Petruk


1

Bir UIViewController'ın sunumunun yavaş olacağı ilgili bir sorun, UITextField üzerinde özel bir font yerine sistem fontu kullanılarak çözülmüştür. Belki sistem yazı tipini kullanmak da bu sorun için işe yarayabilir?


0

Bu hata iOS 9.2.1'de düzeltilmiş gibi görünüyor. Cihazımı yeni sürüme geçirdiğimden beri, artık bir metin alanına dokunma ile cihazım bilgisayarıma bağlıyken görüntülenen klavye arasında bir gecikmem yok.


1
iPhone'da sabit gibi görünüyor ama iPad'de hala gecikme var.
Adarkas2302

0

Bu seçilen yanıt iOS 11'de BAD_EXC kilitlenmesine neden oluyor - düzeltmek için uygulamadan kaldır


-2

ViewDidAppear gibi viewController görünümü yüklendiğinde aşağıdaki kodu ekleyebilirsiniz. Sadece uygulama değil: didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.