一, 在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应用开发中,特别是在构建用户交互界面时,"弹出键盘,监听键盘高度"是一个常见且重要的需求。当用户需要在屏幕上输入信息,如评论、搜索或填写表单时,软键盘的弹出会影响到屏幕上的其他元素,尤其是那些位于...
本篇文章将深入探讨如何在Swift 5.2中使用通知来监听键盘的显示和隐藏。 首先,我们需要导入Foundation框架,因为通知中心(NotificationCenter)是这个框架的一部分。在Swift文件顶部添加以下代码: ```swift ...
首先,框架的核心功能在于监听键盘的显示和隐藏事件。它使用UIKeyboardNotifications来捕获这些事件,当键盘将要显示时,会触发一个回调,调整文本输入视图的位置;当键盘将要隐藏时,另一个回调会恢复视图的原始...
你可以通过监听按钮的`touchUpInside`事件来处理用户输入。 ```swift class CustomKeyboardView: UIView { // 按钮点击事件处理 func configureButton(for button: UIButton, with text: String) { button....
在这个“Swift5.2 通知监听键盘”的主题中,我们将深入探讨如何在Swift 5.2中使用通知来监听键盘的显示和隐藏事件。这在创建需要与键盘交互的界面,如文本输入时特别有用。 首先,我们了解通知中心...
这个库的实现原理是监听键盘的通知,如UIKeyboardWillShowNotification和UIKeyboardWillHideNotification,然后根据键盘的高度变化来调整视图的内容偏移量。 使用`IQKeyboardManager`非常简单,你只需将其集成到你...
1. **监听键盘通知**:在你的ViewController中,注册键盘通知监听器。这通常在`viewDidLoad`方法中完成。 ```swift override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver...
4. 自定义键盘的动画效果:为了提高用户体验,可以添加平滑的动画过渡,如键盘出现和消失时的淡入淡出效果,以及键盘高度变化时的滑动动画。 5. 键盘的布局优化:根据屏幕尺寸和设备方向,可能需要调整键盘的布局。...
1. **事件监听**:键盘记录器的核心是监听系统的键盘事件。在macOS中,这通常通过监听`NSEvent`对象来实现。开发者可能会注册一个全局事件监听器,以捕获所有发生在系统级别的键盘输入事件。 2. **权限管理**:由于...
`swift-InputAssistant` 是一个专为iOS键盘设计的工具,它允许开发者为键盘提供自定义的自动完成选项,提升用户体验。这个库基于Swift编程语言,使得集成更加简便。下面将详细探讨`swift-InputAssistant`的相关知识...
1. 键盘监听:WHC_KeyboardManager能够监听键盘的显示和隐藏事件,这样开发者就能在键盘出现或消失时执行相应的处理逻辑,如调整输入框的位置。 2. 自动适配:库会根据键盘的高度自动调整输入框的位置,确保其始终...
在iOS应用开发中,原生的系统键盘在某些场景下可能不够安全,例如当用户在输入银行卡号或密码时,可能存在被第三方应用监听的风险。ZSCSafeKeyBoard通过创建自定义键盘并使用Base64编码技术,增强了输入数据的安全性...
IQKeyboardManager的工作原理是监听键盘的通知,当键盘显示或隐藏时自动调整输入视图的位置。安装IQKeyboardManager非常简单,可以通过CocoaPods或者手动添加源代码到项目中。在Swift中,只需在AppDelegate.swift...
Util-KeyboardAssistant的工作原理是监听键盘的显示和隐藏事件。当键盘出现时,它会自动计算键盘的高度,并根据这个高度调整屏幕上相应控件的位置,以便它们不会被键盘遮挡。同样,当键盘隐藏时,它会恢复这些控件的...
这个库通过监听键盘的显示和隐藏通知,自动计算键盘的高度并调整视图的位置,从而避免了手动计算和设置约束的复杂过程。 使用YJKeyBoard非常简单,首先你需要将项目中的`YJKeyBoard-master`压缩包解压,导入到你的...
3. **监听键盘事件**:它能监听键盘的显示、隐藏事件,开发者可以据此执行自定义操作,比如暂停某些操作或者更新界面状态。 4. **简单易用的API**:集成WHC_KeyboardManager只需几行代码,使得开发者无需过多关注...
当不再需要监听键盘事件时,它会自动取消注册,避免造成内存泄漏。 8. **兼容性**: `KeyboardUtility`通常与Swift 4.0及更高版本兼容,并且适用于所有使用UIKit的iOS应用。开发者需要确保项目中的Swift版本与库...
在Swift编程语言中,开发一款类似微信的多行限制、多行输入的一体键盘是一项具有挑战性的任务。这个项目,名为"swift-仿微信多行限制多行输入一体键盘",旨在提供一个自定义的输入视图,它不仅包含一个键盘,而且...
1. **自动处理键盘事件**:框架监听并处理键盘的显示和隐藏事件,无需开发者手动处理这些复杂的观察者代码。 2. **平滑动画**:当键盘出现或消失时,LNKeyBoardManager会使用平滑的动画来调整内容视图,避免了硬性...
总结来说,处理键盘遮挡输入框的问题,关键在于监听键盘的显示和隐藏通知,然后动态调整输入框的位置。通过这一句简单的代码,我们可以显著提升应用的用户体验,使得用户在输入时不再受到键盘的困扰。这个技巧在各种...