SwiftでUIImageViewオブジェクトにアクションを割り当てる方法


186

UIImageViewユーザーがタップしたときにアクションにを割り当てようとしています。

私はのためのアクションを作成する方法を知っているUIButtonが、どのように私は、同じ動作を模倣できUIButtonますが、使用してUIImageView

回答:


421

必要になりUITapGestureRecognizerます。設定するにはこれを使用します:

override func viewDidLoad()
{
    super.viewDidLoad()

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    imageView.isUserInteractionEnabled = true
    imageView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let tappedImage = tapGestureRecognizer.view as! UIImageView

    // Your action
}

(また、使用することができUIButton、テキストなしで、そこに画像を割り当て、単により接続しますIBAction


3
Nitpick:var tgr = UITapGestureRecognizer(target:self action:Selector( "imageTapped:"))、2つのパラメーターの間にカンマが必要です。
sysuser 2015年

3
MidHun MPが以下に述べるように、userInteractionEnabled = true
Sheraz

2
Swift 3.0では、action:Selector( "imageTapped:")の構文がaction:#selector(imageTapped))に変更されました
emily

2
また、Swift 3.0では、userInteractionEnabledプロパティの名前がisUserInteractionEnabledに変更されました
Doug Amos

2
Swift 4を使用するとうまくいきました@objcが、関数に修飾子を追加する必要がありました。
マークライオンズ

68

ジェスチャレコグナイザ(タップの場合はUITapGestureRecognizerを、タップアンドホールドの場合はUILongPressGestureRecognizerを使用)をに追加する必要がありますUIImageView

let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true

そして、セレクターメソッドを次のように実装します:

@objc func tappedMe()
{
    println("Tapped on Image")
}

13
userInteractionEnabledがキーです。
ケニーダスト、2015

@hatim:あなたが直面している問題は何ですか?新しい問題がある場合は、新しい質問として投稿してください。
Midhun MP 2016年

@MidhunMP画像ビューを動的に生成していて、この回答に書かれているとおりに実行しましたが、tappedMe()関数が呼び出されません
Hatim

1
それは私のために次の変更を加えてうまくいきました:let tap = UITapGestureRecognizer(target:self、action:#selector(ViewController.tappedMe))//次の行-> successIndicatorImg.addGestureRecognizer(tap)//次の行-> successIndicatorImg.isUserInteractionEnabled = true
Almir Campos

@hatimは、同じジェスチャーを複数のUIビューに使用していますか?同じジェスチャーを複数のビューに使用していて、1つだけが私のために働いていたので、この問題を解決しました。複数のジェスチャーを作成するとうまくいきました。
nadafafif

36

UITapGestureRecognizerimageViewに追加し、1つをStoryboard / xibにドラッグし、Ctrlキーを押しながらimageViewからGestureRecognizerに、Ctrlキーを押しながらGestureRecognizerからSwiftファイルにドラッグして、を作成できIBActionます。

UIImageViewこの画像に示すように、でのユーザー操作を有効にする必要もあります。 ここに画像の説明を入力してください


4
UIImageViewデフォルトではタッチに応答しません。また、ユーザー操作を有効にする必要があります。
rmaddy 2015年

@rmaddyおっと、それは本当です。編集。
Emil

1
IBを使用してこれを設定する方法が好きです。ドラッグ/ドロップは強力で、それが可能であるとは思っていませんでした。+1。初心者として、ストーリーボードを「マウスで回して」いないと、それがどのように接続されているのかを簡単に知ることはできません。それはあなたの好み次第ですが、私は「コードで見る」ことを好みます。
angryITguy

14

Swift 2.0以降では、これを行います

@IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
        imageView.addGestureRecognizer(tap)
        imageView.userInteractionEnabled = true
    }
    func tappedMe()
    {
        print("Tapped on Image")
    }

userInteractionEnabledの名前がisUserInteractionEnabledに変更されました
Chaim Friedman

11

Swift4コード

これをいくつかの新しい拡張メソッドで試してください:

import UIKit

extension UIView {

    fileprivate struct AssociatedObjectKeys {
        static var tapGestureRecognizer = "MediaViewerAssociatedObjectKey_mediaViewer"
    }

    fileprivate typealias Action = (() -> Void)?


    fileprivate var tapGestureRecognizerAction: Action? {
        set {
            if let newValue = newValue {
                // Computed properties get stored as associated objects
                objc_setAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            }
        }
        get {
            let tapGestureRecognizerActionInstance = objc_getAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer) as? Action
            return tapGestureRecognizerActionInstance
        }
    }


    public func addTapGestureRecognizer(action: (() -> Void)?) {
        self.isUserInteractionEnabled = true
        self.tapGestureRecognizerAction = action
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        self.addGestureRecognizer(tapGestureRecognizer)
    }


    @objc fileprivate func handleTapGesture(sender: UITapGestureRecognizer) {
        if let action = self.tapGestureRecognizerAction {
            action?()
        } else {
            print("no action")
        }
    }

}

