`

swift -> 监听 键盘 事件获取 键盘 高度

 
阅读更多

 

一, 在viewDidload() 中 绑定通知,并添加键盘监听

其中绑定的 keyboardWillShow 会有动画, KeyboardDidShow 不会有 动画

func viewDidload(){
	NotificationCenter.default.addObserver(self, selector: #selector(PasscodePane.keyboardWillHide(_:)),name:NSNotification.Name.UIKeyboardWillHide, object: nil)
	NotificationCenter.default.addObserver(self, selector: #selector(PasscodePane.keyboardWillShow(_:)),name:NSNotification.Name.UIKeyboardWillShow, object: nil)
}

//释放
deinit {
	NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
	NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
}

func keyboardWillShow(_ sender: Notification) {
	//获取键盘的frame
	guard let keyboardFrame = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue else {
		return
	}
	//如果边框=0也返回
	if(keyboardFrame.height == nill || keyboardFrame.height == 0){return;}
	UIView.animate(withDuration: 0.1, animations: {
		self.containerCenterConstraint?.update(offset: -keyboardFrame.height/2)
		self.layoutIfNeeded()
	})
}

func keyboardWillHide(_ sender: Notification) {
	UIView.animate(withDuration: 0.1, animations: {
		self.containerCenterConstraint?.update(offset: 0)
		self.layoutIfNeeded()
	})
}

 

 

 

 

 ** 解决有时 或 第三方输入 触发 3次 或 多次 通知 的问题

原理是 获取 1秒 内获取到的最新的高度 ,并 1秒后才更新 UI 

 

 

    var keyb_ht:CGFloat = 0;
    var getKbHt_time_over:Bool = true;
    //机制: 1秒内 获取 到 的最后一次 高度 才 更新 UI , 从 第一次 触发 开始 或  1秒之后  再 触发的 第一次 开始
    func keyboardWillShow(aNotification: NSNotification) {
        let userinfo: NSDictionary = aNotification.userInfo! as NSDictionary
        let nsValue = userinfo.object(forKey: UIKeyboardFrameEndUserInfoKey)
        let keyboardRec = (nsValue as AnyObject).cgRectValue
        let key_height = keyboardRec?.size.height
        if(key_height == 0){
            return;
        }
        //更新当前最新的高度
        keyb_ht = key_height!;
        //如果 1秒 延迟 执行UI 还没有 执行 就返回
        if(getKbHt_time_over == false){
            print("111")
            return;
        }
        print("222")
        getKbHt_time_over = false;
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {//1秒之后才执行
            print("333")
            //update ui
            self.kb_top_view?.frame.origin.y = screenHeight - self.keyb_ht - self.kb_top_view_ht;
            self.getKbHt_time_over = true;
        }
    }

   

 

 

 

在执行动画的时候如果遇到 设置 动画时间无效 可用异步

DispatchQueue.main.async{ 

参考 : https://stackoverflow.com/questions/37805885/how-to-create-dispatch-queue-in-swift-3

 

 

** 输入框默认获得 焦点

textField.becomeFirstResponder()

 

 

**  火狐浏览器 关于 该方法 的 使用 源代码

class PasscodePane: UIView {
    let codeInputView = PasscodeInputView(passcodeSize: 4)

    var codeViewCenterConstraint: Constraint?
    var containerCenterConstraint: Constraint?

    fileprivate lazy var titleLabel: UILabel = {
        let label = UILabel()
        label.font = UIConstants.DefaultChromeFont
        label.isAccessibilityElement = true
        return label
    }()

    fileprivate let centerContainer = UIView()

    override func accessibilityElementCount() -> Int {
        return 1
    }

    override func accessibilityElement(at index: Int) -> Any? {
        switch index {
        case 0:     return titleLabel
        default:    return nil
        }
    }

    init(title: String? = nil) {
        super.init(frame: CGRect.zero)
        backgroundColor = UIConstants.TableViewHeaderBackgroundColor

        titleLabel.text = title
        centerContainer.addSubview(titleLabel)
        centerContainer.addSubview(codeInputView)
        addSubview(centerContainer)

        centerContainer.snp.makeConstraints { make in
            make.centerX.equalTo(self)
            containerCenterConstraint = make.centerY.equalTo(self).constraint
        }

        titleLabel.snp.makeConstraints { make in
            make.centerX.equalTo(centerContainer)
            make.top.equalTo(centerContainer)
            make.bottom.equalTo(codeInputView.snp.top).offset(-PasscodeUX.TitleVerticalSpacing)
        }

        codeInputView.snp.makeConstraints { make in
            codeViewCenterConstraint = make.centerX.equalTo(centerContainer).constraint
            make.bottom.equalTo(centerContainer)
            make.size.equalTo(PasscodeUX.PasscodeFieldSize)
        }
        layoutIfNeeded()
        NotificationCenter.default.addObserver(self, selector: #selector(PasscodePane.keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(PasscodePane.keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    }

    func shakePasscode() {
        UIView.animate(withDuration: 0.1, animations: {
                self.codeViewCenterConstraint?.update(offset: -10)
                self.layoutIfNeeded()
        }, completion: { complete in
            UIView.animate(withDuration: 0.1, animations: {
                self.codeViewCenterConstraint?.update(offset: 0)
                self.layoutIfNeeded()
            }) 
        }) 
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    }
    
    func keyboardWillShow(_ sender: Notification) {
        guard let keyboardFrame = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as AnyObject).cgRectValue else {
            return
        }
        
        UIView.animate(withDuration: 0.1, animations: {
            self.containerCenterConstraint?.update(offset: -keyboardFrame.height/2)
            self.layoutIfNeeded()
        })
    }
    
    func keyboardWillHide(_ sender: Notification) {
        UIView.animate(withDuration: 0.1, animations: {
            self.containerCenterConstraint?.update(offset: 0)
            self.layoutIfNeeded()
        })
    }
}

 

 

分享到:
评论

相关推荐

    弹出键盘,监听键盘高度

    在iOS应用开发中,特别是在构建用户交互界面时,"弹出键盘,监听键盘高度"是一个常见且重要的需求。当用户需要在屏幕上输入信息,如评论、搜索或填写表单时,软键盘的弹出会影响到屏幕上的其他元素,尤其是那些位于...

    Swift5.2 通知监听键盘

    本篇文章将深入探讨如何在Swift 5.2中使用通知来监听键盘的显示和隐藏。 首先,我们需要导入Foundation框架,因为通知中心(NotificationCenter)是这个框架的一部分。在Swift文件顶部添加以下代码: ```swift ...

    swift-视图随键盘自动调整的简单框架小巧易用

    首先,框架的核心功能在于监听键盘的显示和隐藏事件。它使用UIKeyboardNotifications来捕获这些事件,当键盘将要显示时,会触发一个回调,调整文本输入视图的位置;当键盘将要隐藏时,另一个回调会恢复视图的原始...

    swift-Swift自定义键盘

    你可以通过监听按钮的`touchUpInside`事件来处理用户输入。 ```swift class CustomKeyboardView: UIView { // 按钮点击事件处理 func configureButton(for button: UIButton, with text: String) { button....

    Swift5.2 通知监听键盘.zip

    在这个“Swift5.2 通知监听键盘”的主题中,我们将深入探讨如何在Swift 5.2中使用通知来监听键盘的显示和隐藏事件。这在创建需要与键盘交互的界面,如文本输入时特别有用。 首先,我们了解通知中心...

    swift-IQKeyBoardManager解决键盘遮挡住输入框的问题

    这个库的实现原理是监听键盘的通知,如UIKeyboardWillShowNotification和UIKeyboardWillHideNotification,然后根据键盘的高度变化来调整视图的内容偏移量。 使用`IQKeyboardManager`非常简单,你只需将其集成到你...

    swift-傻瓜式防键盘遮挡输入

    1. **监听键盘通知**:在你的ViewController中,注册键盘通知监听器。这通常在`viewDidLoad`方法中完成。 ```swift override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver...

    swift-KeyBoard-Swift使用Swift编写的字母和数字键键盘可以用于UITextField和UITextView

    4. 自定义键盘的动画效果:为了提高用户体验,可以添加平滑的动画过渡,如键盘出现和消失时的淡入淡出效果,以及键盘高度变化时的滑动动画。 5. 键盘的布局优化:根据屏幕尺寸和设备方向,可能需要调整键盘的布局。...

    swift-macOSKeylogger这是一个简单易用采用Swift编写的macOS键盘记录器

    1. **事件监听**:键盘记录器的核心是监听系统的键盘事件。在macOS中,这通常通过监听`NSEvent`对象来实现。开发者可能会注册一个全局事件监听器,以捕获所有发生在系统级别的键盘输入事件。 2. **权限管理**:由于...

    swift-InputAssistant为iOS键盘提供自定义自动完成选项。

    `swift-InputAssistant` 是一个专为iOS键盘设计的工具,它允许开发者为键盘提供自定义的自动完成选项,提升用户体验。这个库基于Swift编程语言,使得集成更加简便。下面将详细探讨`swift-InputAssistant`的相关知识...

    ios-局部监听键盘再也不会挡住输入框.zip

    1. 键盘监听:WHC_KeyboardManager能够监听键盘的显示和隐藏事件,这样开发者就能在键盘出现或消失时执行相应的处理逻辑,如调整输入框的位置。 2. 自动适配:库会根据键盘的高度自动调整输入框的位置,确保其始终...

    swift-ZSCSafeKeyBoard-金融行业base64安全键盘

    在iOS应用开发中,原生的系统键盘在某些场景下可能不够安全,例如当用户在输入银行卡号或密码时,可能存在被第三方应用监听的风险。ZSCSafeKeyBoard通过创建自定义键盘并使用Base64编码技术,增强了输入数据的安全性...

    swift-SXTextView一个TextView无限输入不被键盘遮挡

    IQKeyboardManager的工作原理是监听键盘的通知,当键盘显示或隐藏时自动调整输入视图的位置。安装IQKeyboardManager非常简单,可以通过CocoaPods或者手动添加源代码到项目中。在Swift中,只需在AppDelegate.swift...

    swift-一个自动适应你的键盘弹起收回以及你的控件位置的工具

    Util-KeyboardAssistant的工作原理是监听键盘的显示和隐藏事件。当键盘出现时,它会自动计算键盘的高度,并根据这个高度调整屏幕上相应控件的位置,以便它们不会被键盘遮挡。同样,当键盘隐藏时,它会恢复这些控件的...

    swift-YJKeyBoard一行代码解决iOS键盘遮挡问题

    这个库通过监听键盘的显示和隐藏通知,自动计算键盘的高度并调整视图的位置,从而避免了手动计算和设置约束的复杂过程。 使用YJKeyBoard非常简单,首先你需要将项目中的`YJKeyBoard-master`压缩包解压,导入到你的...

    swift-iOS平台轻量级的键盘管理器使用简单功能强大键盘再也不会挡住输入控件

    3. **监听键盘事件**:它能监听键盘的显示、隐藏事件,开发者可以据此执行自定义操作,比如暂停某些操作或者更新界面状态。 4. **简单易用的API**:集成WHC_KeyboardManager只需几行代码,使得开发者无需过多关注...

    swift-iOS键盘实时跟踪KeyboardUtility

    当不再需要监听键盘事件时,它会自动取消注册,避免造成内存泄漏。 8. **兼容性**: `KeyboardUtility`通常与Swift 4.0及更高版本兼容,并且适用于所有使用UIKit的iOS应用。开发者需要确保项目中的Swift版本与库...

    swift-仿微信多行限制多行输入一体键盘

    在Swift编程语言中,开发一款类似微信的多行限制、多行输入的一体键盘是一项具有挑战性的任务。这个项目,名为"swift-仿微信多行限制多行输入一体键盘",旨在提供一个自定义的输入视图,它不仅包含一个键盘,而且...

    swift-LNKeyBoardManager极其简单友好的管理键盘遮盖的框架

    1. **自动处理键盘事件**:框架监听并处理键盘的显示和隐藏事件,无需开发者手动处理这些复杂的观察者代码。 2. **平滑动画**:当键盘出现或消失时,LNKeyBoardManager会使用平滑的动画来调整内容视图,避免了硬性...

    swift-一句代码解决键盘遮挡输入框问题

    总结来说,处理键盘遮挡输入框的问题,关键在于监听键盘的显示和隐藏通知,然后动态调整输入框的位置。通过这一句简单的代码,我们可以显著提升应用的用户体验,使得用户在输入时不再受到键盘的困扰。这个技巧在各种...

Global site tag (gtag.js) - Google Analytics