Swift'te UIImageView nesnesi için eylem atama


186

UIImageViewKullanıcı vurduğunda bir eyleme atamaya çalışıyorum .

A için bir eylem oluşturmayı biliyorum UIButton, ancak a'nın aynı davranışını taklit edebilirim UIButton, ancak a kullanarak UIImageView?

Yanıtlar:


421

Bir ihtiyacınız olacak UITapGestureRecognizer. Ayarlamak için şunu kullanın:

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
}

(Ayrıca UIButton, metin olmadan a'yı kullanabilir ve ona görüntü atayabilirsiniz IBAction)


3
Nitpick: var tgr = UITapGestureRecognizer (target: self action: Selector ("imageTapped:")), iki parametre arasında virgül gerekir.
sysuser

3
MidHun MP aşağıda belirtildiği gibi, sen Gerçek userInteractionEnabled = olduğundan emin olun
Sheraz

2
Swift 3.0'da eylem sözdizimi: Selector ("imageTapped:") eylem olarak değiştirildi: #selector (imageTapped))
emily

2
Ayrıca Swift 3.0'da userInteractionEnabled özelliği isUserInteractionEnabled olarak yeniden adlandırıldı
Doug Amos

2
Swift 4'ü kullanarak bu benim için çalıştı, ancak @objcişleve bir değiştirici eklemek zorunda kaldım .
Mark Lyons

68

Bir jest tanımlayıcı eklemeniz gerekir ( Dokunma için UITapGestureRecognizer kullanın , dokunup basılı tutun için UILongPressGestureRecognizer kullanın ) UIImageView.

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

Ve seçici yöntemi aşağıdaki gibi uygulayın:

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

13
userInteractionEnabled anahtardır.
kennydust

@hatim: Karşılaştığınız sorun nedir? Yeni bir sorununuz varsa, lütfen yeni bir soru olarak gönderin.
Midhun Milletvekili

@MidhunMP Görüntü görünümünü dinamik olarak oluşturuyorum ve tam olarak bu cevapta yazılanları yaptım ama tappedMe () işlevi çağrılmıyor
hatim

1
Benim için aşağıdaki değişikliklerle çalıştı: let = UITapGestureRecognizer (target: self, action: #selector (ViewController.tappedMe)) // sonraki satır -> successIndicatorImg.addGestureRecognizer (hedef) self, action: #selector (ViewController.tappedMe)) // sonraki satır -> successIndicatorImg.addGestureRecognizer (dokunun) // sonraki satır -> successIndicatorImg.isUserInteractionEnabled = Doğru
Almir Campos

@hatim birden fazla kullanıcı arayüzü görünümüne aynı hareketi mi kullanıyorsunuz? Ben sadece birden çok görünüm için aynı jest kullanarak ve sadece bir benim için çalışıyordu gibi bu sorunu çözdü. Birden fazla hareket oluşturduğumda benim için çalıştı.
nadafafif

36

UITapGestureRecognizerİmageView öğesine a ekleyebilirsiniz , yalnızca birini Storyboard / xib'inize sürükleyin, imageView öğesinden gestureRecognizer öğesine Ctrl tuşuna basıp sürükleyin ve yapmak için gestureRecognizer öğesinden Swift dosyasına Ctrl sürükleyin IBAction.

Ayrıca UIImageView, bu resimde gösterildiği gibi kullanıcı etkileşimlerini etkinleştirmeniz gerekir : resim açıklamasını buraya girin


4
UIImageViewdokunuşlara varsayılan olarak yanıt vermez. Ayrıca kullanıcı etkileşimlerini de etkinleştirmeniz gerekir.
rmaddy

@rmaddy Hata! Bu doğru. Düzenlenen.
Emil

1
Bunu IB'yi kullanarak nasıl ayarlayabileceğinizi, sürükle / bırak güçlü olduğunu ve mümkün olduğunu ummuyordum. Bunun için +1. Bir çaylak olarak, film şeridinde "fareyle dolaşmadan" nasıl bağlandığını bilmek kolay olurdu. Tercihinize bağlıdır, ancak "kodda görmek" tercih ederim.
2018

14

Hızlı 2.0 ve üstü için bunu yapın

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

userInteractionEnabled şimdi isUserInteractionEnabled olarak yeniden adlandırıldı
Chaim Friedman

11

Swift4 Kodu

Bunu bazı yeni uzantı yöntemleri deneyin:

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

}

Şimdi UITapGestureRecognizera UIViewveya UIViewalt sınıfa a eklemek istediğimizde UIImageView, bunu seçiciler için ilişkili işlevler oluşturmadan yapabiliriz!

Kullanımı:

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

2
Harika çalışıyor. ve uygulamayı çok basitleştirdi.
Nick N

beni kullanılan yansıma işlevleriyle biraz korkutuyor - bunun gelecekteki hızlı sürümlerde çalışması için iyi bir şans var mı?
BananaAcid

1
Bu çok zarif ve yararlı. Benim için çalışıyor
Taylor Maxwell

2
❤️I love extensions
Ricardo

8

Aslında görüntüsünü UIButtonnormalde a UIImageView. Örneğin, şunları yapabilirsiniz:

myImageView.image = myUIImage

Bunun yerine şunları kullanabilirsiniz:

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

Kodunuz şöyle görünebilir:

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
}

Bu yöntemi kullanmanın en güzel yanı, görüntüyü bir veritabanından yüklemeniz gerektiğinde, görüntüyü ayarlamadan önce düğmenin başlığını ayarlayabilmenizdir:

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

Kullanıcılarınıza görüntüyü yüklediğinizi söylemek için


2


UITapGestureRecognizer'daki (self: self ...) 'self' tembel bir değişken değilse nil olacağından TapGestureRecognizer'ın kaydolması için tembel eklemeniz gerekir. İsUserInteractionEnable = true ayarlasanız bile, tembel var olmadan kayıt yapmaz.

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

1

UIButtonÜzerine şeffaf bir arka plan ile a koyabilir UIImageViewve görüntüyü yüklemeden önce düğmeye dokunabilirsiniz.


1
Bir seçeneği tanımlamanın hızlı bir yolu. Herkesin bildiğini sanıyordum!
depsch ali

3
Gerçek bir neden olmadan gereksiz UI bileşenleri eklemek iyi bir fikir değildir. Kullanıcı arayüzünün karmaşıklığını artıracak ve aynı otomatik düzen kısıtlamalarıyla uğraşmak zorunda kalacaksınız. Bir TapGestureRecognizer eklemek daha iyidir.
Günhan

1

Swift 4 Kodu


Adım 1 ViewdidLoad () içinde

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

Adım 2 Aşağıdaki İşlev Ekle

@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

    }

Test Edildi ve Düzgün Çalışıyor


0

Görsel görünümünüze görünmez (opaklık = 0) düğmesi yerleştirmenizi ve ardından düğme üzerindeki etkileşimi kullanmanızı öneririm .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.