2014-09-30 3 views
8

iOS8로 전환 한 후 키보드 전환 중에보기를 움직이면 이상한 동작이 나타납니다. 아무도 무슨 일이 일어나고 있는지 설명 할 수 있습니까?iOS8 : 키보드 전환 도중 이동하는보기가 어떻게됩니까?

다음은이 문제를 보여주는 최소 예입니다. UITextFieldUIButton의 간단한보기가 있습니다. nudgeUp 함수는 텍스트 필드와 버튼을 10 포인트 위로 이동합니다. buttonPressed 콜백 또는 keyboardWillShow 콜백에 의해 트리거됩니다.

단추를 누르면 코드가 예상대로 작동합니다. buttonPressednudgeUp이고 단추와 텍스트 필드는 10 포인트 씩 위로 이동합니다.

텍스트 필드를 탭하면 keyboardWillShownudgeUp을 호출하지만 동작은 매우 다릅니다. 버튼과 텍스트 필드는 즉시 을 점프하여을 10 포인트 올린 다음 키보드가 표시 될 때 원래 위치로 다시 슬라이드합니다.

왜 이런 일이 발생합니까? iOS8에서 키보드 프레젠테이션 중에 애니메이션을 다시 제어하려면 어떻게해야합니까?

#import "ViewController.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 

} 

- (void)keyboardWillShow:(NSNotification *)notification 
{ 
    // Called when the keyboard appears. 
    [self nudgeUp]; 
} 

- (IBAction)buttonPressed:(id)sender { 
    [self nudgeUp]; 
} 

- (void)nudgeUp 
{ 
    CGRect newTextFieldFrame = self.textField.frame; 
    newTextFieldFrame.origin.y -= 10; 
    self.textField.frame = newTextFieldFrame; 

    CGRect newButtonFrame = self.button.frame; 
    newButtonFrame.origin.y -= 10; 
    self.button.frame = newButtonFrame; 
} 
@end 
+0

나는이 질문을 발견 : 예

. (에서와 같이 addObserver 호출에서 참조 된 선택기 내의 중단 점은 절대 적중되지 않습니다!). 통지가 실제로 귀하에게 게시되었는지 확인 했습니까? iOS 8 및 자동 레이아웃이 방해가 될 수 있음에도 불구하고 내 앱은 자동 레이아웃으로 구축되지 않았기 때문에 충분히 유용합니다. – tobinjim

+0

업데이트 : AutoLayout 체크 박스와 상관없이 텍스트 필드가 포함 된 새 단일 창 응용 프로그램 및 공지 게시물을 만들었습니다 ... hmm) – tobinjim

+0

죄송합니다. 도움을받을 수 없습니다. 알림은 내 코드에 확실히 게시됩니다. – Pitarou

답변

8

자동 레이아웃입니다. iOS8에서 뭔가 바뀌었고 AutoLayout이 활성화 된 경우 프레임 또는 중심점을 더 이상 변경할 수 없습니다. 제약 조건 (수직 공간)의 콘센트를 만들고 프레임 위치를 변경하는 대신 그에 따라 업데이트해야합니다. 구속 조건은 다른 UI 컨트롤과 비슷하며 콘센트가있을 수 있습니다. 구속 조건 변경은 애니메이션으로 표현할 수 있습니다. 나는 UIKeyboardWillShowNotification도 게시되고 있지 않습니다 것을보고 있어요 때문에

[UIView animateWithDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue] delay:0 options:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue] animations:^{   
    self.bottomSpaceConstraint.constant = adjustmentedValue; 
    [self.view layoutIfNeeded];   
} completion:^(BOOL finished) { 
}]; 
+0

귀하의 통찰력있는 답변에 많은 감사드립니다. 나는이 질문에 200 포인트 현상금을 썼다. 나는 당신에게 그것을 줄 수 있었으면 좋겠지 만, 현상금에 이미 답변 한 시점까지는 이미 만료되었다. – Pitarou

+0

이것은 정말로 까다 롭습니다. 나는이 문제에 대해 며칠을 보냈다. –

0

당신은 (당신은 will 버전을 사용하는) 모든 것이 예상대로 작동합니다 UIKeyboardDidShowNotification 사용해야합니다

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardDidShow:) 
               name:UIKeyboardDidShowNotification 
               object:nil]; 

} 

- (void)keyboardDidShow:(NSNotification *)notification 
{ 
    // Called when the keyboard finished showing up 
    [self nudgeUp]; 
} 

설명은 UIKeyboardWillShowNotification 당신이 너무 일찍 프레임을 변경하는 것입니다. 변경 후 시스템은 키보드를 수용하기 위해 모든 것을 다시 레이아웃하므로 변경 사항이 적용되지 않습니다.

또한 autolayout으로 전환하고 프레임을 잊어 버리는 것이 좋습니다.

+0

당신의 솔루션은 당신의 말대로합니다. 그러나 키보드가 나타나면 * 애니메이션이 나타나기를 원하지 않습니다. 나는 내가 보는 행동이 어떻게 "키보드를 수용하기위한 중계"로 설명 될 수 있는지 이해하지 못한다. 그리고 왜 내 코드가 iOS7에서 작동하지만 iOS8에서는 작동하지 않는지 이해할 수 없습니다. – Pitarou

0

UIKeyboardWillShowNotification userInfo를 사용하여 키보드의 프레임을 사용해보십시오. 그런 다음 화면상의 요소를 이동합니다.

+0

그게 내가 계속 해왔고, iOS7에서 잘 작동한다.그러나 iOS8에서는 위의 예제 코드와 같은 방식으로 동작합니다. 즉, 프레임은 내가 말한 방식에서 반대 방향으로 점프 한 다음 원래 위치로 다시 슬라이드합니다. – Pitarou

관련 문제