2016-04-15 3 views
1

以前は自分のアプリにキーボードを提示した場合、UIScrollViewにすべてを埋め込み、contentInsetを調整してキーボードによるコンテンツの不明瞭さを防ぎます。iPad分割ビュー(iOS 9マルチタスキング)で別のアプリの不明瞭なキーボードを処理する

iOS 9のスプリットビューマルチタスクでは、キーボードはいつでも表示され、ユーザーが他のアプリと対話しなくても表示されます。

質問

キーボードが見えるとscrollviewsのすべてを埋め込む開始せずにあることを予想していなかったすべてのビューコントローラを適応させる簡単な方法はありますか?

+0

この質問に対する回答を見つけられましたか? – SAHM

+0

私のソリューションを追加しました。 – Rivera

答えて

0

秘密は、キーボードがあなたのアプリから見えたり、隠されているとき、またはあなたの側に並んで走っている別のアプリから誘発されたUIKeyboardWillChangeFrameの通知を聞くことです。

私はそれが簡単に(私はviewWillAppear/Disappearでそれらを呼び出す)これらのイベントを観測開始/停止、および簡単に通常あなたのテーブル/コレクション/ scrollviewの下contentInsetを調整するために使用されobscuredHeightを取得するために作るために、この拡張機能を作成しました。

@objc protocol KeyboardObserver 
{ 
    func startObservingKeyboard() // Call this in your controller's viewWillAppear 
    func stopObservingKeyboard() // Call this in your controller's viewWillDisappear 
    func keyboardObscuredHeight() -> CGFloat 
    @objc optional func adjustLayoutForKeyboardObscuredHeight(_ obscuredHeight: CGFloat, keyboardFrame: CGRect, keyboardWillAppearNotification: Notification) // Implement this in your controller and adjust your bottom inset accordingly 
} 

var _keyboardObscuredHeight:CGFloat = 0.0; 

extension UIViewController: KeyboardObserver 
{ 
    func startObservingKeyboard() 
    { 
     NotificationCenter.default.addObserver(self, selector: #selector(observeKeyboardWillChangeFrameNotification(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) 
    } 

    func stopObservingKeyboard() 
    { 
     NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil) 
    } 

    func observeKeyboardWillChangeFrameNotification(_ notification: Notification) 
    { 
     guard let window = self.view.window else { 
      return 
     } 

     let animationID = "\(self) adjustLayoutForKeyboardObscuredHeight" 
     UIView.beginAnimations(animationID, context: nil) 
     UIView.setAnimationCurve(UIViewAnimationCurve(rawValue: (notification.userInfo![UIKeyboardAnimationCurveUserInfoKey]! as AnyObject).intValue)!) 
     UIView.setAnimationDuration((notification.userInfo![UIKeyboardAnimationCurveUserInfoKey]! as AnyObject).doubleValue) 

     let keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue 
     _keyboardObscuredHeight = window.convert(keyboardFrame!, from: nil).intersection(window.bounds).size.height 
     let observer = self as KeyboardObserver 
     observer.adjustLayoutForKeyboardObscuredHeight!(_keyboardObscuredHeight, keyboardFrame: keyboardFrame!, keyboardWillAppearNotification: notification) 

     UIView.commitAnimations() 
    } 

    func keyboardObscuredHeight() -> CGFloat 
    { 
     return _keyboardObscuredHeight 
    } 
} 
関連する問題