Saya mencoba untuk menetapkan UIImageViewsuatu tindakan ketika pengguna mengetuknya.
Saya tahu cara membuat tindakan untuk UIButton, tetapi bagaimana saya bisa meniru perilaku yang sama UIButton, tetapi menggunakan UIImageView?
Saya mencoba untuk menetapkan UIImageViewsuatu tindakan ketika pengguna mengetuknya.
Saya tahu cara membuat tindakan untuk UIButton, tetapi bagaimana saya bisa meniru perilaku yang sama UIButton, tetapi menggunakan UIImageView?
Jawaban:
Anda akan membutuhkan UITapGestureRecognizer. Untuk mengatur gunakan ini:
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
}
(Anda juga dapat menggunakan UIButtondan menetapkan gambar untuk itu, tanpa teks dan dari sekadar menghubungkan IBAction)
@objcpengubah ke fungsi.
Anda perlu menambahkan tanda pengenal isyarat (Untuk mengetuk gunakan UITapGestureRecognizer , untuk mengetuk dan menahan, gunakan UILongPressGestureRecognizer ) ke UIImageView.
let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
Dan Menerapkan metode pemilih seperti:
@objc func tappedMe()
{
println("Tapped on Image")
}
Anda dapat menambahkan UITapGestureRecognizerke imageView, cukup seret satu ke Storyboard / xib Anda, Ctrl-drag dari imageView ke gestureRecognizer, dan Ctrl-drag dari gestureRecognizer ke file Swift untuk membuatIBAction .
Anda juga harus mengaktifkan interaksi pengguna pada UIImageView, seperti yang ditunjukkan pada gambar ini:

UIImageViewtidak merespons sentuhan secara default. Anda juga harus mengaktifkan interaksi pengguna.
Untuk swift 2.0 ke atas lakukan ini
@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")
}
Kode Swift4
Coba ini beberapa metode ekstensi baru:
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")
}
}
}
Sekarang kapan pun kita ingin menambahkan UITapGestureRecognizerke UIViewatau UIViewseperti subkelas UIImageView, kita dapat melakukannya tanpa membuat fungsi terkait untuk penyeleksi!
Pemakaian:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
Anda sebenarnya bisa mengatur gambar UIButtonuntuk apa yang biasanya Anda masukkan ke dalam UIImageView. Misalnya, di mana Anda akan melakukan:
myImageView.image = myUIImage
Anda bisa menggunakan:
myButton.setImage(myUIImage, forState: UIControlState.Normal)
Jadi, begini tampilannya kode Anda:
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
}
Hal yang hebat tentang menggunakan metode ini adalah bahwa jika Anda harus memuat gambar dari database, Anda dapat mengatur judul tombol sebelum Anda mengatur gambar:
myButton.setTitle("Loading Image...", forState: UIControlState.Normal)
Untuk memberi tahu pengguna Anda bahwa Anda memuat gambar
Perlu menambahkan malas untuk TapGestureRecognizer untuk mendaftar
karena 'diri' di UITapGestureRecognizer (target: self ...) akan nol jika bukan malas var. Bahkan jika Anda mengatur isUserInteractionEnable = true, itu tidak akan mendaftar tanpa lazar 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")
}
Anda dapat menempatkan UIButtondengan latar belakang transparan di atas UIImageView, dan mendengarkan ketukan pada tombol sebelum memuat gambar
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
}