簡介
// Presented when object becomes first responder. If set to nil, reverts to following responder chain. If
// set while first responder, will not take effect until reloadInputViews is called.
open var inputView: UIView?
open var inputAccessoryView: UIView?

顧名思義,UIInputView就是鍵盤按鍵那個View,UIInputAccessoryView就是吸附在鍵盤視圖上面的toolBar。藍色的是UIInputView,紅色的是UIInputAccessoryView。
Frame
@IBOutlet weak var textView: UITextView!
lazy var ssInputAccessoryView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 40))
view.backgroundColor = UIColor.red
return view
}()
lazy var ssInputView: UIView = {
let view = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 400))
view.backgroundColor = UIColor.blue
return view
}()
override func viewDidLoad() {
super.viewDidLoad()
self.textView.inputAccessoryView = self.ssInputAccessoryView
self.textView.inputView = self.ssInputView
}
這里面會有的幾個問題。
設置self.textView.inputAccessoryView的時候,View的Frame會帶過來,即原來的View的frame是多少,inputAccessoryView和inputView的frame就是多少,當然也可以設置完inputView和inputAccessoryView之后再設置frame。其實這邊就帶了frame的高度。
self.textView.inputView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
但是這邊會有問題,在add viewController的View的時候,frame無法帶過來,默認是200左右的高度。即使設置了view之后,也無法調(diào)整。目前我還在探索中,歡迎更好的建議。//TODO
self.textView.inputView = nil
inputView返回為keyboard
Animation
inputView和inputAccessoryView的動態(tài)切換,需要先設置View,之后reload.
self.textView.resignFirstResponder()
self.textView.becomeFirstResponder()
self.textView.reloadInputViews()
后者效率更好。不過這邊的問題是inputView在切換到keyboard和custom inputView的時候并沒有動畫效果。目前我孩砸探索中,歡迎更好的建議。//TODO
Debug View Hierarchy
視圖檢查其無法抓取inputView和inputAccessoryView的視圖。
Show Toast
由于inputView和inputAccessoryView是iOS系統(tǒng)獨立于app視圖的,所以一方面視圖檢查器抓取不到,另一方面是toast始終會被inputView圖層覆蓋。
First Responder
由于iOS系統(tǒng)內(nèi),text的控件和inputView是緊耦的,當text control是firstResponder的時候,text control彈出cursor,觸發(fā)begin editing事件,iOS系統(tǒng)彈出鍵盤,以上幾個對象和事件是關(guān)聯(lián)的,并沒有單獨控制的辦法。(比如我想讓鍵盤消失,但是cursor不消失,是做不到的)