關(guān)于iOS TextFiled的詳細使用請看:iOS TextFiled
本文中scrollView的布局請看:scrollView的布局
點擊視圖收起鍵盤
給Content View新建contentView類,繼承UIView類,實現(xiàn)收起鍵盤的功能
class contentView: UIView {
//點擊收回鍵盤
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.endEditing(true)
}
}
綁定Content View和contentView類
解決鍵盤的遮擋問題
給viewControllor添加監(jiān)聽事件
// 監(jiān)聽鍵盤彈出事件
NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardWillShowFrame:", name: UIKeyboardWillShowNotification, object: nil)
// 監(jiān)聽鍵盤隱藏事件
NSNotificationCenter.defaultCenter().addObserver(self, selector: "onKeyboardWillHideFrame:", name: UIKeyboardWillHideNotification, object: nil)
實現(xiàn)鍵盤出現(xiàn)的事件
func onKeyboardWillShowFrame(notification: NSNotification) {
// 1、將通知中的數(shù)據(jù)轉(zhuǎn)換成NSDictionary
let dict = NSDictionary(dictionary: notification.userInfo!)
// 2、獲取鍵盤最后的Frame值
let keyboardFrame = dict[UIKeyboardFrameEndUserInfoKey]!.CGRectValue
// 4、獲取鍵盤彈出動畫事件
let duration = dict[UIKeyboardAnimationDurationUserInfoKey] as! Double
UIView.animateWithDuration(duration, animations: { () -> Void in
// 5、設(shè)置整個屏幕隨鍵盤移動
//下面的方法是將視圖整個上移ty的距離
// self.scrollView.transform = CGAffineTransformMakeTranslation(0, ty)
//判斷輸入的是哪個框
var textClicked: UITextField!
if self.text.isFirstResponder() {
textClicked = self.text
}else if self.text1.isFirstResponder() {
textClicked = self.text1
}else if self.text2.isFirstResponder() {
textClicked = self.text2
}
//如果當前輸入的框的位置低于鍵盤的高度就移動視圖
if textClicked.frame.maxY > keyboardFrame.origin.y{
//被點擊的文本框的底部的Y值 和 鍵盤的頂端的Y值 就是要移動的距離
let offSet = textClicked.frame.maxY - keyboardFrame.origin.y
//設(shè)置scrollView的可拖動距離(contentSize)為原來的視圖高+鍵盤高,這樣鍵盤沒有遮擋的部分可以滾動查看原來所有的視圖
self.scrollView.contentSize.height = self.scrollViewHieght + keyboardFrame.size.height
//+10 是為了使textFiled不要緊貼輸入法
self.scrollView.contentOffset = CGPoint(x: 0.0, y: offSet + 10)
}
})
}
deinit { // 控制器銷毀時,移除消息通知監(jiān)聽(必須)
NSNotificationCenter.defaultCenter().removeObserver(self)
}
其中的scrollViewHieght是和視圖的高相等的
在類中聲明scrollViewHieght,并且在viewDidLoad方法在中將視圖的高賦值給scrollViewHieght
var scrollViewHieght: CGFloat!
//下面這句話寫在viewDidLoad方法中
scrollViewHieght = self.view.frame.height
實現(xiàn)鍵盤收起事件,將視圖恢復
// MARK - 鍵盤隱藏事件監(jiān)聽
func onKeyboardWillHideFrame(notification: NSNotification) {
let dict = NSDictionary(dictionary: notification.userInfo!)
let duration = dict[UIKeyboardAnimationDurationUserInfoKey] as! Double
UIView.animateWithDuration(duration, animations: { () -> Void in
//讓scrollView還原
self.scrollView.contentOffset = CGPoint(x: 0.0, y: 0)
self.scrollView.contentSize.height = self.view.frame.height
})
}
別忘了將所有textFiled的delegate設(shè)置為self,并且實現(xiàn)textFieldShouldReturn方法,此時,textFiled所在的類要繼承UITextFiledDelegate協(xié)議
text1.delegate = self
text.delegate = self
text2.delegate = self
func textFieldShouldReturn(textField: UITextField) -> Bool {
//當前textField取消焦點
textField.resignFirstResponder()
return true
}
這樣就可以解決鍵盤遮擋的問題。
下面說一下代碼中用到的和沒用到的scrollView和view的一些屬性
ScrollView的一些屬性
- contentSize: CGSize 有 width 和 height,代表ScrollView可以滾動的視圖大小
- contentSize: CGPoint 有 x 和 y ,表示將ScrollView移動到指定坐標
View的一些屬性
View的 frame 屬性 有
- width 自身的寬
- height 自身的高
- max X/Y
- mid X/Y
-
min X/Y
如圖 介紹了Y X就自行腦補
屏幕快照 2015-12-19 下午6.45.45.png
本文原創(chuàng),作者初學不容易 =。= ,假如你轉(zhuǎn)載,注明出處
360云盤:TextFieldView (提取碼:92d4)
2016.1.10更新
機智的我發(fā)現(xiàn),當你的軟件設(shè)置為中文模式的時候,你的輸入法會多出來一部分候選單詞,這個時候,系統(tǒng)計算的鍵盤高度并不包含候選單詞的高度,所以會出現(xiàn)輸入框還是被遮擋的狀況,解決方法就是,在下面這個代碼中:
//+10 是為了使textFiled不要緊貼輸入法
self.scrollView.contentOffset = CGPoint(x: 0.0, y: offSet + 10)
將10 修改為更大的數(shù)字,置于具體是多少,就讀者自己看著辦吧!
