首页 文章

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

提问于
浏览
168

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

触摸 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

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

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

11 回答

  • 27

    您可以通过将此添加到didFinishLaunchingWithOptions中来使用Vadoff的Swift解决方案:

    // 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中适用于我 .

  • 17

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

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

    this answer . 他们建议UIResponder+KeyboardCache . 它简单而且棒极了 . 在iOS 7上测试过 .

  • 0

    通过在UITextField上使用系统字体而不是自定义字体来解决UIViewController很难呈现的相关问题 . 也许使用系统字体也可能适用于此问题?

  • 280

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

  • 0

    此选定答案会导致iOS 11上的BAD_EXC崩溃 - 从应用中移除以进行修复

  • 20

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

  • 4

    所以问题不仅限于我之前想到的第一次安装,而是每次启动应用程序时都会发生 . 这是我完全解决问题的解决方案 .

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

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

  • 148

    您可以在viewController的视图加载时添加以下代码,例如viewDidAppear.Not只是application:didFinishLaunchingWithOptions:

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

相关问题