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