UILabel是否具有使其可选的任何值?

use*_*197 2 uilabel ios swift

是否UILabel可以设置任何值以使其可选?

我有一个想要选择的标签(长按,显示btn副本)有点像Safari。

Chr*_*ute 9

独立解决方案 (Swift 5)

您可以调整来自@BJHSolutions 和 NSHipster 的解决方案,使以下自包含SelectableLabel

import UIKit

/// Label that allows selection with long-press gesture, e.g. for copy-paste.
class SelectableLabel: UILabel {
    
    override func awakeFromNib() {
        super.awakeFromNib()

        isUserInteractionEnabled = true
        addGestureRecognizer(
            UILongPressGestureRecognizer(
                target: self,
                action: #selector(handleLongPress(_:))
            )
        )
    }

    override var canBecomeFirstResponder: Bool {
        return true
    }
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return action == #selector(copy(_:))
    }

    // MARK: - UIResponderStandardEditActions
    
    override func copy(_ sender: Any?) {
        UIPasteboard.general.string = text
    }
    
    // MARK: - Long-press Handler
    
    @objc func handleLongPress(_ recognizer: UIGestureRecognizer) {
        if recognizer.state == .began,
            let recognizerView = recognizer.view,
            let recognizerSuperview = recognizerView.superview {
            recognizerView.becomeFirstResponder()
            UIMenuController.shared.setTargetRect(recognizerView.frame, in: recognizerSuperview)
            UIMenuController.shared.setMenuVisible(true, animated:true)
        }
    }
    
}
Run Code Online (Sandbox Code Playgroud)


BJH*_*ios 5

是的,您需要通过长按手势将UIMenuController应用于UILabel。NSHipster上有一篇关于此的出色文章,但本文的要点如下。

创建UILabel的子类并实现以下方法:

override func canBecomeFirstResponder() -> Bool {
    return true
}

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
    return (action == "copy:")
}

// MARK: - UIResponderStandardEditActions

override func copy(sender: AnyObject?) {
    UIPasteboard.generalPasteboard().string = text
}
Run Code Online (Sandbox Code Playgroud)

然后,在视图控制器中,您可以向标签添加长按手势:

let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:")
label.addGestureRecognizer(gestureRecognizer)
Run Code Online (Sandbox Code Playgroud)

并使用此方法处理长按:

func handleLongPressGesture(recognizer: UIGestureRecognizer) {
     if let recognizerView = recognizer.view,
         recognizerSuperView = recognizerView.superview
     {
         let menuController = UIMenuController.sharedMenuController()
         menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView)
         menuController.setMenuVisible(true, animated:true)
         recognizerView.becomeFirstResponder()
     }}
Run Code Online (Sandbox Code Playgroud)

注意:此代码直接取自NSHipster文章,此处仅出于SO法规遵从性而包含此代码。

  • 您还需要在标签上启用用户交互。否则,手势将永远无法识别。而且,在`handleLongPressGesture`方法中检查手势的状态也很重要。那篇NSHipster文章做得不好,做得很糟糕。 (2认同)