【问题标题】:Make UiTextField accept only paste option - Swift使 UiTextField 只接受粘贴选项 - Swift
【发布时间】:2021-02-26 18:03:57
【问题描述】:

我想让 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
    }
}

【问题讨论】:

  • 也许只用一个按钮代替...read这个值,然后把按钮的标题改成字符串

标签: ios swift uitextfield


【解决方案1】:

您可以通过使用长按手势识别器创建 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多