ฉันพยายามที่จะกำหนดให้UIImageView
กับการกระทำเมื่อผู้ใช้แตะมัน
ฉันรู้วิธีการสร้างการดำเนินการหนึ่งUIButton
แต่วิธีการที่ฉันสามารถเลียนแบบพฤติกรรมเดียวกันของUIButton
แต่ใช้UIImageView
?
ฉันพยายามที่จะกำหนดให้UIImageView
กับการกระทำเมื่อผู้ใช้แตะมัน
ฉันรู้วิธีการสร้างการดำเนินการหนึ่งUIButton
แต่วิธีการที่ฉันสามารถเลียนแบบพฤติกรรมเดียวกันของUIButton
แต่ใช้UIImageView
?
คำตอบ:
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
}
(คุณยังสามารถใช้UIButton
และกำหนดภาพให้โดยไม่ต้องมีข้อความและทำได้ง่ายกว่าการเชื่อมต่อIBAction
)
@objc
ตัวแก้ไขในฟังก์ชัน
คุณต้องเพิ่ม AA จดจำท่าทาง (สำหรับประปาใช้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")
}
คุณสามารถเพิ่มUITapGestureRecognizer
การ IMAGE ดูเพียงแค่ลากเข้าไปใน Storyboard / Xib, กด Ctrl และลากของคุณจาก IMAGE ดูไป gestureRecognizer และกด Ctrl และลากจาก gestureRecognizer IBAction
กับสวิฟท์ไฟล์ที่จะทำให้
คุณจะต้องเปิดใช้งานการโต้ตอบกับผู้ใช้ในUIImageView
, ดังที่แสดงในภาพนี้:
UIImageView
ไม่ตอบสนองต่อการสัมผัสโดยค่าเริ่มต้น คุณต้องเปิดใช้งานการโต้ตอบของผู้ใช้
สำหรับ swift 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")
}
รหัส 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
subclass เช่นUIImageView
เราสามารถทำได้โดยไม่ต้องสร้างฟังก์ชั่นที่เกี่ยวข้องสำหรับเตอร์!
การใช้งาน:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
คุณสามารถจริงเพียงแค่ตั้งค่าภาพของสิ่งที่คุณจะใส่ตามปกติใน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)
เพื่อบอกผู้ใช้ของคุณว่าคุณกำลังโหลดภาพ
จำเป็นต้องเพิ่มความขี้เกียจสำหรับ TapGestureRecognizer เพื่อลงทะเบียน
ตั้งแต่ 'ตัวเอง' ใน UITapGestureRecognizer (เป้าหมาย: ตัวเอง ... ) จะเป็นศูนย์หากไม่มี var ที่ขี้เกียจ แม้ว่าคุณจะตั้งค่า isUserInteractionEnable = true มันจะไม่ลงทะเบียนโดยไม่ต้องแจ้งให้ทราบ
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")
}
คุณสามารถใส่UIButton
กับพื้นหลังโปร่งใสด้านบนของUIImageView
และฟังการแตะที่ปุ่มก่อนที่จะโหลดภาพ
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
}
ฉันขอแนะนำให้วางปุ่มที่มองไม่เห็น (opacity = 0) ในมุมมองภาพของคุณแล้วจัดการกับปุ่มโต้ตอบ