2017-09-10 24 views
0

私は、ビューの下半分にテキストフィールドがあり、ナビゲーションコントローラのページの下部があります。swiftを使用してキーボードでビューを移動する3

入力中にビューを上に移動すると、キーボードが消えたときに入力した内容を確認して元の場所に戻すことができます。 ナビゲーションコントローラを移動したくありません

+0

可能性のある重複した[UITextFieldの移動を作る方法キーボードが存在するときに起動する?](https://stackoverflow.com/questions/1126726/how-to-make-a-uitextfield-move-up-when-keyboard-is-present) – Torongo

答えて

0

キーボードフレームの変更を観察し、キーボードの上にuiview(uitextfield、uitextviewなど)を表示する必要があります。

通知センターアップルのドキュメント:StackOverflowので https://developer.apple.com/documentation/foundation/notificationcenter

その他の回答:ここで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() 
    } 

} 
関連する問題