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

use*_*773 175 uiimageview ios swift

UIImageView当用户点击它时,我正在尝试分配一个动作.

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

Ase*_*der 388

你需要一个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
}
Run Code Online (Sandbox Code Playgroud)

(您也可以使用UIButton并为其分配图像,没有文本,只需连接IBAction)

  • Nitpick:var tgr = UITapGestureRecognizer(target:self action:Selector("imageTapped:")),两个参数之间需要逗号. (3认同)
  • 如下Midhun MP所述,请确保您拥有userInteractionEnabled = true (3认同)
  • 在Swift 3.0中,action的语法:Selector("imageTapped:")更改为action:#selector(imageTapped)) (2认同)
  • 同样在Swift 3.0中,userInteractionEnabled属性已重命名为isUserInteractionEnabled (2认同)
  • 使用Swift 4,这对我有用,但是我必须在函数中添加一个@objc修饰符。 (2认同)

Mid*_* MP 63

您需要添加一个手势识别器(用于点击使用UITapGestureRecognizer,用于点击并按住使用UILongPressGestureRecognizer)UIImageView.

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

并实现选择器方法,如:

@objc func tappedMe()
{
    println("Tapped on Image")
}
Run Code Online (Sandbox Code Playgroud)

  • userInteractionEnabled是关键. (13认同)
  • @hatim 您是否对多个 UI 视图使用相同的手势?我刚刚解决了这个问题,因为我对多个视图使用相同的手势,但只有一个对我有用。当我创建多个手势时,它对我有用。 (2认同)

Emi*_*mil 34

你可以添加一个UITapGestureRecognizer到imageView,只需将一个拖到Storyboard/xib中,按住Ctrl键从imageView拖动到gestureRecognizer,然后按Ctrl-拖动从gestureRecognizer到Swift文件来制作一个IBAction.

您还需要在其上启用用户交互UIImageView,如下图所示: 在此输入图像描述

  • 默认情况下,`UIImageView`不响应触摸.您还必须启用用户交互. (4认同)
  • 我喜欢如何使用 IB 进行设置,拖放功能非常强大,没想到这是可能的。为此+1。作为一个菜鸟,如果不“在故事板周围徘徊”,很容易不知道它是如何连接的。这取决于您的偏好,但我更喜欢“在代码中查看它”。 (2认同)

Abh*_*mar 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")
    }
Run Code Online (Sandbox Code Playgroud)


Rav*_*ati 9

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

}
Run Code Online (Sandbox Code Playgroud)

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

用法:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }
Run Code Online (Sandbox Code Playgroud)

  • 效果很好。到目前为止,它极大地简化了实现。 (2认同)
  • ❤️我喜欢扩展 (2认同)

Joj*_*dmo 8

实际上,您可以将图像设置为UIButton通常放入的图像UIImageView.例如,你会做什么:

myImageView.image = myUIImage
Run Code Online (Sandbox Code Playgroud)

你可以改用:

myButton.setImage(myUIImage, forState: UIControlState.Normal)
Run Code Online (Sandbox Code Playgroud)

那么,这就是你的代码的样子:

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
}
Run Code Online (Sandbox Code Playgroud)

使用此方法的好处是,如果必须从数据库加载图像,可以在设置图像之前设置按钮的标题:

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)
Run Code Online (Sandbox Code Playgroud)

告诉您的用户您正在加载图片


can*_*ine 7

需要为 TapGestureRecognizer 添加惰性注册
,因为 UITapGestureRecognizer(target: self ...) 中的“self”如果不是惰性变量,则将为 nil。即使您设置 isUserInteractionEnable = true,如果没有惰性变量,它也不会注册。

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")
}
Run Code Online (Sandbox Code Playgroud)