45 iphone cocoa-touch ios swift
我们可以启用一个剪切复制粘贴菜单UILabel,因为它是一个UITextField?
如果没有,我需要转换UILabel为UITextField,我如何启用剪切复制粘贴菜单,不允许修改内容?
zou*_*oul 40
我得到了复制和粘贴菜单UILabel,我只需要返回YES,canBecomeFirstResponder然后[label becomeFirstResponder]在屏幕上显示所述标签时再打电话.至于回国YES的canBecomeFirstResponder,您可以创建自定义的子类或修补UILabel使用类别:
@implementation UILabel (Clipboard)
- (BOOL) canBecomeFirstResponder
{
return YES;
}
@end
Run Code Online (Sandbox Code Playgroud)
类别解决方案感觉有点hackish,但如果你知道你正在做什么,它可能比继承更容易.我还在GitHub上展示了一个示例项目,该项目展示了如何在一个简单的粘贴板菜单上显示UILabel.
pab*_*ros 31
对于Swift 3和Swift 4,您必须实现此类:
import UIKit
class CopyableLabel: UILabel {
override init(frame: CGRect) {
super.init(frame: frame)
self.sharedInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.sharedInit()
}
func sharedInit() {
self.isUserInteractionEnabled = true
self.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(self.showMenu)))
}
@objc func showMenu(sender: AnyObject?) {
self.becomeFirstResponder()
let menu = UIMenuController.shared
if !menu.isMenuVisible {
menu.setTargetRect(bounds, in: self)
menu.setMenuVisible(true, animated: true)
}
}
override func copy(_ sender: Any?) {
let board = UIPasteboard.general
board.string = text
let menu = UIMenuController.shared
menu.setMenuVisible(false, animated: true)
}
override var canBecomeFirstResponder: Bool {
return true
}
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return action == #selector(UIResponderStandardEditActions.copy)
}
}
Run Code Online (Sandbox Code Playgroud)
在你的故事板刚子类UILabel与CopyableLabel类
ben*_*ioT 25
由于@ zoul的回答,github上的示例项目是要走的路.在撰写本文时,该项目实际上并未在剪贴板(粘贴板)上放置任何内容.这是如何:
将@ zoul的此方法实现更改为:
- (void) copy:(id)sender {
UIPasteboard *pboard = [UIPasteboard generalPasteboard];
pboard.string = self.text;
}
Run Code Online (Sandbox Code Playgroud)
Jac*_*ack 11
Swift 4☻Xcode 9.2.通过使用UIMenuController我们可以做到.
我创建了IBDesignable自定义UILabel类,您可以直接在故事板上分配
@IBDesignable
class TapAndCopyLabel: UILabel {
override func awakeFromNib() {
super.awakeFromNib()
//1.Here i am Adding UILongPressGestureRecognizer by which copy popup will Appears
let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPressGesture(_:)))
self.addGestureRecognizer(gestureRecognizer)
self.isUserInteractionEnabled = true
}
// MARK: - UIGestureRecognizer
@objc func handleLongPressGesture(_ recognizer: UIGestureRecognizer) {
guard recognizer.state == .recognized else { return }
if let recognizerView = recognizer.view,
let recognizerSuperView = recognizerView.superview, recognizerView.becomeFirstResponder()
{
let menuController = UIMenuController.shared
menuController.setTargetRect(recognizerView.frame, in: recognizerSuperView)
menuController.setMenuVisible(true, animated:true)
}
}
//2.Returns a Boolean value indicating whether this object can become the first responder
override var canBecomeFirstResponder: Bool {
return true
}
//3.Here we are enabling copy action
override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
return (action == #selector(UIResponderStandardEditActions.copy(_:)))
}
// MARK: - UIResponderStandardEditActions
override func copy(_ sender: Any?) {
//4.copy current Text to the paste board
UIPasteboard.general.string = text
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
如果有人仍然感兴趣的话,我已经分享了zoul的示例项目并增加了对ARC(以及其他一些功能)的支持:
https://github.com/zhbrass/UILabel-Clipboard
CopyLabel.h/.m应该是您正在寻找的
重写UITextField实例的textFieldShouldBeginEditing方法,并将其设置为 returnNO以禁用编辑。
查看UITextFieldDelegate协议以了解更多详细信息。
| 归档时间: |
|
| 查看次数: |
26253 次 |
| 最近记录: |