これでUITapGestureRecognizerUIViewまたはのUIViewようなサブクラスにa を追加したいときはいつでもUIImageView、セレクターに関連する関数を作成せずに追加できます!

使用法:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }

2
よく働く。そしてそれははるかに実装を非常に単純化しました。
Nick N

使用されているリフレクション関数を少し怖がらせます-これが将来の迅速なバージョンで機能する可能性はありますか?
BananaAcid

1
これは非常にエレガントで便利です。私のために働く
Taylor Maxwell

2
extensions️Ilove extensions
Ricardo

8

実際には、のイメージを、UIButton通常に配置するものに設定できますUIImageView。たとえば、次のようにします。

myImageView.image = myUIImage

代わりに以下を使用できます。

myButton.setImage(myUIImage, forState: UIControlState.Normal)

したがって、コードは次のようになります。

override func viewDidLoad(){
  super.viewDidLoad()

  var myUIImage: UIImage //set the UIImage here
  myButton.setImage(myUIImage, forState: UIControlState.Normal)
}

@IBOutlet var myButton: UIButton!
@IBAction func buttonTap(sender: UIButton!){
  //handle the image tap
}

このメソッドを使用する優れた点は、データベースから画像をロードする必要がある場合、画像を設定する前にボタンのタイトルを設定できることです。

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)

画像を読み込んでいることをユーザーに伝えるには


2


UITapGestureRecognizer(target:self ...)の 'self'がレイジー変数でない場合はnilになるため、TapGestureRecognizerを登録するためにレイジーを追加する必要があります。isUserInteractionEnable = trueを設定しても、遅延varなしでは登録されません。

lazy var imageSelector : UIImageView = {
    let image = UIImageView(image: "imageName.png")
    //now add tap gesture
    image.isUserInteractionEnabled = true
    image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
    return image
}()
@objc private func handleImageSelector() {
    print("Pressed image selector")
}

1

UIButton背景が透明なをの上に配置しUIImageView、画像をロードする前にボタンのタップを聞くことができます


1
オプションを説明するその迅速な方法。誰もが知っていると思いました!
depsch ali 2015

3
実際の理由なしに不要なUIコンポーネントを追加することはお勧めできません。UIの複雑さが増し、同じ自動レイアウト制約に対処する必要があります。TapGestureRecognizerを追加することをお勧めします。
ガンハン2017

1

Swift 4コード


ステップ1 ViewdidLoad()

   let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
       userImageView.addGestureRecognizer(pictureTap)
       userImageView.isUserInteractionEnabled = true

手順2次の関数を追加する

@objc func imageTapped() {

        let imageView = userImageView
        let newImageView = UIImageView(image: imageView?.image)
        newImageView.frame = UIScreen.main.bounds
        newImageView.backgroundColor = UIColor.black
        newImageView.contentMode = .scaleAspectFit
        newImageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
        newImageView.addGestureRecognizer(tap)
        self.view.addSubview(newImageView)

        self.navigationController?.isNavigationBarHidden = true
        self.tabBarController?.tabBar.isHidden = true

    }

テストされ、適切に機能している


0

私は置くことをお勧め見えないあなたのImageViewの上(不透明度= 0)ボタンをし、ボタン上の相互作用を扱います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.