2016-10-11 7 views

答えて

2

はい、あなたのUILabelに適用される長い押しジェスチャからUIMenuControllerを実装する必要があります。 NSHipsterにこれに関する素晴らしい記事がありますが、記事の要点は以下のとおりです。

UILabelのサブクラスを作成し、次のメソッドを実装します。

override func canBecomeFirstResponder() -> Bool { 
    return true 
} 

override func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool { 
    return (action == "copy:") 
} 

// MARK: - UIResponderStandardEditActions 

override func copy(sender: AnyObject?) { 
    UIPasteboard.generalPasteboard().string = text 
} 

は、その後、あなたのビューコントローラでは、あなたのラベルを長押しジェスチャーを追加することができます。

let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: "handleLongPressGesture:") 
label.addGestureRecognizer(gestureRecognizer) 

と長いハンドルこの方法でプレスしてください:

func handleLongPressGesture(recognizer: UIGestureRecognizer) { 
    if let recognizerView = recognizer.view, 
     recognizerSuperView = recognizerView.superview 
    { 
     let menuController = UIMenuController.sharedMenuController() 
     menuController.setTargetRect(recognizerView.frame, inView: recognizerSuperView) 
     menuController.setMenuVisible(true, animated:true) 
     recognizerView.becomeFirstResponder() 
    }} 

注:このコードはt彼NSHipsterの記事、私はそれをSOの準拠のためにここに含めています。

+1

また、ラベルのユーザー操作を有効にする必要があります。それがなければ、ジェスチャーは決して認識されません。また、handleLongPressGestureメソッドでジェスチャの状態を確認することも重要です。そのNSHipsterの記事は、適切にそれをしないことによってひどい仕事をしています。 – rmaddy

+0

も同様です:) http://stephenradford.me/make-uilabel-copyable/ – user2636197

0

UILabelはUIViewを継承しているため、長いジェスチャ認識機能をラベルに追加するだけです。 isUserInteractionEnabledをtrueに変更する必要があることに注意してください。これは、ラベルがデフォルトでfalseになっているためです。

import UIKit 

    class ViewController: UIViewController { 
     let label = UILabel() 

     override func viewDidLoad() { 
      view.addSubview(label) 
      label.text = "hello" 
      label.translatesAutoresizingMaskIntoConstraints = false 
      label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
      label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 
      let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(longPressLabel(longPressGestureRecognizer:))) 
      label.addGestureRecognizer(longPressGestureRecognizer) 
      label.isUserInteractionEnabled = true 
     } 

     @objc private func longPressLabel (longPressGestureRecognizer: UILongPressGestureRecognizer) { 
      if longPressGestureRecognizer.state == .began { 
       print("long press began") 
      } else if longPressGestureRecognizer.state == .ended { 
       print("long press ended") 
      } 

     } 

    } 
+0

http://stephenradford.me/make-uilabel-copyable/ :) – user2636197

-1

私は必要なすべての機能を提供しUILabelサブクラスを実装しました。インターフェイスビルダーでこれを使用している場合は、initメソッドを調整する必要があります。

/// A label that can be copied. 
class CopyableLabel: UILabel 
{ 
    // MARK: - Initialisation 

    /// Creates a new label. 
    init() 
    { 
     super.init(frame: .zero) 

     let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPressGesture(_:))) 
     self.addGestureRecognizer(gestureRecognizer) 

     self.isUserInteractionEnabled = true 
    } 

    required init?(coder aDecoder: NSCoder) 
    { 
     fatalError("init(coder:) has not been implemented") 
    } 

    // MARK: - Responder chain 

    override var canBecomeFirstResponder: Bool 
    { 
     return true 
    } 

    // MARK: - Actions 

    /// Method called when a long press is triggered. 
    func handleLongPressGesture(_ gestuerRecognizer: UILongPressGestureRecognizer) 
    { 
     guard let superview = self.superview else { return } 

     let menuController = UIMenuController.shared 
     menuController.setTargetRect(self.frame, in: superview) 
     menuController.setMenuVisible(true, animated:true) 
     self.becomeFirstResponder() 
    } 

    override func copy(_ sender: Any?) 
    { 
     UIPasteboard.general.string = self.text 
    } 
} 
関連する問題