初心者
swift3

【Swift】キーボードが出てもスクロールさせてフォーム入力ができる方法

UIScrollViewのサイズについて

UIScrollViewには2つのサイズがあります.

  • UIScrollViewの枠のサイズ(frame)
  • UIScrollViewの枠に表示される中身のサイズ(contentSize)

実装方法

UIScrollViewの枠のサイズをキーボードのサイズ分引いて、小さくなったUIScrollViewの枠のサイズに中身を表示する.
hoge.jpg

@IBOutlet weak var scrollView: UIScrollView!

    var scrollViewHeight : CGFloat = 0

    var keyboard = CGRect()

    override func viewDidLoad() {
        super.viewDidLoad()

        // scrollview枠のサイズ
        scrollView.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
        // scrollview中身のサイズ
        scrollView.contentSize.height = self.view.frame.height

        // 初期状態の高さを保存-!
        scrollViewHeight = scrollView.frame.size.height

        // キーボードが動いた時にnotificationCenterに知らせる宣言
        let notificationCenter = NotificationCenter.default

        notificationCenter.addObserver(self, selector: #selector(showKeyboard), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

        notificationCenter.addObserver(self, selector: #selector(hideKeyboard), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

        //tapされた時の動作を宣言する
        let hideTap : UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKyeoboardTap))
        hideTap.numberOfTapsRequired = 1
        self.view.isUserInteractionEnabled = true
        self.view.addGestureRecognizer(hideTap)

    }

    // キーボード以外をタップするとキーボードが下がるメソッド
    func hideKyeoboardTap(recognizer : UITapGestureRecognizer){
        self.view.endEditing(true)
    }


    // keyboardだすよー!
    func showKeyboard(notification: Notification){

        keyboard = ((notification.userInfo?[UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue)!

        // 外枠のサイズを初期の外枠サイズからキーボードサイズ分ひくよー
        UIView.animate(withDuration: 0.4, animations: {
            self.scrollView.frame.size.height = self.scrollViewHeight - self.keyboard.height
        })

    }

    // keyboard隠すよー
    func hideKeyboard(notification: Notification){

        keyboard = ((notification.userInfo?[UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue)!


        UIView.animate(withDuration: 0.4, animations: {
            self.scrollView.frame.size.height = self.view.frame.height
        })


動かすとこんな感じ

42b73cdcd1c1ff36733020a5013bf3cc.gif

【Swift】キーボードの外をタップするとキーボードが閉じる方法