2017-07-21 7 views
0

のメニュー項目の長押しジェスチャー、私は全体のアプリで、UILable上の長押し操作/ジェスチャーを処理する必要があり、それがカスタムメニューオプションを使用して、このようなメニューが表示されるはずです:UILabel - UIMenuController

enter image description here

リンゴのインターフェイスガイドラインに従って、テキストフィールド、テキストビュー、Webビュー、およびイメージビューでのみこのメニューを有効にできます。

UILabelでアプリケーション全体のアクションを追加し、独自のメニューオプションを既存のメニューオプションを追加して開くことは可能でしょうか?

+0

これを実現するためにカスタムを行う必要はありません –

+0

必ずしもそうではありません...私はあなたのコード例で答えに取り組んでいます。 –

+0

@DonovanKing私の助けのためにここにお会いしてうれしい – Krunal

答えて

4

ここではUILabelサブクラスで、長押しでUIMenuControllerを表示します。また、ユースケース用のメニューコントローラを追加することもできます。このことからお持ち帰りする

import UIKit 

class MenuLabel: UILabel { 

    override var canBecomeFirstResponder: Bool { 
     return true 
    } 

    // MARK: - Init 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

    private func commonInit() { 
     isUserInteractionEnabled = true 
     addGestureRecognizer(
      UILongPressGestureRecognizer(
       target: self, 
       action: #selector(handleLongPressed(_:)) 
      ) 
     ) 
    } 

    // MARK: - Actions 

    internal func handleLongPressed(_ gesture: UILongPressGestureRecognizer) { 
     guard let gestureView = gesture.view, let superView = gestureView.superview else { 
      return 
     } 

     let menuController = UIMenuController.shared 

     guard !menuController.isMenuVisible, gestureView.canBecomeFirstResponder else { 
      return 
     } 

     gestureView.becomeFirstResponder() 

     menuController.menuItems = [ 
      UIMenuItem(
       title: "Custom Item", 
       action: #selector(handleCustomAction(_:)) 
      ), 
      UIMenuItem(
       title: "Copy", 
       action: #selector(handleCopyAction(_:)) 
      ) 
     ] 

     menuController.setTargetRect(gestureView.frame, in: superView) 
     menuController.setMenuVisible(true, animated: true) 
    } 

    internal func handleCustomAction(_ controller: UIMenuController) { 
     print("Custom action!") 
    } 

    internal func handleCopyAction(_ controller: UIMenuController) { 
     UIPasteboard.general.string = text ?? "" 
    } 

} 

主なものは以下のとおりです。

  • はラベルが長押しハンドラでgestureView.becomeFirstResponder()を呼び出して、真
  • からcanBecomeFirstResponder
  • isUserInteractionEnabledセットが上書きされます確認して

このラベルをInterface Builderに追加することも、コードで作成することもできます。

希望すると便利です。

+0

ニース、私を試してみましょう – Krunal

+0

質問がある場合は教えてください。 – naturaln0va

+0

あなたの側からもう1つの賛成を探しています。私のlableテキストが「ラベルメニューを表示する」であり、ユーザがタップするスペルミクな単語にメニューを設定する場合。私は 'Show'という単語にメニューを表示し、UIPasteboardにのみその単語をコピーしたいと思います。 – Krunal