Swift `UIMenuController` 自定义操作
Swift `UIMenuController` custom action
我已经使用 TextKit
实现了自定义文本视图。我还使用 UILongPressGesture
实现了自定义文本选择。我在使用标准弹出菜单 UIMenuController
复制选定文本方面取得了进展。
我想实现自定义文本定义。覆盖标准定义操作(不知道它是否存在)或自定义 UIMenuItem
.
到目前为止,我有以下内容:
@objc func longTap(sender: UILongPressGestureRecognizer) {
...
becomeFirstResponder()
let copyItem = UIMenuItem(title: "Copy", action: #selector(copySelector))
let defineItem = UIMenuItem(title: "Define", action: #selector(defineSelector))
UIMenuController.shared.menuItems = [copyItem, defineItem]
UIMenuController.shared.setTargetRect(...)
UIMenuController.shared.setMenuVisible(true, animated: true)
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(CenterViewController.copySelector) {
return true
} else if action == #selector(CenterViewController.defineSelector) {
return true
}
return false
}
....
@objc func defineSelector() {
// Use device's dictionary?
// ??
customTextView.clearSelection()
}
这里的问题是:如何实施 defineSelector
?
我到处找,都没有答案。
有什么方法可以使用字典并提供带有定义的模态视图吗?因为它是由系统使用任何选定的文本完成的。
没关系,我找到了解决方案:
@objc private func defineSelector() {
if let text = textToCopy {
let txt = UITextView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
txt.isHidden = true
view.addSubview(txt)
txt.text = text
txt.isEditable = false
txt.becomeFirstResponder()
txt.selectedRange = NSRange(0..<text.count)
let selector = Selector(("_define:"))
if txt.canPerformAction(selector, withSender: nil) {
txt.perform(selector, with: nil)
}
txt.removeFromSuperview()
}
customTextView.clearSelection()
}
我已经使用 TextKit
实现了自定义文本视图。我还使用 UILongPressGesture
实现了自定义文本选择。我在使用标准弹出菜单 UIMenuController
复制选定文本方面取得了进展。
我想实现自定义文本定义。覆盖标准定义操作(不知道它是否存在)或自定义 UIMenuItem
.
到目前为止,我有以下内容:
@objc func longTap(sender: UILongPressGestureRecognizer) {
...
becomeFirstResponder()
let copyItem = UIMenuItem(title: "Copy", action: #selector(copySelector))
let defineItem = UIMenuItem(title: "Define", action: #selector(defineSelector))
UIMenuController.shared.menuItems = [copyItem, defineItem]
UIMenuController.shared.setTargetRect(...)
UIMenuController.shared.setMenuVisible(true, animated: true)
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
if action == #selector(CenterViewController.copySelector) {
return true
} else if action == #selector(CenterViewController.defineSelector) {
return true
}
return false
}
....
@objc func defineSelector() {
// Use device's dictionary?
// ??
customTextView.clearSelection()
}
这里的问题是:如何实施 defineSelector
?
我到处找,都没有答案。 有什么方法可以使用字典并提供带有定义的模态视图吗?因为它是由系统使用任何选定的文本完成的。
没关系,我找到了解决方案:
@objc private func defineSelector() {
if let text = textToCopy {
let txt = UITextView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
txt.isHidden = true
view.addSubview(txt)
txt.text = text
txt.isEditable = false
txt.becomeFirstResponder()
txt.selectedRange = NSRange(0..<text.count)
let selector = Selector(("_define:"))
if txt.canPerformAction(selector, withSender: nil) {
txt.perform(selector, with: nil)
}
txt.removeFromSuperview()
}
customTextView.clearSelection()
}