Próbuję przypisać UIImageViewakcję do akcji, gdy użytkownik ją stuknie.
Wiem, jak stworzyć akcję dla UIButton, ale jak mogę naśladować to samo zachowanie UIButton, ale używając UIImageView?
Próbuję przypisać UIImageViewakcję do akcji, gdy użytkownik ją stuknie.
Wiem, jak stworzyć akcję dla UIButton, ale jak mogę naśladować to samo zachowanie UIButton, ale używając UIImageView?
Odpowiedzi:
Będziesz potrzebował UITapGestureRecognizer. Aby skonfigurować, użyj tego:
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
}
(Możesz także użyć UIButtoni przypisać do niego obraz bez tekstu, a następnie po prostu podłączyć an IBAction)
@objcmodyfikator do funkcji.
Musisz dodać do swojego urządzenia rozpoznawanie gestów (do korzystania z UITapGestureRecognizer , do korzystania z UILongPressGestureRecognizer ) UIImageView.
let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
I zaimplementuj metodę selektora, taką jak:
@objc func tappedMe()
{
println("Tapped on Image")
}
Możesz dodać a UITapGestureRecognizerdo imageView, po prostu przeciągnij jeden do Storyboard / xib, przeciągnij Ctrl z imageView do gestRecognizer i przeciągnij Ctrl z gestRecognizer do pliku Swift, aby utworzyć plik IBAction.
Musisz także włączyć interakcje z użytkownikiem UIImageView, jak pokazano na tym obrazku:

UIImageViewdomyślnie nie reaguje na dotyk. Musisz także włączyć interakcje użytkownika.
W przypadku wersji 2.0 i nowszych zrób to
@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")
}
Kod Swift4
Wypróbuj kilka nowych metod rozszerzenia:
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")
}
}
}
Teraz, gdy chcemy dodać UITapGestureRecognizerdo UIViewlub UIViewpodklasy jak UIImageViewmożemy to zrobić bez tworzenia skojarzone funkcje selektorów!
Stosowanie:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
Możesz po prostu ustawić obraz UIButtontego, co normalnie umieścisz w UIImageView. Na przykład gdzie byś zrobił:
myImageView.image = myUIImage
Zamiast tego możesz użyć:
myButton.setImage(myUIImage, forState: UIControlState.Normal)
Oto, jak mógłby wyglądać Twój kod:
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
}
Wspaniałą rzeczą w tej metodzie jest to, że jeśli musisz załadować obraz z bazy danych, możesz ustawić tytuł przycisku przed ustawieniem obrazu:
myButton.setTitle("Loading Image...", forState: UIControlState.Normal)
Aby poinformować użytkowników, że ładujesz obraz
Musisz dodać leniwy, aby TapGestureRecognizer się zarejestrował,
ponieważ „self” w UITapGestureRecognizer (target: self ...) będzie zero, jeśli nie jest to leniwy var. Nawet jeśli ustawisz isUserInteractionEnable = true, nie zarejestruje się bez leniwego var.
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")
}
Możesz umieścić UIButtonprzezroczyste tło na górze UIImageViewi nasłuchiwać stuknięcia w przycisk przed załadowaniem obrazu
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
}