2014-10-11 3 views
10

키보드의 새로운 QuickType 섹션을 고려합니다.UIKeyboardWillChangeFrame 알림 만 사용

그것은, 하나는 UIKeyboardWillChangeFrameNotification에 대한 알림을 사용할 수 있다는 사실이

단순히 "오래된"UIKeyboardWillShowNotification 및 UIKeyboardWillHideNotification "신경 쓰지"인가?

테스트가 완벽하게 작동하는 것으로 보입니다. keyboardFrameDidChange -하지만 뭔가 누락 될 수 있습니까?

은 BTW 여기 UIKeyboardWillChangeFrameNotification https://stackoverflow.com/a/26226732/294884

답변

33

그것은 확실히 가능하며 절반에 대한 코드를 줄일 수를 사용하는 방법의 예입니다. 다음 예제는 많은 양산을 위해 자동 레이아웃을 사용합니다.

NSNotificationCenter.defaultCenter().addObserverForName(
    UIKeyboardWillChangeFrameNotification, 
    object: nil, 
    queue: nil 
) { (notification) in 
    var userInfo = notification.userInfo! 

    let frameEnd = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue 
    let convertedFrameEnd = self.view.convertRect(frameEnd, fromView: nil) 
    let heightOffset = self.view.bounds.size.height - convertedFrameEnd.origin.y 
    self.messageFieldBottomConstraint.constant = heightOffset 

    let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey]!.unsignedIntValue 
    let options = UIViewAnimationOptions(rawValue: UInt(curve) << 16) 

    UIView.animateWithDuration(
     userInfo[UIKeyboardAnimationDurationUserInfoKey]!.doubleValue, 
     delay: 0, 
     options: options, 
     animations: { 
      self.view.layoutIfNeeded() 
     }, 
     completion: nil 
    ) 
} 

self.messageFieldBottomConstraint 내보기 하단에 내 텍스트 필드의 바닥을 결합하는 NSLayoutConstraint이다. 이 코드는 키보드가 나타나면 필드를 위로 움직이고 필드가 사라지면 아래로 움직입니다.

이 모두는 UIKeyboardWillShowNotificationUIKeyboardWillHideNotification의 조합을 사용하여 iOS < 8에서 가능했습니다. 그러나! 말하자면, iOS 8에는 사용자가 축소하거나 확장 할 수있는 QuickType 섹션이 있습니다. 이 솔루션은 QuickType이 열려 있는지 여부에 관계없이 텍스트 필드가 키보드 상단에 항상 부착되도록 텍스트 필드를 올바르게 애니메이션합니다.

+1

좋습니다. 건배 – Fattie

+0

스크롤 할 때 제어 할 수있는 방법이 있습니까? 아이폰 6에서는 사용자가 가장 많은 텍스트 필드를 편집 할 때 필드를 스크롤 할 필요가 없지만 하단 텍스트 필드를 편집 할 때 스크롤해야만 공간을 확보 할 수 있습니다. –

+0

'UIViewAnimationOptions (UInt (curve)) '의 사용법이 맞습니까? 문서는'curve'는'UIViewAnimationCurve'라고 정의하고 있으며 정의를 보면'UIViewAnimationOptions'의 값과 일치하지 않습니다. 더 좋게도,이 알림에서 실제로 반환되는'curve' 값은 private/undefined 값이므로 '7'입니다. 따라서 간단한 switch 문을 사용하면 전환하지 않아도됩니다. –