我在 iOS 标签对象中有一个 URL 地址列表。用户似乎无法从列表中选择和复制项目并将其粘贴到 iOS 设备上的 Safari 浏览器中。有没有办法做到这一点?
问问题
3783 次
3 回答
7
中没有这个功能UILabel
。
您需要使用UITextField
或UITextView
。也不要忘记改变它的外观和使用
[... setEditable:NO];
于 2013-03-03T18:12:36.347 回答
7
实际上可以使用 UILabel,只是您必须进行一些子类化。
最终结果:当您的用户长按标签时,他或她将看到一个复制气球。
以下是允许制作标签可复制的步骤(我记得):
- 子类 UILabel
- 设置 userInteractionEnabled = YES
- 覆盖 canBecomeFirstResponder 并返回 true
- 添加一个 UILongPressGestureRecognizer
- 成为第一响应者并呈现 UIMenuController
斯威夫特 3:
let menu = UIMenuController.shared
if !menu.isMenuVisible {
self.becomeFirstResponder()
menu.setTargetRect(self.bounds, in: self)
menu.setMenuVisible(true, animated: true)
}
- 覆盖 canPerformAction 以允许复制
斯威夫特 3:
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return action == #selector(UIResponderStandardEditActions.copy(_:))
}
- 覆盖复制方法,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 回答