Як призначити дію для об'єкта UIImageView у Swift


186

Я намагаюся призначити UIImageViewдію, коли користувач натискає її.

Я знаю, як створити дію для UIButton, але як я міг би імітувати ту саму поведінку UIButton, але використовуючи a UIImageView?

Відповіді:


421

Вам знадобиться UITapGestureRecognizer. Щоб налаштувати, скористайтеся цим:

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
}

(Ви також можете використовувати a UIButtonта призначити йому зображення без тексту та просто підключити IBAction)


3
Nitpick: var tgr = UITapGestureRecognizer (ціль: самодія: Selector ("imageTapped:")), потрібна кома між двома параметрами.
sysuser

3
як зазначено нижче, MidHun MP, переконайтеся, що у вас є користувачInteractionEnabled = true
Sheraz

2
У Swift 3.0 синтаксис дії: Selector ("imageTapped:") змінився на action: #selector (imageTapped))
Емілі

2
Також у Swift 3.0 властивість userInteractionEnabled було перейменовано на isUserInteractionEnabled
Doug Amos

2
Використовуючи Swift 4, це працювало для мене, але мені довелося додати @objcмодифікатор до функції.
Марк Ліонс

68

Вам потрібно додати розпізнавальник жестів (Для використання натисканням UITapGestureRecognizer , для натискання та утримання UILongPressGestureRecognizer ) до свого UIImageView.

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

І реалізуйте селекторний метод на зразок:

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

13
userInteractionEnabled є ключовим.
kennydust

@hatim: З якою проблемою ви стикаєтесь? Якщо у вас є нове питання, будь ласка, опублікуйте його як нове запитання.
Мідхун МП

@MidhunMP Я динамічно генерую перегляд зображень і виконав саме те, що написано у цій відповіді, але функцію tappedMe () не викликають
хатим

1
Для мене він працював із такими змінами: нехай tap = UITapGestureRecognizer (target: self, action: #selector (ViewController.tappedMe)) // наступний рядок -> successIndicatorImg.addGestureRecognizer (tap) // наступний рядок -> successIndicatorImg.isUserInteractionEnabled = правда
Алмір Кампос

@hatim, ви використовуєте один і той же жест для кількох переглядів інтерфейсу користувача? Я просто вирішив цю проблему, оскільки використовував один і той же жест для кількох переглядів, і лише один працював на мене. коли я створю декілька жестів, це працювало для мене.
nadafafif

36

Ви можете додати a UITapGestureRecognizerimageView, просто перетягніть його в свою аркуш розгортки / xib, перетягніть Ctrl з imageView в gestureRecognizer, а Ctrl - перетягніть з gestureRecognizer в файл Swift, щоб зробити IBAction.

Вам також потрібно буде ввімкнути взаємодію користувачів на UIImageView, як показано на цьому зображенні: введіть тут опис зображення


4
UIImageViewза замовчуванням не відповідає на дотики. Ви також повинні ввімкнути взаємодію користувачів.
rmaddy

@rmaddy На жаль, це правда. Відредаговано.
Еміль

1
Мені подобається, як ви можете налаштувати це за допомогою ІБ, перетягування / падіння є потужним, і не сподівався, що це можливо. +1 для цього. Як ноб, легко було б не знати, як це пов’язано, не «розгулюючи» раскадровку. Це залежить від ваших уподобань, але я вважаю за краще "бачити це в коді".
сердитийТіг

14

Для швидких версій 2.0 і вище зробіть це

@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 тепер перейменовано на isUserInteractionEnabled
Хаїм Фрідман

11

Код Swift4

Спробуйте це кілька нових методів розширення:

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

}

Тепер , коли ми хочемо , щоб додати UITapGestureRecognizerдо UIViewабо UIViewпідкласу , як UIImageViewми можемо зробити це , не створюючи відповідні функції для селекторів!

Використання:

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

2
Чудово працює. і це значно спростило реалізацію.
Нік Н

мене трохи лякає використані функції відображення - чи є хороший шанс, що це буде спрацювати у майбутніх швидких версіях?
BananaAcid

1
Це дуже елегантно і корисно. Для мене працює
Тейлор Максвелл

2
❤️ Я люблю розширення
Рікардо

8

Ви насправді можете просто встановити зображення того, UIButtonщо ви зазвичай ставите в UIImageView. Наприклад, де ви б робили:

myImageView.image = myUIImage

Ви можете замість цього використовувати:

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

Отже, ось як може виглядати ваш код:

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
}

Чудова річ у використанні цього методу полягає в тому, що якщо вам доведеться завантажити зображення з бази даних, ви можете встановити заголовок кнопки перед тим, як встановити зображення:

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

Щоб повідомити своїм користувачам, що ви завантажуєте зображення


2

Потрібно додати Lazy для TapGestureRecognizer, щоб зареєструватися,
оскільки "Я" в UITapGestureRecognizer (ціль: self ...) буде нульовим, якщо це не лінивий var. Навіть якщо ви встановите isUserInteractionEnable = true, він не зареєструється без ледачого 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")
}

1

Ви можете поставити UIButtonпрозорий фон поверх UIImageViewі натиснути кнопку, перш ніж завантажувати зображення


1
Це швидкий спосіб опису варіанту. Я думав, що всі це знають!
депш алі

3
Недоцільно додавати непотрібні компоненти інтерфейсу без реальних причин. Це збільшить складність інтерфейсу, а також вам доведеться мати справу з тими ж обмеженнями автоматичного розміщення. Просто краще додати TapGestureRecognizer.
Гунхань

1

Код Swift 4


Крок 1 у ViewdidLoad ()

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

Крок 2 Додати наступну функцію

@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

    }

Це випробувано та працює належним чином


0

Я пропоную розмістити на своєму зображенні невидиму (непрозорість = 0) кнопку, а потім обробити взаємодію на кнопці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.