问题描述
我想让一个 UiTextField 在长按时只接受粘贴选项,而不像 iOS 手机应用程序中那样显示键盘和光标。
你能帮我吗?
@IBOutlet weak var phoneNumberTf:UITextField? {
didSet {
phoneNumberTf?.backgroundColor = .clear
phoneNumberTf?.textAlignment = .left
phoneNumberTf?.font = UIFont().font_regular(ofSize: 38)
phoneNumberTf?.delegate = self
}
}
extension KeypadView: UITextFieldDelegate {
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return false
}
}
解决方法
您可以通过使用长按手势识别器创建 UILabel 子类并设置 UIMenuController 来实现此目的。
class MenuLabel: UILabel {
override var canBecomeFirstResponder: Bool {
return true
}
// MARK: - Init
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
isUserInteractionEnabled = true
addGestureRecognizer(
UILongPressGestureRecognizer(
target: self,action: #selector(handleLongPressed(_:))
)
)
}
// MARK: - Actions
@objc internal func handleLongPressed(_ gesture: UILongPressGestureRecognizer) {
guard let gestureView = gesture.view,let superView = gestureView.superview else {
return
}
let menuController = UIMenuController.shared
guard !menuController.isMenuVisible,gestureView.canBecomeFirstResponder else {
return
}
gestureView.becomeFirstResponder()
menuController.menuItems = [
UIMenuItem(
title: "Paste",action: #selector(handlePasteAction(_:))
),]
menuController.showMenu(from: superView,rect: gestureView.frame)
}
@objc internal func handlePasteAction(_ controller: UIMenuController) {
self.text = UIPasteboard.general.string
}
}
长按时,UIMenuController 将显示一个粘贴选项,然后将 UILabel 的文本值设置为 UIPasteboard.general.string
。