iOS-如何预加载键盘



问题

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

大多数人似乎对此没有意见。我不是,这真的让我很困扰——而且我的应用程序的呈现方式,用户会非常困惑,当他们第一次点击文本字段时,几秒钟内什么都没发生。


我尝试过的

在谷歌上搜索它会发现一个解决方案——不幸的是,这在iOS 4中是无效的(请参阅此处)。

我不希望解决方案很容易找到,如果我能马上悬赏,我会的。如果有人想出一个解决办法,我会非常激动的。所有解决方案需要做的就是在用户不知情的情况下加载键盘。


所以

欢迎提出任何想法。完整的工作代码(适用于iOS 4和5)是值得奖励的(即使奖励必须稍后到来!)。

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

UIResponder+KeyboardCache就是为了解决这个问题而编写的。

来自该项目的自述:

UIResponder上的这个类别为您提供了一个简单的方法+cacheKeyboard,这样您就可以控制何时完成缓存工作。例如,如果您正在从服务器加载一些数据,那么您可以在停机期间调用它。还有另一种方法+cacheKeyboard:采用可选的BOOL值。向该方法传递YES会导致在下一个运行循环中进行缓存调用。因此,如果在调用此方法之前执行动画,则不会中断该动画。

将文本字段设置为第一个响应程序,然后在视图中放弃它。。当键盘再次加载时,这似乎没有延迟。。。

- (void)viewDidLoad
{
    [super viewDidLoad];
    [textField becomeFirstResponder];
    [textField resignFirstResponder];
        // Do any additional setup after loading the view, typically from a nib.
}

以下是我所做的:

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

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

有一次用户抱怨我的应用程序加载键盘太慢。这里有一个禁用键盘动画的小技巧:

- (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中,缓存对我来说不是一个选项。尽管如此,整体响应能力还是有所提高。

最新更新