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

时间:2012-02-20 06:26:15

标签: objective-c ios cocoa-touch keyboard uitextfield

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

触摸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,我就不会有延迟。

11 个答案:

答案 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)

答案 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];