Tôi đang cố gắng gán UIImageView
mộ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
?
Tôi đang cố gắng gán UIImageView
mộ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:
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 UIButton
và 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
)
@objc
sửa đổi cho chức năng.
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")
}
Bạn có thể thêm a UITapGestureRecognizer
và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:
UIImageView
khô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.
Đố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")
}
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 UITapGestureRecognizer
mộ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!UIView
UIView
UIImageView
Sử dụng:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
Bạn thực sự có thể chỉ cần đặt hình ảnh của UIButton
nhữ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
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")
}
Bạn có thể đặt một UIButton
nền trong suốt lên trên UIImageView
và lắng nghe một lần nhấn vào nút trước khi tải hình ảnh
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
}