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

这是所有应用程序的共同问题吗?

现在,我唯一能让它稍微好一点的方法是让 textField成为/辞去 viewDidAppear中的第一响应者,但这并不能完全解决问题-它只是在视图加载时加载延迟。如果在视图加载时立即单击 textField,仍然会出现问题; 如果在视图加载后等待3-4秒才触摸 textField,则不会出现延迟。

40951 次浏览

是的,最新的 iPhone4s 也延迟了几秒钟。别慌。由于某些原因,只有在 Debug 中第一次从 Xcode 加载应用程序时才会出现这种情况。当我释放,我没有得到延迟。算了吧..。

所以问题不仅仅局限于我之前认为的第一次安装,而是每次应用程序启动时都会发生。这是我的解决方案,可以彻底解决这个问题。

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

参见 这个答案。他们建议使用 UIResponder + 键盘缓存。它简单而且棒极了。在 iOS7上测试过。

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

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

在你实施任何奇特的技巧来解决这个问题之前,试试这个: 停止调试会话,关闭多任务应用程序,从计算机上拔掉你的设备,通过点击应用程序的图标正常运行应用程序。我已经看到至少两种情况下,延迟只发生在设备插入时。

你可以在 Swift 中使用 Vadoff 的解决方案,把它添加到 did FinishLaunchingWithOptions:

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

它在 iOS8中对我很有用。

你可以在 viewController 的视图加载时添加以下代码,比如 viewDidAppear:

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

这个 bug 似乎在 iOS9.2.1中得到了修复。自从升级我的设备,我不再有一个延迟之间的点击文本字段和键盘出现时,我的设备连接到我的计算机。

一个相关的问题,UIViewController 显示速度较慢,通过在 UITextField 中使用系统字体而不是自定义字体解决了这个问题。也许使用系统字体也可以解决这个问题?

这个选择的答案会导致 iOS11上的 BAD _ EXC 崩溃——从应用程序中删除来修复