iOS - 如何预加载键盘?

时间:2012-02-02 06:49:38

标签: ios objective-c performance uikeyboard

问题

在大多数iPhone应用程序中,第一次出现键盘时会出现相当长的延迟(假设创建键盘需要相当多的功能,即使在iPhone 4上也是如此)。

大多数人对此都很满意。我不是,它真的让我感到烦恼 - 而且我的应用程序呈现方式,用户会非常困惑,当他们第一次点击文本字段时,几秒钟内没有任何事情发生。


我尝试过什么

谷歌搜索提出了一个解决方案 - 不幸的是,从iOS 4(see here)开始这是无效的。

我不认为这个解决方案很容易找到,如果我可以立即给予这个奖励,我会的。如果有人想出解决方案,我会非常激动。解决方案需要做的就是在用户不知情的情况下加载键盘。


所以..

任何想法都表示赞赏。完整的,有效的代码(适用于iOS 4和5)值得赏心悦目(即使赏金必须在以后出现!)。

如果找到解决方案,我计划创建一个自包含的“KeyboardPreloader”类,人们可以将其放入他们的项目中,并使用一行代码预加载键盘:)

4 个答案:

答案 0 :(得分:30)

编写

UIResponder+KeyboardCache是为了解决这个问题。

从该项目的自述文件:

  

UIResponder上的此类别为您提供了一个简单的方法+cacheKeyboard,以便您可以控制何时完成此缓存工作。例如,如果要从服务器加载某些数据,则可以在该停机期间调用此数据。另一种方法+cacheKeyboard:采用可选的BOOL值。将YES传递给此方法会导致高速缓存调用在 next runloop上发生。因此,如果您在调用此方法之前执行动画,则不会中断该动画。

答案 1 :(得分:12)

将textfield作为firstResponder,然后在viewdidload中将其重新签名..这似乎在没有延迟时再次加载键盘......

- (void)viewDidLoad
{
    [super viewDidLoad];

    [textField becomeFirstResponder];
    [textField resignFirstResponder];
        // Do any additional setup after loading the view, typically from a nib.
}

答案 2 :(得分:7)

这就是我的所作所为:

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

Super slow lag/delay on initial keyboard animation of UITextField

答案 3 :(得分:0)

一旦用户抱怨慢速加载键盘的my app。这是禁用键盘动画的一个小技巧:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // ...

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(willShowKeyboard:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(didShowKeyboard:)
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];

    // ...
}


- (void)willShowKeyboard:(NSNotification *)notification
{
    [UIView setAnimationsEnabled:NO];
}

- (void)didShowKeyboard:(NSNotification *)notification
{
    [UIView setAnimationsEnabled:YES];
}

它可能无法直接回答问题,因为键盘本身位于我的示例的主UI中,而缓存不是我的选择。然而,整体响应能力得到改善。