要在弹出窗口中显示UITextView所选的文本,并在选择抓取手柄中捕获选择的文本,可以使用UIMenuController和UITextInputTraits协议来实现。下面是一个示例代码:
首先,创建一个UIViewController并将UITextView添加到其视图中:
import UIKit
class ViewController: UIViewController {
let textView = UITextView(frame: CGRect(x: 50, y: 100, width: 200, height: 200))
override func viewDidLoad() {
super.viewDidLoad()
textView.backgroundColor = .lightGray
view.addSubview(textView)
textView.isSelectable = true // 允许选择文本
textView.inputView = UIView() // 禁用默认的键盘弹出
textView.inputAccessoryView = UIView() // 禁用默认的文本输入辅助视图
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(showMenu(_:)))
textView.addGestureRecognizer(longPressGesture)
}
@objc func showMenu(_ gestureRecognizer: UIGestureRecognizer) {
if gestureRecognizer.state == .began {
let menuController = UIMenuController.shared
// 获取选择的文本
guard let selectedTextRange = textView.selectedTextRange,
let selectedText = textView.text(in: selectedTextRange) else {
return
}
// 设置菜单控制器的显示位置
let caretRect = textView.caretRect(for: selectedTextRange.end)
let menuRect = CGRect(x: caretRect.midX, y: caretRect.midY, width: 0, height: 0)
menuController.setTargetRect(menuRect, in: textView)
// 设置菜单项
let copyItem = UIMenuItem(title: "复制", action: #selector(copyText(_:)))
menuController.menuItems = [copyItem]
// 显示菜单控制器
menuController.setMenuVisible(true, animated: true)
}
}
@objc func copyText(_ sender: UIMenuController) {
if let selectedText = textView.text(in: textView.selectedTextRange) {
UIPasteboard.general.string = selectedText
}
}
}
在上面的例子中,我们首先创建了一个UITextView并设置其属性以允许选择文本。然后,我们使用UILongPressGestureRecognizer添加了一个长按手势识别器,用于触发弹出窗口的显示。在showMenu方法中,我们获取选择的文本并设置UIMenuController的显示位置和菜单项。最后,我们定义了一个copyText方法来处理用户点击菜单项时的操作,这里我们将选择的文本复制到剪贴板中。
请注意,这个示例中只添加了一个复制菜单项,您可以根据自己的需求添加其他菜单项,并在对应的处理方法中执行相应的操作。