美文网首页IT技术篇OC-开发案例收集
Swift 解决键盘遮盖问题封装

Swift 解决键盘遮盖问题封装

作者: 木马sun | 来源:发表于2019-05-28 21:59 被阅读0次

    日常开发中,经常会遇到输入框被键盘遮盖的问题, 本次思路是 将键盘处理相关代码封装成一个 单利的工具类, 通过监听系统的键盘相关通知来 获取键盘信息,实现被遮盖视图的上移操作,上代码:

    import Foundation
    class KeyBoderHandleTool: NSObject {
        
        //可能会被遮盖的 view
        private var keyBoderHandleView :UIView?
        
        //可能会被遮盖的view 的遮盖高度
        private var keyBoderHandleHeigt :CGFloat = 0.0
        private let disposeBag = DisposeBag()
        
        //单利对象
        private static var sharedTool :KeyBoderHandleTool?
        
        //获取单利对象
        class func getSharedKeyBoderTool() ->KeyBoderHandleTool{
            
            guard let instance = sharedTool else {
                sharedTool = KeyBoderHandleTool()
                return sharedTool!
            }
            return instance
        }
        
        
        //销毁单利对象
        class func destroy() {
            sharedTool = nil
        }
    
        // 私有化init 初始方法
        private override init() {}
        
        
        //监听键盘弹出
        /// 处理键盘 遮盖问题
        ///
        /// - Parameters:
        ///   - handleView: 需要处理的视图
        ///   - offsetY: 如果是 可滑动的view  就传入 y 轴上的偏移量
        func handleKeyBoderAction(handleView :UIView, offsetY :CGFloat?){
            
            if keyBoderHandleView != nil {
                //更换遮盖view
                self.keyBoderHandleView = handleView
                return
            }
            
            print("开始了****************")
            self.keyBoderHandleView = handleView
            
            //监听键盘出现
            weak var weakSelf = self
            NotificationCenter.default.addObserver(forName: UIResponder.keyboardDidShowNotification, object: nil, queue: OperationQueue.main) { (notification) in
                
                let info = notification.userInfo
                
                //键盘动画时间
                let duration = (info?[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
                
                //键盘坐标尺寸
                let keyBoderRect = (info?[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                //获取键盘被遮盖部分的高度
                let keyBoderHeight = keyBoderRect.size.height      //获取键盘高度
                let boundHeight = UIScreen.main.bounds.size.height  //屏幕高度
                
                let viewMaxY :CGFloat = offsetY == nil ? weakSelf!.keyBoderHandleView!.frame.maxY : (weakSelf!.keyBoderHandleView!.frame.maxY-offsetY!)
                //需要处理的 view 的绝对 Y 坐标
                
                //计算出被遮盖部分的高度
                weakSelf!.keyBoderHandleHeigt = viewMaxY - (boundHeight-keyBoderHeight)
                if weakSelf!.keyBoderHandleHeigt <= 0 {
                    return
                }
                
                //将其父视图 上移被遮盖的高度
                if let superView = weakSelf!.keyBoderHandleView!.superview {
                    
                    UIView.animate(withDuration: duration, animations: {
                        weakSelf!.keyBoderHandleView!.superview!.frame = CGRect.init(x: superView.frame.origin.x, y: superView.frame.origin.y - weakSelf!.keyBoderHandleHeigt, width: superView.bounds.size.width, height: superView.bounds.size.height)
                        
                    })
                    
                }
                print("打印数据--消失--\(weakSelf!.keyBoderHandleHeigt)----\(weakSelf!.keyBoderHandleView!.tag)")
                
            }
            
            NotificationCenter.default.addObserver(forName: UIResponder.keyboardWillHideNotification, object: nil, queue: OperationQueue.main) { (notification) in
                
                let info = notification.userInfo
                if weakSelf!.keyBoderHandleHeigt <= 0{
                    return
                }
                
                //键盘动画时间
                let duration = (info?[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
                
                //将高度还原
                if let superView = weakSelf!.keyBoderHandleView!.superview {
                    UIView.animate(withDuration: duration, animations: {
                        weakSelf!.keyBoderHandleView!.superview!.frame = CGRect.init(x: superView.frame.origin.x, y: superView.frame.origin.y + weakSelf!.keyBoderHandleHeigt, width: superView.bounds.size.width, height: superView.bounds.size.height)
                        
                    })
                }
                
                print("打印数据--消失--\(weakSelf!.keyBoderHandleHeigt)----\(weakSelf!.keyBoderHandleView!.tag)")
                
            }
        }
    
        deinit {
            
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardDidShowNotification, object: nil)
        }
    }
    
    

    使用时, 只需要直接调用:

    KeyBoderHandleTool.getSharedKeyBoderTool().handleKeyBoderAction(handleView: textField, offsetY: nil)
    

    当输入框在 可滑动控件上时,记得传入 y 轴上的 offset,否则传nil

    注意点:

    1:在 确定不需要再监听的情况下可以 调用 工具类中的 销毁方法
    2: 发生界面跳转等情况时,请先将键盘隐藏(self.view.endEditing(true))

    相关文章

      网友评论

        本文标题:Swift 解决键盘遮盖问题封装

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