2009-08-07 25 views
30
  1. Chúng tôi có thể bật menu dán bản sao cắt cho UILabel vì nó dành cho UITextField không?Hiển thị trình đơn dán cắt dán iPhone trên UILabel

  2. Nếu không, và tôi cần chuyển đổi UILabel thành UITextField, làm cách nào tôi có thể bật menu dán bản sao cắt và không cho phép sửa đổi nội dung?

+0

Bất kỳ may mắn với lựa chọn số 2? Tôi hiện đang cố gắng để dây một lớp con UILabel để hỗ trợ một tùy chọn menu bản sao rất đơn giản, nó không phải là một quá trình đặc biệt thẳng về phía trước. –

Trả lời

3

Override phương pháp UITextField dụ của textFieldShouldBeginEditing, và đặt nó trở lại NO để vô hiệu hóa chỉnh sửa.

Hãy xem giao thức UITextFieldDelegate để biết thêm chi tiết.

+0

Vấn đề là: sao chép và dán sẽ không hoạt động nếu bạn vô hiệu hóa chỉnh sửa. – mrueg

+0

Sao chép công trình, dán không hoạt động. – Mugunth

+0

hi Muguth, tôi đã thử điều này. Nó không hoạt động. –

39

tôi có bản sao & dán đơn làm việc trên một UILabel, tôi chỉ phải trả YES cho canBecomeFirstResponder và sau đó gọi [label becomeFirstResponder] khi nhãn nói là đến trên màn hình. Đối với trở YES từ canBecomeFirstResponder, bạn có thể tạo một lớp con tùy chỉnh hoặc vá UILabel sử dụng một thể loại:

@implementation UILabel (Clipboard) 

- (BOOL) canBecomeFirstResponder 
{ 
    return YES; 
} 

@end 

Giải pháp loại cảm thấy một chút hackish, nhưng nếu bạn biết những gì bạn đang làm nó có thể được dễ dàng hơn so với subclassing . Tôi cũng đã đưa ra một sample project on GitHub cho thấy cách hiển thị một menu bảng đơn giản trên UILabel.

+1

Tôi đã thêm một số chức năng bổ sung vào repo của zoul. https://github.com/zhbrass/UILabel-Clipboard – zhbrass

24

sample project on github do câu trả lời của @ zoul là cách để thực hiện. Tại thời điểm viết bài này, dự án đó không thực sự đưa bất cứ thứ gì vào clipboard (bảng tạm). đây là cách: thực hiện

Thay đổi @ zoul của phương pháp này để:

- (void) copy:(id)sender { 
    UIPasteboard *pboard = [UIPasteboard generalPasteboard]; 
    pboard.string = self.text; 
} 
4

Tôi đã chia hai dự án mẫu zoul và thêm hỗ trợ cho ARC (và một vài tính năng khác) nếu có ai vẫn còn quan tâm:

https://github.com/zhbrass/UILabel-Clipboard

CopyLabel.h/.m nên những gì bạn đang tìm kiếm

+1

Thực hiện tốt. Cảm ơn nhiều. –

5

tôi đã thực hiện một mã nguồn mở UILabel lớp cho thấy một UIMenuController với một "copy" tùy chọn khi bấm dài:

HTCopyableLabel trên GitHub

9

Đối Swift 3 và Swift 4 bạn phải thực hiện lớp này:

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 
    } 
} 

Trong kịch bản của bạn chỉ cần phân lớp các UILabel với CopyableLabel lớp

+1

Điều này làm việc hoàn hảo cho tôi. Cảm ơn! –

0

Swift 4 ☻ Xcode 9.2 Bằng cách sử dụng UIMenuController chúng ta có thể làm đi.

Tôi đã tạo ra IBDesignable Tuỳ chỉnh UILabel lớp mà bạn có thể gán vào storyboard trực tiếp

@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 
    } 
} 

Output:

enter image description here

Các vấn đề liên quan