如何在Swift中为UIImageView对象分配动作


186

我正在尝试UIImageView在用户点击操作时将其分配给操作。

我知道如何为a创建动作UIButton,但是如何模仿a的相同行为UIButton却使用a UIImageView

Answers:


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:”)),两个参数之间需要逗号。
sysuser

3
如以下MidHun MP所述,请确保您具有userInteractionEnabled = true
Sheraz

2
在Swift 3.0中,action:Selector(“ imageTapped:”)的语法更改为action:#selector(imageTapped))
艾米莉

2
同样在Swift 3.0中,userInteractionEnabled属性已重命名为isUserInteractionEnabled
Doug Amos

2
使用Swift 4,这对我@objc有用,但是我必须在函数中添加修饰符。
马克·里昂斯

68

您需要在其中添加一个手势识别器(对于轻,请使用UITapGestureRecognizer;对于轻并按住,请使用UILongPressGestureRecognizerUIImageView

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

并实现选择器方法,例如:

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

13
userInteractionEnabled是关键。
kennydust

@hatim:您面临的问题是什么?如果您有新问题,请将其发布为新问题。
Midhun MP

@MidhunMP我正在动态生成图像视图,并完全完成了此答案中的内容,但未调用tappedMe()函数
hatim

1
它对我来说有以下更改:let tap = UITapGestureRecognizer(target:self,action:#selector(ViewController.tappedMe))//下一行-> successIndicatorImg.addGestureRecognizer(tap)//下一行-> successIndicatorImg.isUserInteractionEnabled =真实
Almir Campos

@hatim您是否对多个UI视图使用相同的手势?我刚刚解决了这个问题,因为我对多个视图使用相同的手势,而只有一个正在为我工​​作。当我创建多个手势时,它对我有用。
nadafafif

36

您可以将其添加UITapGestureRecognizer到imageView中,只需将其拖到Storyboard / xib中,将Ctrl从imageView拖动到gestureRecognizer,然后将Ctrl从gestureRecognizer拖动到Swift文件中即可IBAction

您还需要在上启用用户交互UIImageView,如下图所示: 在此处输入图片说明


4
UIImageView默认情况下不响应触摸。您还必须启用用户交互。
rmaddy 2015年

@rmaddy糟糕,是的。编辑。
Emil

1
我喜欢您可以使用IB进行设置的方法,拖放功能强大,并且没想到它是可能的。+1。作为菜鸟,很容易在不“绕过”故事板的情况下不知道它是如何连接的。这取决于您的偏好,但是我更喜欢“在代码中看到它”。
AngryITguy

13

对于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")
        }
    }

}

现在,每当我们想将添加UITapGestureRecognizerUIViewUIView子类一样UIImageView,我们可以这样做而无需选择创建相关的功能!

用法:

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

2
效果很好。到目前为止,它极大地简化了实施。
尼克N

使用的反射函数让我有些害怕-在将来的swift版本中有很大的机会使用它吗?
BananaAcid

1
这是非常优雅和有用的。为我工作
泰勒·麦克斯韦,

2
❤️我喜欢扩展程序
里卡多

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

需要为TapGestureRecognizer添加懒惰以便注册,
因为如果UITapGestureRecognizer(target:self ...)中的'self'不是惰性变量,则它将为nil。即使您将isUserInteractionEnable = true设置为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。
Gunhan

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

我建议将不可见(不透明度= 0)按钮放在imageview上,然后处理按钮上的交互。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.