Sto cercando di assegnare UIImageView
un'azione a quando l'utente la tocca.
So come creare un'azione per a UIButton
, ma come potrei imitare lo stesso comportamento di a UIButton
, ma usando a UIImageView
?
Sto cercando di assegnare UIImageView
un'azione a quando l'utente la tocca.
So come creare un'azione per a UIButton
, ma come potrei imitare lo stesso comportamento di a UIButton
, ma usando a UIImageView
?
Risposte:
Avrai bisogno di un UITapGestureRecognizer
. Per impostare usa questo:
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
}
(Potresti anche usare a UIButton
e assegnare un'immagine ad essa, senza testo e che semplicemente collegare un IBAction
)
@objc
modificatore alla funzione.
Devi aggiungere un riconoscimento gesti (per toccare usa UITapGestureRecognizer , per toccare e tieni premuto usa UILongPressGestureRecognizer ) al tuo UIImageView
.
let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
E implementa il metodo di selezione come:
@objc func tappedMe()
{
println("Tapped on Image")
}
Puoi aggiungere a UITapGestureRecognizer
a imageView, trascinarne uno nello Storyboard / xib, trascinare Ctrl dall'immagineView in gestoRecognizer e trascinare Ctrl dal gestoRecognizer nel file Swift per crearne uno IBAction
.
Dovrai anche abilitare le interazioni dell'utente sul UIImageView
, come mostrato in questa immagine:
UIImageView
non risponde ai tocchi per impostazione predefinita. Devi anche abilitare le interazioni dell'utente.
Per swift 2.0 e versioni successive, fai questo
@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")
}
Codice Swift4
Prova questo alcuni nuovi metodi di estensione:
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")
}
}
}
Ora, ogni volta che vogliamo aggiungere un UITapGestureRecognizer
a UIView
o una UIView
sottoclasse come UIImageView
, possiamo farlo senza creare funzioni associate per i selettori!
Uso:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
In realtà potresti semplicemente impostare l'immagine di UIButton
ciò che normalmente inseriresti in a UIImageView
. Ad esempio, dove faresti:
myImageView.image = myUIImage
Puoi invece usare:
myButton.setImage(myUIImage, forState: UIControlState.Normal)
Quindi, ecco come potrebbe apparire il tuo codice:
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
}
Il bello dell'utilizzo di questo metodo è che se devi caricare l'immagine da un database, puoi impostare il titolo del pulsante prima di impostare l'immagine:
myButton.setTitle("Loading Image...", forState: UIControlState.Normal)
Per dire ai tuoi utenti che stai caricando l'immagine
È necessario aggiungere pigro per TapGestureRecognizer per registrarsi
poiché il 'sé' in UITapGestureRecognizer (target: self ...) sarà nullo se non è un var pigro. Anche se si imposta isUserInteractionEnable = true, non verrà registrato senza var pigro.
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")
}
È possibile inserire uno UIButton
con uno sfondo trasparente sopra la parte superiore UIImageView
e ascoltare un tocco sul pulsante prima di caricare l'immagine
let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
userImageView.addGestureRecognizer(pictureTap)
userImageView.isUserInteractionEnabled = true
@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
}