我有一个应用程序,在视图的下半部分有一个文本字段,我有一个导航控制器页面底部 .
如何在打字时向上移动视图以便我可以看到我正在键入的内容,然后在键盘消失时将其移回原来的位置?我不想移动导航控制器
您必须观察键盘框架中的更改并相应地操作以在键盘上方显示您的uiview(uitextfield,uitextview等) .
NotificationCenter Apple文档:https://developer.apple.com/documentation/foundation/notificationcenter
在StackOverflow的其他答案:How to make a UITextField move up when keyboard is present?
以下是视图控制器的快速示例:
import UIKit class ExampleViewController: UIViewController { // MARK: - Properties @IBOutlet weak var exampleTextView1: UITextView! @IBOutlet weak var exampleTextView2: UITextView! @IBOutlet weak var exampleTextView1BottomConstraint: NSLayoutConstraint! @IBOutlet weak var exampleTextView2BottomConstraint: NSLayoutConstraint! var exampleTextView1BottomConstraintInitialConstant: CGFloat! var exampleTextView2BottomConstraintInitialConstant: CGFloat! var keyboardVisibilityObservers: [NSObjectProtocol] = [] // MARK: - View lifecycle override func viewDidLoad() { super.viewDidLoad() exampleTextView1BottomConstraintInitialConstant = exampleTextView1BottomConstraint.constant exampleTextView2BottomConstraintInitialConstant = exampleTextView2BottomConstraint.constant } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // Add observers for text view 1 keyboardVisibilityObservers.append(createShowKeyboardObserver(keyboardTrigger: exampleTextView1, distance: 10.0, constraint: exampleTextView1BottomConstraint)) keyboardVisibilityObservers.append(createHideKeyboardObserver(keyboardTrigger: exampleTextView1, constraint: exampleTextView1BottomConstraint, initialConstraintConstant: exampleTextView1BottomConstraintInitialConstant)) // Add observers for text view 2 keyboardVisibilityObservers.append(createShowKeyboardObserver(keyboardTrigger: exampleTextView2, distance: 10.0, constraint: exampleTextView2BottomConstraint)) keyboardVisibilityObservers.append(createHideKeyboardObserver(keyboardTrigger: exampleTextView2, constraint: exampleTextView2BottomConstraint, initialConstraintConstant: exampleTextView2BottomConstraintInitialConstant)) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) removeAllKeyboardVisibilityNotificationObservers() } // MARK: - Keyboard event handling private func createShowKeyboardObserver(keyboardTrigger: UIView, distance: CGFloat, constraint: NSLayoutConstraint) -> NSObjectProtocol { return NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil) { (notification) in if let userInfo = notification.userInfo, let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { // Get animation duration and curve from user info dictionary let duration: TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue let animationCurve: UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) let originYAxisOfKeyboardTrigger = keyboardTrigger.convert(keyboardTrigger.bounds.origin, to: self.view).y let preferredOriginYAxisOfKeyboardTrigger = endFrame.origin.y - distance - keyboardTrigger.bounds.height constraint.constant = constraint.constant - (originYAxisOfKeyboardTrigger - preferredOriginYAxisOfKeyboardTrigger) // Animate changes UIView.animate(withDuration: duration, delay: TimeInterval(0), options: animationCurve, animations: { self.view.layoutIfNeeded() }, completion: nil) } } } private func createHideKeyboardObserver(keyboardTrigger: UIView, constraint: NSLayoutConstraint, initialConstraintConstant: CGFloat) -> NSObjectProtocol { return NotificationCenter.default.addObserver(forName: .UIKeyboardWillHide, object: nil, queue: nil) { (notification) in if let userInfo = notification.userInfo { // Get animation duration and curve from user info dictionary let duration: TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0 let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue let animationCurve: UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) constraint.constant = initialConstraintConstant // Animate changes UIView.animate(withDuration: duration, delay: TimeInterval(0), options: animationCurve, animations: { self.view.layoutIfNeeded() }, completion: nil) } } } private func removeAllKeyboardVisibilityNotificationObservers() { keyboardVisibilityObservers.forEach { (observer) in NotificationCenter.default.removeObserver(observer) } keyboardVisibilityObservers.removeAll() } }
1 回答
您必须观察键盘框架中的更改并相应地操作以在键盘上方显示您的uiview(uitextfield,uitextview等) .
NotificationCenter Apple文档:https://developer.apple.com/documentation/foundation/notificationcenter
在StackOverflow的其他答案:How to make a UITextField move up when keyboard is present?
以下是视图控制器的快速示例: