web-dev-qa-db-ja.com

キーボードのフレームを動的に取得します

キーボードのフレーム、実際にはその高さを動的に取得することは可能ですか? UITextViewがあるので、キーボードの入力方法が変更されたときに、キーボードフレームの高さに応じてその高さを調整したいと思います。ご存知のように、入力方法によってキーボードフレームの高さが異なる場合があります。

33
lu yuan

これを試して:

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(keyboardWasShown:)
                                         name:UIKeyboardDidShowNotification
                                       object:nil];

- (void)keyboardWasShown:(NSNotification *)notification
{

// Get the size of the keyboard.
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

//Given size may not account for screen rotation
int height = MIN(keyboardSize.height,keyboardSize.width);
int width = MAX(keyboardSize.height,keyboardSize.width);

//your other code here..........
}

詳細はチュートリアル

102
Hector

Appleからこのチュートリアルに従うだけで、必要なものが得られます。 Appleドキュメント 。キーボードでカバーされている場合は、これを参照してください tutorial

7
TeaCupApp

Swift 3ユーザーの場合、@ Hectorコード(いくつかの追加を含む)は次のようになります。

viewDidLoadにオブザーバーを追加します:

NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidShow(_:)), name: .UIKeyboardDidShow , object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardDidHide(_:)), name: .UIKeyboardDidHide , object: nil)

次に、これらのメソッドを実装します。

func keyboardDidShow(_ notification: NSNotification) {
     print("Keyboard will show!")
     // print(notification.userInfo)

     let keyboardSize:CGSize = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue.size
     print("Keyboard size: \(keyboardSize)")  

     let height = min(keyboardSize.height, keyboardSize.width)
     let width = max(keyboardSize.height, keyboardSize.width)

}

func keyboardDidHide(_ notification: NSNotification) {
        print("Keyboard will hide!")
}
2
Domenico

Swift 3.のテキストフィールドを含むビューにこのコードを追加できます。これにより、キーボードでテキストフィールドが上下にアニメーション化されます。

private var keyboardIsVisible = false
private var keyboardHeight: CGFloat = 0.0

// MARK: Notifications

private func registerForKeyboardNotifications() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillBeHidden(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}
private func deregisterFromKeyboardNotifications() {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
}

// MARK: Triggered Functions

@objc private func keyboardWillShow(notification: NSNotification) {
    keyboardIsVisible = true
    guard let userInfo = notification.userInfo else {
        return
    }
    if let keyboardHeight = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.height {
        self.keyboardHeight = keyboardHeight
    }
    if !textField.isHidden {
        if let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber,
            let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber {
            animateHUDWith(duration: duration.doubleValue,
                           curve: UIViewAnimationCurve(rawValue: curve.intValue) ?? UIViewAnimationCurve.easeInOut,
                           toLocation: calculateTextFieldCenter())
        }
    }
}

@objc private func keyboardWillBeHidden(notification: NSNotification) {
    keyboardIsVisible = false
    if !self.isHidden {
        guard let userInfo = notification.userInfo else {
            return
        }
        if let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber,
            let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber {
            animateHUDWith(duration: duration.doubleValue,
                           curve: UIViewAnimationCurve(rawValue: curve.intValue) ?? UIViewAnimationCurve.easeInOut,
                           toLocation: calculateTextFieldCenter())
        }
    }
}

// MARK: - Helpers

private func animateHUDWith(duration: Double, curve: UIViewAnimationCurve, toLocation location: CGPoint) {
    UIView.beginAnimations(nil, context: nil)
    UIView.setAnimationDuration(TimeInterval(duration))
    UIView.setAnimationCurve(curve)
    textField.center = location
    UIView.commitAnimations()
}

private func calculateTextFieldCenter() -> CGPoint {
    if !keyboardIsVisible {
        return self.center
    } else {
        let yLocation = (self.view.frame.height - keyboardHeight) / 2
        return CGPoint(x: self.center.x, y: yLocation)
    }
}
0
MendyK