美文网首页
iOS关于键盘遮挡问题

iOS关于键盘遮挡问题

作者: 流星大石头 | 来源:发表于2016-10-13 10:07 被阅读294次
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关于键盘遮挡问题

      本文链接:https://www.haomeiwen.com/subject/yjdwyttx.html