iOS 使用 UIMenuController 且不隐藏键盘的方法

时间:2023-03-08 20:22:02

iOS 使用 UIMenuController 且不隐藏键盘的方法

在键盘显示的时候使用 UIMenuController 弹出菜单,保持键盘显示且可输入的状态。

iOS 使用 UIMenuController 且不隐藏键盘的方法

实现方法有

  1. 修改响应链(推荐)
  2. 遵循 UIKeyInput 协议
  3. 自定义 Menu controller

前两种方法的代码已上传 GitHub:https://github.com/Silence-GitHub/MenuControllerDemo

第 3 种方法的 GitHub 链接:https://github.com/Silence-GitHub/SWMenuController

在此之前,介绍 UIMenuController 的使用方法,以及键盘会隐藏的原因。

如果只要实现功能,看第 1 种方法的代码就可以,正文基本不用看。如果要理解响应链(Responder chain)相关的原理,先看 Apple 的文档 Understanding Responders and the Responder Chain

UIMenuController 的使用方法

自定义一个需要显示 UIMenuController 的视图,以 UIButton 为例,自定义类 ShowMenuButton

class ShowMenuButton: UIButton {

    // Return true so that menu controller can display
override var canBecomeFirstResponder: Bool { return true } // Return true to show menu for given action
// Action is in UIResponderStandardEditActions
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return action == #selector(copy(_:))
} override func copy(_ sender: Any?) {
print(#function)
}
}

ShowMenuButton 必须重载 canBecomeFirstResponder 属性,返回 true 才能显示菜单(UIMenuController)。第一响应者(First responder)才能处理菜单,如果 canBecomeFirstResponder 返回 false,不能成为第一响应者,菜单不会显示。

重载 canPerformAction(_:withSender:) 方法,过滤需要显示的菜单按钮(UIMenuItem)。参数 action 有 copy(_