[objective-c] UITextField의 초기 키보드 애니메이션에서 슈퍼 느린 지연 / 지연

알았어,이 문제는 날 미치게 만들었 어

내를 터치 한 후 키보드가 나타나는 데 약 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뷰가로드 될 때 즉시 클릭하면 여전히 문제가 발생합니다. textField를 터치하기 전에보기가로드 된 후 3-4 초를 기다리면 지연이 발생하지 않습니다.



답변

이 문제를 해결하기 위해 이국적인 해킹을 구현하기 전에 다음을 시도하십시오. 디버그 세션을 중지하고, 멀티 태스킹에서 앱을 닫고, 컴퓨터에서 장치의 플러그를 뽑은 후 아이콘을 눌러 정상적으로 앱을 실행하십시오. 장치가 연결되어있는 동안에 만 지연이 발생하는 두 가지 경우를 보았습니다.


답변

따라서 문제는 이전에 생각했던 첫 번째 설치에만 국한된 것이 아니라 앱을 시작할 때마다 발생합니다. 이 문제를 완전히 해결하는 솔루션이 있습니다.

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


답변

네, 최신 아이폰 4s도 몇 초 지연되었습니다. 당황하지 마십시오. 어떤 이유로, 앱이 Xcode에서 처음으로 디버그로로드 될 때만 발생합니다. 릴리스했을 때 지연이 발생하지 않습니다. 그냥 잊어 버리세요 …


답변

이것은 알려진 문제입니다.

사전로드 키보드가 유망한 것 같습니다. UIKeyboard 사전로드를 확인하십시오 .

추가 독서 자료 :

UITextField의 초기 iPhone 가상 키보드 표시 속도가 느립니다. 이 해킹이 필요합니까?

로드하는 동안 UITextField 키보드 블록 실행 루프?

http://www.iphonedevsdk.com/forum/iphone-sdk-development/12114-uitextfield-loooong-delay-when-first-tapped.html


답변

didFinishLaunchingWithOptions에 다음을 추가하여 Swift에서 Vadoff의 솔루션을 사용할 수 있습니다.

// 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에서 나를 위해 일하고 있습니다.


답변

기본 대기열에 추가 된 블록의 코드가 비동기 적으로 실행됩니다. (주실을 잠그지 마십시오)

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


답변

이 답변을 참조하십시오 . UIResponder + KeyboardCache 제안 합니다. 간단하고 굉장합니다. iOS 7에서 테스트되었습니다.