【问题标题】:iOS - How can I preload the keyboard?iOS - 如何预加载键盘?
【发布时间】:2012-02-24 20:47:37
【问题描述】:

问题

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

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


我的尝试

谷歌搜索它带来了一种解决方案 - 不幸的是,这在 iOS 4 (see here) 中无效。

我不认为解决方案很容易找到,如果我可以立即为此提供赏金,我会的。如果有人想出解决方案,我会非常激动。解决方案所需要做的就是在用户不知情的情况下加载键盘。


所以..

任何想法都值得赞赏。完整的、可工作的代码(适用于 iOS 4 和 5)值得赏金(即使赏金必须稍后提供!)。

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

【问题讨论】:

  • 我不能说我真的注意到任何延迟。这种延迟出现在手机上的所有应用程序中还是仅出现在您正在开发的应用程序中?如果它与所有其他应用程序中的延迟相同,那么您可能无能为力。如果仅在您的应用中,请向我们展示相关代码。
  • @sosborn [textField becomeFirstResponder]。我在其他一些应用程序中注意到了它,并且写上面链接的博客的人也注意到了它。也许它只发生在某些情况下 - 如果是这种情况,那么知道这些情况是什么就是答案。
  • 那么,您的应用在加载键盘时是否在执行其他操作?是否有任何 UI 元素正在更新?有很多事情可能会影响到这一点,甚至与您的应用无关的事情(后台进程等)
  • @sosborn 不,展示键盘是它唯一的作用。如果我有时间,我会创建一个有问题的迷你项目:)
  • 如何将文本字段设为 firstResponder,然后在 viewdidload 中将其退出。当再次加载键盘时,这似乎没有延迟...

标签: ios objective-c performance uikeyboard


【解决方案1】:

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

来自该项目的自述文件:

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

【讨论】:

  • 哇,它真的有效!如果在我的赏金还在时你在...谢谢!
【解决方案2】:

将文本字段设置为 firstResponder,然后在 viewdidload 中将其退出。当再次加载键盘时,这似乎没有延迟...

- (void)viewDidLoad
{
    [super viewDidLoad];

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

【讨论】:

  • 据我所知,这似乎有效。我没有意识到你的意思只是两行代码,在你发布之前尝试了一些更复杂的东西;)这有点难以测试,因为有时延迟不会出现在 iPhone 4 上,但在一天之后或者所以我没有经历过使用此代码的滞后。简直不敢相信答案这么简单!但是无论如何都会在几天内奖励赏金,因为我说过我会,假设没有发布更好的答案并且经过更多测试后它仍然有效:)
  • 致感兴趣的赏金猎人:这对我不起作用。它没有任何作用。我对不同的答案感兴趣!
  • 就像@Claudiu 所说,我不再相信这个答案有效。不确定这个答案是否一开始就奏效了,还是由于 iOS 的变化。
  • @Jordan 好吧,我现在也不确定,但在我给出这个答案的时候,它曾经可以工作。而且我发现只有当你第一次在调试模式下安装应用程序时才会出现这种情况,它不会在随后的运行中发生。
  • @Jordan 查看This Github Page 的 .m 文件,一般概念与上述相同。我可以 100% 说,将它放在我的介绍容器控制器的 viewDidLoad 中,让我的 iPad 应用程序键盘在以后的外观上快得多。
【解决方案3】:

这是我的工作:

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

【讨论】:

    【解决方案4】:

    一旦用户抱怨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 中,而缓存不是我的选择。尽管如此,整体响应能力得到了改善。

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 2015-06-11
      • 2023-04-04
      • 2017-01-01
      • 2015-08-09
      • 1970-01-01
      • 2013-09-07
      • 2019-05-03
      相关资源
      最近更新 更多