Swift 入力欄を作りたいけど、キーボードが出ると入力欄が埋まる罠 その2

新しいエントリーあります。
入力欄を作りたいけど、キーボードが出ると入力欄が埋まる罠 その3 リベンジ編
http://d.hatena.ne.jp/factory-g/20150705#1436109602

それならObjectCから

http://xyk.hatenablog.com/entry/2014/10/02/181047
上記ブログを参考にしつつ、いろいろマージしてみる。

UITextViewのデリゲートできてませんがな

http://stackoverflow.com/questions/25064465/uitextview-data-change-swift
(つд⊂)ううぅぅ
とにかく、こういった初歩的な所から盛大にずっこけてしまう・・・・

出来上がったソース

勿論、先ほどまで参考にしたブログ様と似たりよったりです。
半分以上意味わからずコーディングしてますわ。

import UIKit

class ViewController: UIViewController, UITextViewDelegate {
    @IBOutlet weak var txtChat: UITextField!
    @IBOutlet weak var scvBackGround: UIScrollView!
    @IBOutlet weak var tvChat: UITextView!
    
    @IBAction func tapScreen(sender: UITapGestureRecognizer) {
        self.view.endEditing(true)
    }
    var txtActiveField: UITextField?
    var txtActiveView: UITextView?
    
    // 最初に呼び出される
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        tvChat.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // テキストフィールドにフォーカスが移った場合
    func textFieldShouldBeginEditing(textField: UITextField!) -> Bool {
        txtActiveField = textField
        return true
    }

    // テキストフィールドからフォーカスが失われた場合
    func textFieldDidEndEditing(textField: UITextField!) -> Bool {
        if textField == txtActiveField {
            txtActiveField = nil
        }
        return true
    }
    
    // テキストビューにフォーカスが移った場合
    func textViewShouldBeginEditing(textView: UITextView!) -> Bool {
        txtActiveView = textView
        return true
    }
    
    // テキストビューからフォーカスが失われた場合
    func textViewShouldEndEditing(txtView: UITextView) -> Bool {
        if txtView == txtActiveView {
            txtActiveView = nil
        }
        return true
    }
    
    
    // キーボードのリターンキーを押された時にキーボードを閉じる
    /*
    func textFieldShouldReturn(textField: UITextField!) -> Bool {
        self.view.endEditing(true)
        return true
    }
    */
    
    // キーボード表示前のイベントhandleKeyboardWillShowNotification
    // キーボード非表示前のイベントhandleKeyboardWillHideNotification
    // を登録
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.addObserver(self, selector: "handleKeyboardWillShowNotification:", name: UIKeyboardWillShowNotification, object: nil)
        notificationCenter.addObserver(self, selector: "handleKeyboardWillHideNotification:", name: UIKeyboardWillHideNotification, object: nil)
    }

    // キーボードが表示された時
    func handleKeyboardWillShowNotification(notification: NSNotification) {
        // キーボードのTOPを取得
        let userInfo = notification.userInfo!
        let keyboardRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as NSValue).CGRectValue()
        let myBoundSize: CGSize = UIScreen.mainScreen().bounds.size
        
        var txtFieldRect: CGRect!
        if txtActiveField != nil {
            txtFieldRect = txtActiveField?.frame
        }
        if txtActiveView != nil {
            txtFieldRect = txtActiveView?.frame
        }
        
        // キーボードに隠れない場合は、何もしない
        if CGRectGetMaxY(txtFieldRect!) < CGRectGetMinY(keyboardRect){
            return
        }
        var nowOffsetY:CGFloat = scvBackGround.contentOffset.y
        
        // スクロールさせる距離を算出
        var offsetY:CGFloat = CGRectGetMaxY(txtFieldRect!) - CGRectGetMinY(keyboardRect)

        // scrollView の contentInset と scrollIndicatorInsets の bottom に追加
        var contentInsets:UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, offsetY, 0.0)
        scvBackGround.contentInset = contentInsets
        scvBackGround.scrollIndicatorInsets = contentInsets

        // 移動後のオフセット算出
        var scrollPoint:CGPoint = CGPointMake(0.0, nowOffsetY + offsetY + 65.0)
        
        UIView.beginAnimations(nil, context: nil)
        UIView.setAnimationDuration(userInfo[UIKeyboardAnimationDurationUserInfoKey] as double_t)
        // エラーになります。ワカランがぁ。
        // UIView.setAnimationCurve((userInfo[UIKeyboardAnimationCurveUserInfoKey] as NSValue) as integer_t)
        UIView.setAnimationBeginsFromCurrentState(true)
        
        // 移動後のオフセット設定
        scvBackGround.contentOffset = scrollPoint
        
        UIView.commitAnimations()
        
    }
    
    // ずらした分を戻す
    func handleKeyboardWillHideNotification(notification: NSNotification) {
        scvBackGround.contentOffset.y = 0
    }

    
    override func viewDidDisappear(animated: Bool) {
        super.viewDidDisappear(animated)
        
        let notificationCenter = NSNotificationCenter.defaultCenter()
        notificationCenter.removeObserver(self, name: UIKeyboardWillShowNotification, object: nil)
        notificationCenter.removeObserver(self, name: UIKeyboardWillHideNotification, object: nil)
    }


}

キーボードの候補欄の高さが

初回呼び出しに限り取得できません!!!
ッテナンデヤネン┌(`Д´)ノ
もう、ほっときますわ。これ。
二回目からはちゃんと行くから。

総括

スクロールコントロールが無いと、出来ないとか、ドンだけテクニックが必要なん↑
疲れた。

Table関連での入力で参考になりそうなブログ様

http://redwing.moo.jp/cocoa/archives/783

さて、iOS8から参戦した弩素人、これからChatまで結びつけられるのか・・・。