UITextField初始键盘动画的超级慢延迟/延迟

Vad*_*off 169 keyboard cocoa-touch objective-c uitextfield ios

好吧,这个问题让我疯了.

触摸后,键盘弹出约需3-4秒UITextField.这仅在应用程序启动后第一次弹出键盘时发生,之后动画立即启动.

起初我认为这是装载太多图像的问题,或者是我的UITableView,但我刚刚创建了一个只有a的全新项目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
Run Code Online (Sandbox Code Playgroud)

这是所有应用程序的常见问题吗?

现在,我可以做得更好的唯一方法是textField成为/辞职第一响应者viewDidAppear,但这并不能完全解决问题 - 它只是在视图加载时加载延迟.如果我textField在视图加载时立即点击,我仍然会遇到问题; 如果我在视图加载后等待3-4秒才触摸textField,我不会得到延迟.

Ash*_*Ash 285

在实施任何异国黑客以解决此问题之前,请尝试以下操作:停止调试会话,从多任务关闭应用程序,从计算机上拔下您的设备并通过点击其图标正常运行应用程序.我已经看到至少两种情况,其中延迟仅在设备插入时发生.

  • 谢谢.iOS 9.1/Xcode 7.1,Swift 2.1上仍然存在此问题. (16认同)
  • 是的,lagg仅在调试时发生.奇怪的. (7认同)
  • FYVM Apple,FYVM.90分钟的时间在我无法承受的最后期限.如果可以的话,20支票.仍然存在于iOS9.2/Xcode 7.2中 (4认同)
  • 对于运行iOS 8.1的iPhone 5,这是我的正确答案 - 我遇到了第一个键盘大约1秒的延迟. (2认同)

Vad*_*off 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];
}
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案和工作的事实让我哭泣.应用此黑客后我不得不洗澡. (15认同)
  • 谢谢!问题仍然存在于ios8上,但是这种解决方法仍然可以解决它 (9认同)
  • 这应该由操作系统处理......但是哦,好吧:/ (4认同)

Sma*_*ess 27

是的,我也在最新的iPhone 4s上延迟了几秒钟.不要惊慌.出于某些原因,它只在第一次从Debug中的Xcode加载应用程序时发生.当我发布时,我没有得到延迟.把它忘了吧...

  • 这是由于优化级别:```最快,最小[-Os]```.你可以在```Build Settings> Optimization Level```上更改它 (6认同)

Rok*_*arc 20

这是一个已知的问题.

预装键盘似乎很有希望.检查预加载UIKeyboard.

一些额外的阅读材料:

UITextField的初始iPhone虚拟键盘显示速度很慢.这需要破解吗?

UITextField键盘在加载时会阻止runloop吗?

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

  • 好吧,对于其他似乎有这个问题的人.我发现它只发生在第一次从xcode更新iphone的应用程序时.一旦将应用程序加载到iphone上,对应用程序的任何进一步使用都将导致正常行为(我将程序从内存中删除了几次/重新启动我的iphone以确保). (23认同)
  • 谢谢,许多链接提到延迟约为"老款iphone上的1秒","3g上没有那么明显",并且"在新设备上立即加载",但我遇到的延迟时间要长得多在iphone 4s上秒.我接下来会尝试预装键盘,但我担心其他可能是个问题(也许是ios5或我的xcode ver?). (3认同)

Gre*_*reg 17

您可以在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()
Run Code Online (Sandbox Code Playgroud)

它在iOS 8中适用于我.


Ser*_*ruk 5

块中的代码添加到主队列并异步运行.(不要锁定主线程)

dispatch_async(dispatch_get_main_queue(), ^(void){
      [textField becomeFirstResponder];
 });
Run Code Online (Sandbox Code Playgroud)

  • 这段代码实际上阻塞了主线程,你在主队列上调度...... (7认同)
  • 尝试添加一个文本说明来描述代码的工作原理,而不是仅仅提供它以便其他人可以从中学习. (6认同)