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まで結びつけられるのか・・・。