我试着在用户点击的时候分配一个UIImageView给一个动作。

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


你需要添加一个手势识别器(对于点击使用UITapGestureRecognizer,对于点击和按住使用UILongPressGestureRecognizer)到你的UIImageView。

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

并像这样实现selector方法:

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

你需要一个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)


你可以设置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)

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


你可以添加一个UITapGestureRecognizer到imageView中,只需将一个拖到你的Storyboard/xib中,从imageView中按住ctrl拖动到gestureRecognizer中,再从gestureRecognizer中按住ctrl拖动到swift文件中,即可生成IBAction。

你还需要在UIImageView上启用用户交互,如下图所示:


你可以在UIImageView上面放一个带有透明背景的UIButton,并在加载图像之前监听按钮上的点击


斯威夫特这样做:

@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.isUserInteractionEnabled = true
}

func tappedMe() {
    print("Tapped on Image")
}

Swift 4代码


步骤1在ViewdidLoad()中

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

步骤2添加“Following”功能

@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

    }

它已经过测试,工作正常


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

}

现在,无论何时我们想要添加一个UITapGestureRecognizer到一个UIView或UIView的子类,如UIImageView,我们可以这样做,而不需要为选择器创建相关的函数!

用法:

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

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


需要添加懒TapGestureRecognizer注册 因为“self”在UITapGestureRecognizer(目标: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")
}

这是我发现的,更容易设置。

这是YouTube上的视频

打开库,寻找“Tap Gesture Recognizer”对象。 将对象拖到故事板中,并将委托设置为您想要触发动作的图像。 然后转到视图控制器,拖动相同的对象设置IBAction。


@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
//ViewController is your current view controller    
let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
    imageView.addGestureRecognizer(tap)
    imageView.isUserInteractionEnabled = true
}

// Need to ass objective-c annotation 
@objc
func tappedMe() {
    print("Tapped on Image")
}