Можем ли мы включить копию меню Вставить Вырезать для
UILabel
, как это дляUITextField
?Show iPhone вырезать копию меню наклеивают на UILabelЕсли нет, и мне нужно преобразовать
UILabel
вUITextField
, как я могу включить меню вырезания скопированной копии и не разрешать изменение содержимого?
ответ
Override textFieldShouldBeginEditing
метода, UITextField
экземпляра, и установить его вернуть NO
, чтобы отключить редактирование.
Для получения более подробной информации ознакомьтесь с протоколом UITextFieldDelegate
.
Я получил меню копирования & паста работает на UILabel
, я просто должен был вернуться YES
для canBecomeFirstResponder
, а затем называют [label becomeFirstResponder]
, когда указанная метка должна была прийти на экране. Что касается возвращения YES
из canBecomeFirstResponder
, вы можете создать пользовательский подкласс или патч UILabel
используя категорию:
@implementation UILabel (Clipboard)
- (BOOL) canBecomeFirstResponder
{
return YES;
}
@end
Решение категории чувствует себя немного хака, но если вы знаете, что вы делаете это может быть проще, чем подклассы , Я также установил sample project on GitHub, который показывает, как отобразить простое меню картона на UILabel
.
Я добавил некоторые дополнительные функции для репо zoul. https://github.com/zhbrass/UILabel-Clipboard – zhbrass
sample project on github Из-за ответа @ zoul это путь. На момент написания этого проекта этот проект фактически ничего не помещал в буфер обмена (картон). вот как: реализация
Изменить @ Zoul по этому способу:
- (void) copy:(id)sender {
UIPasteboard *pboard = [UIPasteboard generalPasteboard];
pboard.string = self.text;
}
@benvolioT's github project очень хороший пример для копирования. И для пасты, настройте canPerformAction:withSender:
. Подробнее см. Пример CopyPasteTile.
Я раздвоенный образец проекта Zoul и добавлена поддержка ARC (и несколько других функций), если кто-то по-прежнему заинтересованы:
https://github.com/zhbrass/UILabel-Clipboard
CopyLabel.h/.м должно быть то, что вы ищу
Молодцы. Большое спасибо. –
Я сделал с открытым исходным кодом UILabel подкласс, который показывает UIMenuController с опцией «Copy» при длительном нажатии:
HTCopyableLabel на GitHub
Для 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 {
if action == #selector(UIResponderStandardEditActions.copy) {
return true
}
return false
}
}
В раскадровку просто подкласс UILabel
с CopyableLabel
класса
Это отлично работает для меня. Благодаря! –
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
}
}
Выход:
Любая удача с опцией номером 2? В настоящее время я пытаюсь подключить подкласс UILabel для поддержки очень простого пункта меню копирования, это не особенно прямой процесс. –