import UIKit
//关于UITextView的键盘遮挡问题
class ViewController: UIViewController {
var flag = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
view.addSubview(textView)
textView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height: 30)
//+ view.bounds.height/2-textView.bounds.height/2
textView.center = CGPoint(x: view.center.x, y: view.center.y + 100 )
textView.delegate = self
testLabel.frame = CGRect(x: 0, y: 0, width:50, height: 50)
testLabel.center = CGPoint(x: view.center.x, y: view.center.y )
view.addSubview(testLabel)
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
addKeyBoardNotification()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.view.endEditing(true)
flag = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
private lazy var testLabel:UILabel = {
let testLabel = UILabel()
testLabel.backgroundColor = UIColor.redColor()
return testLabel
}()
private lazy var textView:UITextView = {
let textView = UITextView()
textView.backgroundColor = UIColor.orangeColor()
return textView
}()
}
//MARK: 键盘遮挡
extension ViewController {
func addKeyBoardNotification(){
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillApprear), name: UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillDisAppear), name: UIKeyboardWillHideNotification, object: nil)
}
@objc func keyboardWillApprear(noti:NSNotification) {
//在iOS9上看没有任何问题,iOS10上出现一些问题
print(noti)
let dict = noti.userInfo
let interval = dict![UIKeyboardAnimationDurationUserInfoKey] as! Double
let keyboardValue = dict?[UIKeyboardFrameEndUserInfoKey] as? NSValue
var keyboardRect:CGRect = CGRectZero
keyboardValue?.getValue(&keyboardRect)
let tempValue = dict![UIKeyboardFrameBeginUserInfoKey] as! NSValue
var tempRect = CGRectZero
tempValue.getValue(&tempRect)
// 我们通过总结发现,如果你是第一次输入内容,搜狗输入法的UIKeyboardFrameBeginUserInfoKey在第一次和第二次时,frame.size.height都是0;
// 而第三次的才算正常的,和系统发出的一样.
if tempRect.height <= 0 {
return
}
if keyboardRect.height <= 0 {
return
}
if tempRect.origin.y - keyboardRect.origin.y < 0 {
return
}
let frame = self.textView.frame
let height = self.view.frame.size.height
// textView的y值+textView的高度 - (view的高度(不是屏幕的高度) - 键盘的高度 )
let offset = frame.origin.y + frame.size.height - (height - keyboardRect.size.height)
if offset > 0 && flag == false{
flag = true
print("被执行了")
let animationDuration: NSTimeInterval = interval
// UIView.beginAnimations(nil, context: nil)
// UIView.setAnimationDuration(animationDuration)
UIView.animateWithDuration(animationDuration, animations: {
//view的frame:(0,64,width,height)
//如果有导航栏需要-offset+64
let rect = CGRect(x: 0, y: -offset , width: self.view.frame.size.width, height: self.view.bounds.size.height)
self.view.frame = rect
}, completion: { (flag) in
})
// UIView.commitAnimations()
}
}
@objc func keyboardWillDisAppear(noti:NSNotification) {
let dict = noti.userInfo
let interval = dict![UIKeyboardAnimationDurationUserInfoKey] as! Double
UIView.animateWithDuration(interval, animations: {
//如果有导航栏y:64
self.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
}) { (_) in
}
}
}
extension ViewController:UITextViewDelegate {
func textViewDidChange(textView: UITextView) {
let fixedWidth = textView.frame.width
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
if newSize.height > textView.frame.height && newSize.height < 120 {
//修改位置
var viewFrame = self.view.frame
viewFrame.origin.y -= newSize.height - textView.frame.height
self.view.frame = viewFrame
//修改textView的高度
var frame = textView.frame
frame.size.height = newSize.height
textView.frame = frame
}
}
}
/*
iOS9:
原生键盘:
NSConcreteNotification 0x1355aa840 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 251.5}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 693.75}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 442.25}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 251.5}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 316.5}, {320, 251.5}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
搜狗键盘:
NSConcreteNotification 0x135d51140 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135ea3ef0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135ea4210 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
输入内容之后:
NSConcreteNotification 0x135df6c00 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135def7d0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135df6df0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135e43ff0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 0}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135de2850 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 568}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 0}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x135e17980 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
我们通过总结发现,如果你是第一次输入内容,搜狗输入法的UIKeyboardFrameBeginUserInfoKey在第一次和第二次时,frame.size.height都是0;
而第三次的才算正常的,和系统发出的一样.
但是一旦你输入过内容,不管是多少,即使把已经输入的内容都删除,再次弹出的键盘的时候就不一样了。
*/
/*
iOS10:
NSConcreteNotification 0x17024dcb0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 709}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 568}, {320, 282}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
被执行了
NSConcreteNotification 0x17424dcb0 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 427}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
NSConcreteNotification 0x17424dc20 {name = UIKeyboardWillShowNotification; userInfo = {
UIKeyboardAnimationCurveUserInfoKey = 7;
UIKeyboardAnimationDurationUserInfoKey = "0.25";
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 282}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 427}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 286}, {320, 282}}";
UIKeyboardIsLocalUserInfoKey = 1;
}}
*/
iOS关于键盘遮挡问题
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在iOS开发中,UITextFiled和UITextView是很常见的两个控件,当我们设置好这两个控件后,点击文字...
- 来源:Draveness (https://github.com/Draveness) 链接:http://www...