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


169

好吧,这个问题使我发疯。

触摸键盘后,弹出键盘大约需要3-4秒UITextField。自应用启动以来,这仅在键盘第一次弹出时发生,然后动画立即开始。

起初我以为是加载太多图像或我的问题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

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

现在,我可以做得更好的唯一方法是textField成为/指派第一响应者viewDidAppear,但这并不能完全解决问题-而是在加载视图时加载延迟。如果在textField加载视图时立即单击,仍然会出现问题;如果我在加载视图后等待3-4秒再触摸textField,则不会得到延迟。

Answers:


291

在实施任何外来入侵技术来解决此问题之前,请尝试以下操作:停止调试会话,关闭应用程序的多任务处理,从计算机上拔下设备的插头,然后通过点击其图标正常运行该应用程序。我至少在两种情况下发现延迟仅在插入设备时发生。


2
就我而言,在运行iOS 8.1的iPhone 5上,这是正确的答案-第一个键盘的延迟时间约为1秒。
bejonbee

7
是的,仅在调试时才会出现延迟。奇怪的。

16
谢谢。此问题在iOS 9.1 / Xcode 7.1,Swift 2.1上仍然存在。
Yaroslav

4
FYVM苹果公司,FYVM。我付不起90分钟的期限。如果可以的话,可以投票20次。仍存在于iOS9.2 / Xcode 7.2
BaseZen 2015年

1
这也正是我的问题。从Mac拔下电源后,没有延迟(ios9)xcode 7.2
弃用了Darren,

148

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

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

1
漂亮又简单的@Vadoff-这是下面给出的UIResponder + KeyboardCache示例的内联版本
2014年

4
这应该已经由OS处理了……但是好吧:/
chakrit 2014年

9
谢谢!不幸的是,问题仍然存在于ios8上,但是这种解决方法仍然可以解决问题
Hitme 2014年

1
@Vadoff解决方案有效,但有2个缺点:1)我的应用程序加载时间增加了大约1秒钟;2)收到内存警告(但并非始终如此)。我试图将此代码添加到viewDidLoad中的UIViewController中,但是没有任何效果,也许我做错了什么?如果可以的话,您可以编辑答案并为视图控制器添加代码吗?
Dima Deplov

16
这是正确答案且有效的事实使我哭泣。应用此技巧后,我不得不洗个澡。
比尔·伯吉斯

27

是的,最新的iPhone 4s也延迟了几秒钟。不要惊慌 由于某些原因,它仅在第一次在Debug中从Xcode加载应用程序时发生。当我完成发布时,我不会延迟。把它忘了吧...


6
这是由于优化级别:Fastest, Smallest [-Os]。您可以在以下日期进行更改Build Settings > Optimization Level
卡洛斯·里卡多

20

3
谢谢,许多链接提到延迟大约是“旧款iPhone上为1秒”,“在3g上不太明显”和“立即在新设备上加载”,但我遇到了3-4个更长的延迟iPhone 4s上的秒数。接下来,我将尝试预加载键盘,但是我担心还有其他问题(也许是ios5或xcode ver?)。
瓦多夫

您是否尝试过UITextField和键盘在本机应用程序中的行为?在进行此测试之前,请确保将其从内存中删除(双击“主页”按钮...)。您发布的代码没有错,而且3-4秒似乎确实很多-太多了。我从未尝试过这种预加载,但它似乎是唯一的解决方法。
Rok Jarc 2012年

是的,启动后单击“搜索地图字段”会立即弹出键盘。我将其从内存中删除并尝试了几次,每次都可以立即进行。我不知道为什么我的这么慢。
瓦多夫

刚刚对我的一个使用UITextField的应用程序进行了测试-滞后应该确实很小。您发布的代码看起来不错,因此必须有其他阻止主线程的功能。这可能是启动臭名昭著的乐器的好时机。
Rok Jarc 2012年

23
好的,对于其他似乎有此问题的人。我发现这只发生在第一次从xcode在iPhone上更新应用程序的情况下。一旦将应用程序加载到iphone上,对该应用程序的任何进一步使用将导致正常行为(我从内存中删除了几次该程序/重新启动iphone以确保)。
Vadoff

18

您可以在Swift中使用Vadoff的解决方案,方法是将其添加到didFinishLaunchingWithOptions中:

// 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中对我有效。


5

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

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

6
尝试添加文字说明,以说明您的代码为什么起作用,而不仅仅是给出代码,以便其他人可以从中学习。
雪橇2014年

7
该代码实际上确实阻塞了主线程,您正在主队列上分派...
Werner Altewischer 2015年

你知道dispatch_async / dispatch_sync之间的区别吗?您认为[textField成为FirstResponder];主线程很难吗?
谢尔盖·佩特鲁克

@Spetruk调用dispatch_async的线程没有被阻止,但是您实际在其上运行代码的线程肯定被阻止。一个线程无法同时执行两项操作,因此此代码会阻塞主线程(由于dispatch_get_main_queue),但不会阻塞调用dispatch_async的线程。
凯文

@Kevin,但是某些东西阻塞了主线程,因此键盘动画无法正常工作。我同意你的看法,但是我认为appDelegate中的textFiled解决方案很难闻。
谢尔盖·佩特鲁克


1

通过使用系统字体而不是UITextField上的自定义字体,解决了UIViewController呈现较慢的一个相关问题。也许使用系统字体也​​可以解决此问题?


0

此错误似乎已在iOS 9.2.1中修复。自升级设备以来,在设备连接到计算机时,点击文本字段和出现键盘之间不再存在延迟。


1
它似乎固定在iPhone上,但我在iPad上仍然落后。
Adarkas2302'9

0

选择的答案导致BAD_EXC在iOS 11上崩溃-从应用中删除以修复


-2

您可以在加载viewController的视图时添加以下代码,例如viewDidAppear。不仅仅是application:didFinishLaunchingWithOptions:

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.