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