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

我知道如何为一个UIButton创建一个动作,但我怎么能模仿一个UIButton相同的行为,但使用一个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.
//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")
}

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

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

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

这是YouTube上的视频

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

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

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

需要添加懒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")
}