web-dev-qa-db-ja.com

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

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

UIButtonに対してアクションを作成する方法はわかっていますが、UIButtonと同じ動作を模倣することはできますが、UIImageViewを使用することはできますか?

160
user3706773

UITapGestureRecognizerが必要です。設定するにはこれを使います。

override func viewDidLoad()
{
    super.viewDidLoad()

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

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

    // Your action
}

(テキストなしで、単にIBActionを接続するよりも、UIButtonを使用してイメージを割り当てることもできます)

360
Aseider

ジェスチャーレコグナイザー(タップ用 UITapGestureRecognizer 、タップアンドホールド用 )を追加する必要があります。UILongPressGestureRecognizerUIImageViewへ。

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

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

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

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

この画像に示されているように、UIImageViewでユーザーインタラクションを有効にする必要もあります。 enter image description here

33
Emil

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")
    }
13
Abhishek Kumar

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またはUIImageViewサブクラスに追加したいときはいつでも、セレクタ用の関連する関数を作成することなくそれを実行できます。

使用法:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }
11
Ravindra Bhati

実際には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)

画像を読み込んでいることをユーザーに知らせる

8
Jojodmo

透明な背景のUIButtonUIImageViewの上に置き、ボタンをタップしてからイメージを読み込むことができます。

1
depsch ali

私はあなたのimageviewの上に見えない(opacity = 0)ボタンを配置して、そしてボタン上の相互作用を扱うことを勧めます。

0
levan

スイフト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
Sachin Rasane