好吧,这个问题让我疯了。
触摸UITextField
后,键盘弹出约需3-4秒。这仅在应用程序启动后第一次弹出键盘时发生,之后动画立即开始。
起初我认为这是加载太多图片或我的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,我就不会有延迟。
答案 0 :(得分:281)
在实施任何异国黑客以解决此问题之前,请尝试以下操作:停止调试会话,从多任务关闭应用程序,从计算机上拔下您的设备并通过点击其图标正常运行应用程序。我已经看到至少两种情况,只有在设备插入时才会发生延迟。
答案 1 :(得分: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];
}
答案 2 :(得分:27)
是的,我在最新的iPhone 4s上也有几秒钟的延迟。不要惊慌。出于某些原因,它只在第一次从Debug中的Xcode加载应用程序时发生。当我发布时,我没有得到延迟。别忘了......
答案 3 :(得分:20)
这是一个已知问题。
预装键盘似乎很有希望。查看Preloading the UIKeyboard.
一些额外的阅读材料:
Initial iPhone virtual keyboard display is slow for a UITextField. Is this hack around required?
答案 4 :(得分: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()
它适用于iOS 8。
答案 5 :(得分:6)
块中的代码添加到主队列并异步运行。 (不要锁定主线)
dispatch_async(dispatch_get_main_queue(), ^(void){
[textField becomeFirstResponder];
});
答案 6 :(得分:4)
见this answer。他们建议UIResponder+KeyboardCache。它简单而且棒极了。在iOS 7上测试。
答案 7 :(得分:1)
通过在UITextField上使用系统字体而不是自定义字体来解决UIViewController出现缓慢的相关问题。也许使用系统字体也可能适用于这个问题?
答案 8 :(得分:0)
此错误似乎在iOS 9.2.1中得到修复。自从升级我的设备后,在我的设备连接到计算机时,点击文本字段和键盘之间不再有延迟。
答案 9 :(得分:0)
此选定答案会导致iOS 11上的BAD_EXC崩溃 - 从应用中移除以修复
答案 10 :(得分:-2)
您可以在加载viewController视图时添加以下代码,例如viewDidAppear.Not只是application:didFinishLaunchingWithOptions:
UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];