テキストフィールドにキーボードが被らないようにする(色々バージョン)swift3

タイトル通りなのですが、テキストフィールドにキーボードを被らないようにする方法です。このやり方人によってそれぞれあるのでパターン化して残して置こうと思いました。結構これ自分的には欲しかったので、もしかしたらと共有して置こうと思います。ちなみにここでコード書くと結構いっぱいあるのでgithubにあげています。コードはクローンしてみていただけたらと思います。:shamrock:

githubのurl → https://github.com/sachiko-kame/swift.sample19


ちなみにプロジェクトはホームに種類書いて
<img width="313" alt="スクリーンショット 2017-06-19 2.54.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/4ff277a5-7bd8-4013-1087-50a4437e9323.png">

遷移先にクラス分けてって書いてます。
<img width="312" alt="スクリーンショット 2017-06-19 2.58.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/89ef7720-ed1a-381f-c513-2f15bb269399.png">



これを作るにあたって参考にさせていただいたURLです。このクラスはどこのurlを参考にしたかも上に書いてあります。

:hatched_chick:かぶる分だけスクロールしての調整の参考<font color="red">一番のオススメ,ちなみにこれが結構多かった印象受けました。</font>
http://qiita.com/kobaboy/items/d56086b92f84c586562d

:hatched_chick:アニメーションつけてのviewの縮小での調整の参考
http://hacknote.jp/archives/7958/

:hatched_chick:制約を使っての調整の参考
http://hajihaji-lemon.com/smartphone/swift/uitextview_keyboard/

:hatched_chick:AutoLayoutの参考
http://blog.personal-factory.com/2016/01/11/make-auto-layout-via-code/

:hatched_chick:タップでキーボードを閉じるの参考
https://i-app-tec.com/ios/uigesturerecognizer.html


やっぱり一番お気に入りのクラスだけコード乗せておきます！！

```pattern2ViewController.swift
//参考URL http://qiita.com/kobaboy/items/d56086b92f84c586562d
class pattern2ViewController: UIViewController ,UITextFieldDelegate, UIScrollViewDelegate {
    
    var txtActiveField = UITextField()
    var scrollFormer:CGFloat! = nil
    let scrollViewsample = UIScrollView()


    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.blue
        
        let mainViewFrame = UIScreen.main.bounds
        
        scrollViewsample.frame = mainViewFrame
        scrollViewsample.contentSize = CGSize(width:mainViewFrame.size.width , height:mainViewFrame.height + 150)
        let sampletextFile = UITextField()
        sampletextFile.delegate = self
        sampletextFile.text = "パターン2"
        sampletextFile.borderStyle = UITextBorderStyle.roundedRect
        sampletextFile.frame.size.width = mainViewFrame.size.width/2
        let rec = CGRect(x: mainViewFrame.midX - sampletextFile.frame.size.width/2, y: 500, width:mainViewFrame.size.width/2 , height:  40.0)
        sampletextFile.frame = rec
        self.view.addSubview(scrollViewsample)
        scrollViewsample.addSubview(sampletextFile)

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    override func viewWillAppear(_ animated: Bool) {
        
        super.viewWillAppear(animated)
        
        let notificationCenter = NotificationCenter.default
        notificationCenter.addObserver(self, selector: #selector(pattern2ViewController.handleKeyboardWillShowNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        notificationCenter.addObserver(self, selector: #selector(pattern2ViewController.handleKeyboardWillHideNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        
        return true
    }

    

    //UITextFieldが編集された直後に呼ばれる.
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        
        //編集されたテキストフィールドを格納しておく
        txtActiveField = textField
        return true
    }
    
    func handleKeyboardWillShowNotification(_ notification: Notification) {
        
        
        let userInfo = notification.userInfo!
        //キーボードの大きさ調べる
        let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let myBoundSize: CGSize = UIScreen.main.bounds.size
        
        let scrollvalue = scrollViewsample.contentOffset.y
        scrollFormer = scrollViewsample.contentOffset.y
        
        //入力したテキストフィールドのy軸と高さと少し余白を足してテキストフィールドのマックスy値と少し余白のy軸をとる
        let txtLimit = txtActiveField.frame.maxY + 8.0
        let txtLimit1 = txtActiveField.frame.maxY + 8.0 - scrollvalue
        
        //現在のselfViewの高さから、キーボードの高さを引いて残りの幅の高さをみるy軸をみる
        let kbdLimit = myBoundSize.height - keyboardScreenEndFrame.size.height
        
        
        print("テキストフィールドの下辺：(\(txtLimit))")
        print("キーボードの上辺：(\(kbdLimit))")
        
        //キーボードよりテキストフィールドのy軸が大きかったらキーボードにかかっている状態。スクロールビューをその分移動させる。
        if txtLimit1 >= kbdLimit {
            scrollViewsample.contentOffset.y = txtLimit - kbdLimit
        }
    }
    
    func handleKeyboardWillHideNotification(_ notification: Notification) {
        
        
        //スクロールしてある位置に戻す
        scrollViewsample.contentOffset.y = scrollFormer
    }

   
}

```