Cách chỉ định một hành động cho đối tượng UIImageView trong Swift


186

Tôi đang cố gắng gán UIImageViewmột hành động khi người dùng chạm vào nó.

Tôi biết cách tạo hành động cho a UIButton, nhưng làm thế nào tôi có thể bắt chước hành vi tương tự của a UIButton, nhưng sử dụng a UIImageView?

Câu trả lời:


421

Bạn sẽ cần một UITapGestureRecognizer. Để thiết lập sử dụng này:

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
}

(Bạn cũng có thể sử dụng a UIButtonvà gán hình ảnh cho nó, không có văn bản và chỉ đơn giản là kết nối một IBAction)


3
Nitpick: var tgr = UITapGestureRecognizer (target: self action: Selector ("imageTapped:")), cần một dấu phẩy giữa hai tham số.
sysuser

3
như được tuyên bố dưới đây bởi MidHun MP, hãy đảm bảo bạn có userInteractionEnables = true
Sheraz

2
Trong Swift 3.0, cú pháp hành động: Selector ("imageTapped:") đã thay đổi thành hành động: #selector (imageTapped))
emily

2
Ngoài ra trong Swift 3.0, thuộc tính userInteractionEnables đã được đổi tên thành isUserInteractionEnables
Doug Amos

2
Sử dụng Swift 4, điều này làm việc cho tôi, nhưng tôi phải thêm một công cụ @objcsửa đổi cho chức năng.
Mark Lyons

68

Bạn cần thêm một trình nhận dạng cử chỉ (Để sử dụng UITapGestureRecognizer , để nhấn và giữ, hãy sử dụng UILongPressGestureRecognizer ) cho bạn UIImageView.

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

Và triển khai phương thức chọn như sau:

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

13
userInteractionEnables là chìa khóa.
kennydust

@hatim: Vấn đề bạn đang gặp phải là gì? Nếu bạn có một vấn đề mới, xin vui lòng gửi nó như một câu hỏi mới.
Midhun MP

@HayhunMP Tôi đang tạo chế độ xem hình ảnh một cách linh hoạt và đã thực hiện chính xác những gì được viết trong câu trả lời này nhưng chức năng tapsMe () không được gọi
hatim

1
Nó đã làm việc với tôi với các thay đổi sau: let tap = UITapGestureRecognizer (target: self, action: #selector (ViewContoder.tappedMe)) // dòng tiếp theo -> thành côngIatorator.mgGaddure đúng
Almir Campos

@hatim bạn đang sử dụng cùng một cử chỉ cho nhiều lượt xem UI? Tôi chỉ giải quyết vấn đề này vì tôi đang sử dụng cùng một cử chỉ cho nhiều lượt xem và chỉ có một lượt làm việc cho tôi. Khi tôi tạo ra nhiều cử chỉ, nó làm việc cho tôi.
nadafafif

36

Bạn có thể thêm a UITapGestureRecognizervào imageView, chỉ cần kéo một cái vào Storyboard / xib của bạn, Ctrl-kéo từ imageView đến cử chỉ nhận dạng và Ctrl-kéo từ cử chỉ nhận dạng vào tệp Swift để tạo một tệp IBAction.

Bạn cũng sẽ cần kích hoạt các tương tác của người dùng trên UIImageView, như trong hình này: nhập mô tả hình ảnh ở đây


4
UIImageViewkhông trả lời chạm theo mặc định. Bạn cũng phải kích hoạt tương tác người dùng.
rmaddy

@rmaddy Rất tiếc, đó là sự thật. Đã chỉnh sửa.
Emil

1
Tôi thích cách bạn có thể thiết lập điều này bằng cách sử dụng IB, kéo / thả rất mạnh mẽ và không mong đợi điều đó là có thể. +1 cho điều đó. Là một người mới, thật dễ dàng để không biết làm thế nào nó được kết nối mà không "lảng vảng" bảng phân cảnh. Nó phụ thuộc vào sở thích của bạn, nhưng tôi thích "xem nó trong mã".
tức giận

13

Đối với swift 2.0 trở lên, hãy làm điều này

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

userInteractionEnables hiện đã được đổi tên thành isUserInteractionEnables
Chaim Friedman

11

Mã Swift4

Hãy thử một số phương pháp mở rộng mới:

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

}

Bây giờ bất cứ khi nào chúng tôi muốn thêm một hoặc UITapGestureRecognizermột lớp con như thế , chúng tôi có thể làm như vậy mà không cần tạo các hàm liên quan cho bộ chọn!UIViewUIViewUIImageView

Sử dụng:

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

2
Công trình tuyệt vời. và nó rất đơn giản hóa việc thực hiện cho đến nay.
Nick N

làm tôi sợ một chút với các chức năng phản chiếu được sử dụng - có khả năng tốt điều này sẽ hoạt động trong các phiên bản nhanh chóng trong tương lai không?
BananaAcid

1
Điều này rất thanh lịch và hữu ích. Làm việc cho tôi
Taylor Maxwell

2
Tôi thích phần mở rộng
Ricardo

8

Bạn thực sự có thể chỉ cần đặt hình ảnh của UIButtonnhững gì bạn thường đặt vào UIImageView. Ví dụ: nơi bạn sẽ làm:

myImageView.image = myUIImage

Thay vào đó, bạn có thể sử dụng:

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

Vì vậy, đây là mã của bạn có thể trông như thế nào:

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
}

Điều tuyệt vời khi sử dụng phương pháp này là nếu bạn phải tải hình ảnh từ cơ sở dữ liệu, bạn có thể đặt tiêu đề của nút trước khi bạn đặt hình ảnh:

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

Để nói với người dùng của bạn rằng bạn đang tải hình ảnh


2

Cần thêm sự lười biếng để TapGestureRecognizer đăng ký
vì 'cái tôi' trong UITapGestureRecognizer (đích: tự ...) sẽ là con số không nếu đó không phải là một var lười biếng. Ngay cả khi bạn đặt isUserInteractionEnable = true, nó sẽ không đăng ký mà không có 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

Bạn có thể đặt một UIButtonnền trong suốt lên trên UIImageViewvà lắng nghe một lần nhấn vào nút trước khi tải hình ảnh


1
Đó là một cách nhanh chóng để mô tả một tùy chọn. Tôi nghĩ mọi người đều biết điều đó!
depsch ali

3
Không nên thêm các thành phần UI không cần thiết mà không có lý do thực sự. Nó sẽ làm tăng sự phức tạp của giao diện người dùng và bạn cũng phải đối phó với các ràng buộc bố cục tự động tương tự. Nó chỉ là tốt hơn để thêm một TapGestureRecognizer.
Gunhan

1

Mã Swift 4


Bước 1 Trong ViewdidLoad ()

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

Bước 2 Thêm chức năng sau

@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

    }

Nó đã được thử nghiệm và hoạt động đúng cách


0

Tôi đề nghị đặt nút vô hình (opacity = 0) trên chế độ xem hình ảnh của bạn và sau đó xử lý nút tương tác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.