objective ios swift uiimageview

ios - objective - Cómo asignar una acción para el objeto UIImageView en Swift



uiimageview set image swift (9)

Estoy tratando de asignar un UIImageView a una acción cuando el usuario lo toca.

Sé cómo crear una acción para un UIButton , pero ¿cómo podría imitar el mismo comportamiento de un UIButton , pero usando un UIImageView ?


Swift 4 Code

Paso 1 en ViewdidLoad ()

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

Paso 2 Agregar la siguiente función

@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 }

Está probado y funciona correctamente


En realidad, podría configurar la imagen del UIButton a lo que normalmente pondría en un UIImageView . Por ejemplo, donde harías:

myImageView.image = myUIImage

En su lugar, podría usar:

myButton.setImage(myUIImage, forState: UIControlState.Normal)

Entonces, así es como se vería su código:

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 }

Lo mejor de usar este método es que si tiene que cargar la imagen desde una base de datos, puede establecer el título del botón antes de configurar la imagen:

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)

Para decirle a sus usuarios que está cargando la imagen


Necesitará un UITapGestureRecognizer . Para configurar use esto:

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 }

(También puede usar un UIButton y asignarle una imagen, sin texto y simplemente conectar una IBAction )


Para swift 2.0 y superior, haga esto

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


Puede agregar un UITapGestureRecognizer al imageView, simplemente arrastre uno a su Storyboard / xib, arrastre Ctrl y arrastre desde imageView al gestoReconocidor y Ctrl-arrastre desde el gestorReconocidor al archivo Swift para hacer una IBAction .

También deberá habilitar las interacciones del usuario en UIImageView , como se muestra en esta imagen:


Puede colocar un UIButton con un fondo transparente sobre la parte superior del UIImageView y escuchar un toque en el botón antes de cargar la imagen.


Sugiero colocar un botón invisible (opacidad = 0) en su vista de imagen y luego manejar la interacción en el botón.


UITapGestureRecognizer agregar un reconocimiento de gestos (para tocar use UITapGestureRecognizer , para tocar y sostener use UILongPressGestureRecognizer ) a su UIImageView .

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

E implementar el método selector como:

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


Código Swift4

Pruebe esto con algunos métodos de extensión nuevos:

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

Ahora, cuando queramos agregar un UITapGestureRecognizer a una subclase UIView o UIView como UIImageView , ¡podemos hacerlo sin crear funciones asociadas para los selectores!

Uso:

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