ฉันค้นพบว่าฉันสามารถสร้าง UILabel ได้เร็วกว่า UITextField มากและฉันวางแผนที่จะใช้ UILabel เกือบตลอดเวลาสำหรับแอปแสดงข้อมูลของฉัน
ในการสร้างเรื่องสั้นให้สั้นฉันต้องการให้ผู้ใช้แตะที่ UILabel และให้ติดต่อกลับตอบกลับ เป็นไปได้หรือไม่
ขอบคุณ.
ฉันค้นพบว่าฉันสามารถสร้าง UILabel ได้เร็วกว่า UITextField มากและฉันวางแผนที่จะใช้ UILabel เกือบตลอดเวลาสำหรับแอปแสดงข้อมูลของฉัน
ในการสร้างเรื่องสั้นให้สั้นฉันต้องการให้ผู้ใช้แตะที่ UILabel และให้ติดต่อกลับตอบกลับ เป็นไปได้หรือไม่
ขอบคุณ.
คำตอบ:
คุณสามารถเพิ่มUITapGestureRecognizer
อินสแตนซ์ให้กับ UILabel ของคุณได้
ตัวอย่างเช่น:
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;
หากคุณใช้สตอรีบอร์ดคุณสามารถทำกระบวนการทั้งหมดนี้ได้ในสตอรีบอร์ดโดยไม่ต้องใช้รหัสเพิ่มเติม เพิ่มป้ายกำกับในสตอรีบอร์ดจากนั้นเพิ่มท่าทางสัมผัสในป้ายกำกับ ในบานหน้าต่างยูทิลิตี้ตรวจสอบให้แน่ใจว่าได้เลือก "เปิดใช้งานการโต้ตอบกับผู้ใช้" สำหรับป้ายกำกับ จากท่าทางการแตะ (ที่ด้านล่างของตัวควบคุมมุมมองของคุณในกระดานเรื่องราว) ให้ ctrl + คลิกแล้วลากไปที่ไฟล์ ViewController.h ของคุณและสร้าง Action จากนั้นใช้การดำเนินการในไฟล์ ViewController.m
Swift 3.0
เริ่มต้นท่าทางสำหรับ tempLabel
tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)
ตัวรับการกระทำ
func actionTapped(_ sender: UITapGestureRecognizer) {
// code here
}
Swift 4.0
เริ่มต้นท่าทางสำหรับ tempLabel
tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)
ตัวรับการกระทำ
func actionTapped(_ sender: UITapGestureRecognizer) {
// code here
}
Swift 2.0:
ฉันกำลังเพิ่มสตริง nsmutable เป็นข้อความของ sampleLabel เปิดใช้งานการโต้ตอบกับผู้ใช้เพิ่มท่าทางสัมผัสและทริกเกอร์วิธีการ
override func viewDidLoad() {
super.viewDidLoad()
let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString
let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
tapGesture.numberOfTapsRequired = 1
sampleLabel.userInteractionEnabled = true
sampleLabel.addGestureRecognizer(tapGesture)
}
func tapResponse(recognizer: UITapGestureRecognizer) {
print("tap")
}
คุณสามารถใช้ UIButton แทนและตั้งค่าข้อความเป็นสิ่งที่คุณต้องการ ปุ่มไม่จำเป็นต้องมีลักษณะเหมือนปุ่มถ้าคุณไม่ต้องการ
ในการเพิ่มท่าทางสัมผัสบน UILable
UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;
//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];
และเพื่อประเมินวิธีการเลือก
- (void)lblClick:(UITapGestureRecognizer *)tapGesture {
}
หมายเหตุ: เพิ่ม UIGestureRecognizerDelegate ในไฟล์. h
เวอร์ชัน Swift:
var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()
จากนั้นviewDidLoad()
เพิ่มสิ่งนี้:
let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!
yourLbl.text = "SignUp"
tapGesture.numberOfTapsRequired = 1
yourLbl.addGestureRecognizer(tapGesture)
yourLbl.userInteractionEnabled = true
tapGesture.addTarget(self, action: "yourLblTapped:")
หากคุณต้องการใช้ข้อความหลายบรรทัดในปุ่มของคุณให้สร้างไฟล์ UILabel
ด้วยข้อความหลายบรรทัดและเพิ่มเป็นมุมมองย่อยในปุ่มของคุณ
สำหรับเช่น:
yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]
Swift 3 จาก Alvin George
override func viewDidLoad() {
super.viewDidLoad()
let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString
let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
tapGesture.numberOfTapsRequired = 1
sampleLabel.isUserInteractionEnabled = true
sampleLabel.addGestureRecognizer(tapGesture)
}
func tapResponse(recognizer: UITapGestureRecognizer) {
print("tap")
}
เวอร์ชัน Swift มีลักษณะดังนี้:
func addGestureRecognizerLabel(){
//Create a instance, in this case I used UITapGestureRecognizer,
//in the docs you can see all kinds of gestures
let gestureRecognizer = UITapGestureRecognizer()
//Gesture configuration
gestureRecognizer.numberOfTapsRequired = 1
gestureRecognizer.numberOfTouchesRequired = 1
/*Add the target (You can use UITapGestureRecognizer's init() for this)
This method receives two arguments, a target(in this case is my ViewController)
and the callback, or function that you want to invoke when the user tap it view)*/
gestureRecognizer.addTarget(self, action: "showDatePicker")
//Add this gesture to your view, and "turn on" user interaction
dateLabel.addGestureRecognizer(gestureRecognizer)
dateLabel.userInteractionEnabled = true
}
//How you can see, this function is my "callback"
func showDatePicker(){
//Your code here
print("Hi, was clicked")
}
//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called
override func viewDidLoad() {
super.viewDidLoad()
addGestureRecognizerLabel()
}
โดยส่วนตัวแล้วฉันชอบวิธีการเขียนส่วนขยายสำหรับ UILabel มากกว่า นี่คือสิ่งที่ฉันใช้
import UIKit
extension UILabel {
/**
* A map of actions, mapped as [ instanceIdentifier : action ].
*/
private static var _tapHandlers = [String:(()->Void)]()
/**
* Retrieve the address for this UILabel as a String.
*/
private func getAddressAsString() -> String {
let addr = Unmanaged.passUnretained(self).toOpaque()
return "\(addr)"
}
/**
* Set the on tapped event for the label
*/
func setOnTapped(_ handler: @escaping (()->Void)) {
UILabel._tapHandlers[getAddressAsString()] = handler
let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
gr.numberOfTapsRequired = 1
self.addGestureRecognizer(gr)
self.isUserInteractionEnabled = true
}
/**
* Handle the tap event.
*/
@objc private func onTapped() {
UILabel._tapHandlers[self.getAddressAsString()]?()
}
}
จากนั้นคุณจะใช้สิ่งนี้จากอินสแตนซ์ UILabel:
myLabel.setOnTapped {
// do something
}
สิ่งนี้อาจทำให้เกิดการรั่วไหลของหน่วยความจำ แต่ฉันยังไม่ได้กำหนดวิธีที่ดีที่สุดในการแก้ไข
ใช้งานได้ดีในXcode 12 และ Swift 5
let tapAction = UITapGestureRecognizer(target: self,action:#selector(actionTapped(_:)))
userLabel?.isUserInteractionEnabled = true
userLabel?.addGestureRecognizer(tapAction)
และวิธีการดำเนินการเช่น -
@objc func actionTapped(_ sender: UITapGestureRecognizer) {
print("tapped")
}
userInteractionEnabled = true