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

답변:


291

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


2
이것은 iOS 8.1을 실행하는 iPhone 5에서 정답이었습니다. 첫 번째 키보드에서 약 1 초 지연되었습니다.
bejonbee

7
그러나 지연은 디버깅 할 때만 발생합니다. 기묘한.
Pauls

16
감사합니다. 이 문제는 여전히 iOS 9.1 / Xcode 7.1, Swift 2.1에 있습니다.
Yaroslav

4
FYVM Apple, FYVM. 마감 시간이 90 분이면 감당할 수 없습니다. 내가 할 수 있다면 20은 공감한다. 7.2 iOS9.2 / 엑스 코드에서 여전히 존재
BaseZen

1
이것은 내 문제이기도합니다. Mac에서 플러그를 뽑은 후에도 지연이 없었습니다 (ios9) xcode 7.2
Deprecated 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 예제의 인라인 버전입니다
amergin

4
이것은 운영 체제에 의해 처리 되었어야했지만 ... 잘 : /
chakrit

9
감사! 불행히도 문제는 여전히 ios8에 남아 있지만,이 해결 방법은 여전히 ​​문제를 해결합니다
hitme

1
@ Vadoff 솔루션은 작동하지만 2 분이 있습니다. 2) 메모리 경고가 수신되었습니다 (항상 그런 것은 아님). viewDidLoad의 UIViewController 에이 코드를 추가하려고했지만 아무런 효과가 없었습니다. 아마 뭔가 잘못 되었습니까? 가능한 경우 답변을 편집하고 View Controller에 대한 코드를 추가 할 수 있습니까?
Dima Deplov

16
이것이 정답이며 효과가 있다는 사실로 인해 울었습니다. 이 핵을 적용한 후에 샤워를해야했습니다.
Bill Burgess

27

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


6
최적화 수준 때문입니다 : Fastest, Smallest [-Os]. 당신은 그것을 변경할 수 있습니다Build Settings > Optimization Level
Carlos Ricardo

20

3
고맙게도, 많은 링크는 지연이 "오래된 iPhone에서 1 초", "3g에서 눈에 띄지 않음"및 "새로운 장치에서 즉시로드 됨"에 대해 언급하지만 훨씬 더 긴 지연 시간은 3-4입니다. 아이폰 4 초. 다음에 키보드를 미리로드하려고 시도하지만 다른 문제가있을 수 있습니다 (아마도 ios5 또는 xcode ver?).
Vadoff

네이티브 앱에서 UITextField 및 키보드의 동작을 시도 했습니까? 이 테스트를 수행하기 전에 메모리에서 메모리를 제거하십시오 (홈 버튼을 두 번 클릭하십시오 ...). 게시 한 코드에 아무런 문제가 없으며 3-4 초가 실제로 많이 보입니다. 나는이 사전 로딩을 시도하지 않았지만 유일한 해결 방법처럼 보입니다.
Rok Jarc

예,지도 검색 텍스트 필드는 실행 후 클릭하면 즉시 키보드를 표시합니다. 나는 그것을 메모리에서 제거하고 몇 번 시도했다. 매번 순간이다. 왜 내 것이 너무 느린 지 잘 모르겠습니다.
Vadoff

UITextField를 사용하는 내 앱 중 하나에서 테스트를 수행했습니다. 지연은 실제로 최소화되어야합니다. 게시 한 코드가 괜찮아 보이므로 주 스레드를 방해하는 다른 것이 있어야합니다. 악명 높은 악기를 시작하기에 좋은시기입니다.
Rok Jarc 10

23
좋아,이 문제가있는 다른 사람에게는. xcode에서 iPhone으로 앱을 처음 업데이트했을 때만 발생했습니다. 응용 프로그램이 iPhone에로드되면 응용 프로그램에서 더 이상 사용하면 정상적인 동작이 발생합니다 (프로그램을 메모리에서 몇 번 제거하거나 iPhone을 다시 시작하여 확인하십시오).
Vadoff

18

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


5

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

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

6
코드가 작동하는 이유를 설명하는 텍스트 설명을 추가하고 다른 사람들이 코드를 배울 수 있도록 코드를 제공하지 마십시오.
Sled

7
이 코드는 실제로 메인 스레드를 차단합니다. 메인 큐에서 디스패치 중입니다.
Werner Altewischer

dispatch_async / dispatch_sync의 차이점을 알고 있습니까? [textField가 FirstResponder]가된다고 생각하십니까? 메인 스레드에 매우 어려운가요?
Sergey Petruk

@Spetruk dispatch_async를 호출하는 스레드는 차단되지 않지만 실제로 코드를 실행하는 스레드는 확실히 차단됩니다. 단일 스레드는 한 번에 두 가지 작업을 수행 할 수 없으므로이 코드는 dispatch_get_main_queue로 인해 주 스레드를 차단하지만 dispatch_async가 호출되는 스레드는 차단하지 않습니다.
Kevin

@ Kevin이지만 메인 스레드를 차단하고 키보드 애니메이션이 작동하지 않습니다. 나는 당신에게 동의하지만 appDelegate의 textFiled가있는 솔루션은 나쁘게 냄새가납니다.
Sergey Petruk


1

UIViewController가 느리게 나타나는 관련 문제는 UITextField에서 사용자 정의 글꼴 대신 시스템 글꼴을 사용하여 해결되었습니다. 아마도 시스템 글꼴을 사용하여이 문제를 해결할 수도 있습니까?


0

이 버그는 iOS 9.2.1에서 수정 된 것으로 보입니다. 장치를 업그레이드 한 후 더 이상 텍스트 필드를 누르는 것과 장치가 컴퓨터에 연결되어있을 때 나타나는 키보드 사이의 지연이 없습니다.


1
그것은 iPhone에서 수정 된 것처럼 보이지만 여전히 iPad에서 지연이 있습니다.
Adarkas2302

0

이 선택 답변은 iOS 11에서 BAD_EXC 충돌을 일으킴-앱에서 제거하여 수정


-2

viewController의 뷰가로드 될 때 viewDidAppear와 같이 아래 코드를 추가 할 수 있습니다. application : didFinishLaunchingWithOptions :

UITextField *lagFreeField = [[UITextField alloc] init];
[self.window addSubview:lagFreeField];
[lagFreeField becomeFirstResponder];
[lagFreeField resignFirstResponder];
[lagFreeField removeFromSuperview];
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.