5

我在 iOS 标签对象中有一个 URL 地址列表。用户似乎无法从列表中选择和复制项目并将其粘贴到 iOS 设备上的 Safari 浏览器中。有没有办法做到这一点?

4

3 回答 3

7

中没有这个功能UILabel

您需要使用UITextFieldUITextView。也不要忘记改变它的外观和使用

[... setEditable:NO];
于 2013-03-03T18:12:36.347 回答
7

实际上可以使用 UILabel,只是您必须进行一些子类化。

最终结果:当您的用户长按标签时,他或她将看到一个复制气球。

在 iOS 上长按标签后显示复制气球的图片

以下是允许制作标签可复制的步骤(我记得):

  1. 子类 UILabel
  2. 设置 userInteractionEnabled = YES
  3. 覆盖 canBecomeFirstResponder 并返回 true
  4. 添加一个 UILongPressGestureRecognizer
  5. 成为第一响应者并呈现 UIMenuController

斯威夫特 3:

let menu = UIMenuController.shared
if !menu.isMenuVisible {
    self.becomeFirstResponder()
    menu.setTargetRect(self.bounds, in: self)
    menu.setMenuVisible(true, animated: true)
}
  1. 覆盖 canPerformAction 以允许复制

斯威夫特 3:

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return action == #selector(UIResponderStandardEditActions.copy(_:))
}
  1. 覆盖复制方法,UIPasteboard 文本 & 隐藏 UIMenuController

斯威夫特 3:

        let menu = UIMenuController.shared          
        let labelText = self.text ?? self.attributedText?.string
        if let uLabelText = labelText {
            let clipBoard = UIPasteboard.general
            clipBoard.string = uText
        }

        menu.setMenuVisible(false, animated: true)
于 2016-10-05T12:40:25.413 回答
0

这是 JoriDor 解决方案的 swift 5 版本;

class CopyableLabel: UILabel {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        sharedInit()
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        sharedInit()
    }
    
    func sharedInit() {
        isUserInteractionEnabled = true
        addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(showMenu(sender:))))
    }
    
    @objc
    func showMenu(sender: AnyObject?) {
        becomeFirstResponder()
        let menu = UIMenuController.shared
        if !menu.isMenuVisible {
            menu.setTargetRect(bounds, in: self)
            menu.setMenuVisible(true, animated: true)
        }
    }
    
    override var canBecomeFirstResponder: Bool {
        return true
    }
    
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        if action == #selector(UIResponderStandardEditActions.copy(_:)) {
            return true
        }
        return false
    }
    
    override func copy(_ sender: Any?) {
        let board = UIPasteboard.general
        board.string = text
        let menu = UIMenuController.shared
        menu.setMenuVisible(false, animated: true)
    }
    
}
于 2020-10-01T11:21:24.000 回答