blog

プログラミングとひとりごと。

キーボードで入力欄が隠れないように対応[Swift4](2018/3/29追記)

昨日、アプリ1つ、できた!!と思ったが

iPhone SEとかの画面ではキーボードが表示されると

画面の一部が隠れてしまい

ボタンが見えなくなったり

別のテキストビューが見えなくなったりするので

修正が必要だということに気付いた。

 

キーボード以外のところを

クリックしたらキーボードを非表示にする、というのは

割と簡単にできた。

 

 

programming-beginner-memo.com

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

 

 

あとは

テキストビューにキーボードが重なって見えなくなるのを

直さないといけない。

 

のだけど

その方法を探し中。

キーボードの上までテキストビューを移動させる方法は載ってたけど

そのまま使うと、大きい画面の時も移動してしまうし

元の位置に戻せなかった。

 

別の方法もあるみたいなので

試してみようと思う。

 

 

ーーーーーー

 

あれこれやってみたけど

資料が古いのかなかなかうまくいかない。

 

結局、これが一番まともに動くので、

元の位置に戻すことができるようになれば

使えると思う。

 

hajihaji-lemon.com

 

 

 Swift2.1の情報なのでそのままでは使えない。

とりあえずキーボードに閉じるボタンはつけないで

テキストビューを移動させて元に戻す、という処理だけ使うことにする。

 

ここも参考に

yanamura.hatenablog.com

 

 

joyplot.com

 

これも参考にしながら書き直している。

できたらソースコードを載せる予定。

今、逆方向に動いてる。(テキストビューとキーボードがさらに重なるw)

 

joyplot.com

 

できた!!! (object-cのような気がするのは気にしない方向で)

 

import UIKit

 

class YNFirstViewController: UIViewController, UITextViewDelegate {

    

    @IBOutlet weak var ynTextView: CustomTextView!

    

    @IBOutlet weak var textConstraintsY: NSLayoutConstraint!

    

    var allY:CGFloat = 0.0

    

    override func viewDidLoad() {

        super.viewDidLoad()

        

        //テキストビューのデリゲート先にこのインスタンスを設定する。

        ynTextView.delegate = self

        

        //キーボードが現れるときに通知するメソッドを登録する。

        // NotificationCenterの設定

        // 第3引数 name に NSNotification.Name.UIKeyboardDidShow を設定することで、キーボード出現後に通知を行うメソッドを設定できる。

        NotificationCenter.default.addObserver(

        self,

        selector: #selector(self.showKeyboard(notification:)),

        name: NSNotification.Name.UIKeyboardDidShow,

        object: nil

        )

        

        NotificationCenter.default.addObserver(

            self,

            selector: #selector(self.hideKeyboard(notification:)),

            name: NSNotification.Name.UIKeyboardDidHide,

            object: nil

        )

    }

    

    // キーボードの情報を受け取るメソッドを設定

    // キーボード出現後に、第2引数として登録した以下のメソッド showKeyboard(notification:) が呼び出される

    // このとき、このメソッドの引数 notification の userInfo にキーボードに関する情報が含まれています。

    @objc func showKeyboard(notification: Notification) {

 

        //キーボードのフレームを取得する。

        if let keyboardFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue {

            

            //テキストビューの最大Y座標と、キーボードの最小Y座標の差を計算する。

            let zureY = (ynTextView.frame).maxY - (keyboardFrame).minY

            

            if (zureY > 0) {

                //テキストビューの垂直方向の位置の制約に差分をプラスする。

                textConstraintsY.constant -= zureY

                allY -= zureY

                

                //アニメーションさせる。

                UIView.animate(withDuration: 0.5, animations:{ self.view.layoutIfNeeded()})

            }

        }

    }

 

 

    //キーボードが閉じられるときの呼び出しメソッド 

  @objc func hideKeyboard(notification: Notification) {

        //テキストビューの位置を元に戻す。        

        if(allY < 0) {

           textConstraintsY.constant -= allY

        

            UIView.animate(withDuration: 0.5, animations:{ self.view.layoutIfNeeded()})

        }

        allY = 0.0

    }

        

    // キーボード以外のところをタップしたらキーボードを非表示にする処理

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

        self.view.endEditing(true)

    }

}