การจัดการ Touch Event ใน UILabel และต่อเข้ากับ IBAction


101

โอเคฉันมีตัวUILabelสร้างอินเทอร์เฟซที่สร้างขึ้นซึ่งแสดงข้อความเริ่มต้นบางส่วนของ "แตะเพื่อเริ่ม"

เมื่อผู้ใช้แตะที่UILabelฉันต้องการให้ทริกเกอร์วิธี IBAction: -(IBAction)next;ซึ่งจะอัปเดตข้อความบนฉลากเพื่อพูดสิ่งใหม่ ๆ
มันจะสะดวกมากถ้าสิ่งนี้ทำให้ฉันเพียงแค่ลากการเชื่อมต่อจากวิธีการของฉันไปที่ป้ายชื่อของฉันจากนั้นเลือกสัมผัสภายในเช่นเดียวกับปุ่ม แต่อนิจจาไม่มีซิการ์

อย่างไรก็ตามฉันเดาว่าคำถามของฉันคือฉันจะต้องมีคลาสย่อยUILabelเพื่อให้มันใช้งานได้หรือไม่? หรือมีวิธีใดบ้างที่ฉันสามารถลากปุ่มบนป้ายได้ แต่ทำให้ทึบแสง 0% หรือมีวิธีแก้ปัญหาที่ง่ายกว่าที่ฉันหายไป?

คำตอบ:


255

ลองดูสิ:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

เคล็ดลับคือการเปิดใช้งานการโต้ตอบกับผู้ใช้


1
จะเกิดอะไรขึ้นถ้าฉันมีป้ายกำกับหลายป้าย ฉันจะแยกความแตกต่างได้อย่างไรว่าอันไหนถูกแตะ?
ผู้เรียน

1
@learner ลองใช้คุณสมบัติแท็ก อย่าลืมใช้ labelTap: แทน labelTap และใช้ - (โมฆะ) labelTap: (id) ผู้ส่ง;.
thedjaney

1
@thedjaney ผู้ส่งคือ UITapGestureRecognizer ไม่ใช่ UILabel
h4labs

TapGestureRecognizer ไม่เหมือนกับการสัมผัสภายในและสูญเสียความสอดคล้องของอินเทอร์เฟซและความสามารถในการเข้าถึงของมนุษย์

1
@ h4labs คุณสามารถใช้ UITapGestureRecognizer * tapGesture = sender; แล้วรับป้ายชื่อด้วย tapGesture.view.tag
DJTano

70

UILabel สืบทอดมาจาก UIView ซึ่งสืบทอดมาจาก UIResponder ออบเจ็กต์ UIresponder ทั้งหมดสามารถจัดการกับเหตุการณ์การสัมผัสได้ ดังนั้นในไฟล์คลาสของคุณซึ่งรู้เกี่ยวกับมุมมองของคุณ (ซึ่งมี UIlabel) ใช้:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

ในตัวสร้างอินเทอร์เฟซตั้งค่าแท็กของ UILabel เมื่อมีการสัมผัสเกิดขึ้นในเมธอด touchBegan ของคุณให้ตรวจสอบค่าแท็กของมุมมองที่แท็กอยู่:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

คุณเชื่อมต่อรหัสของคุณในไฟล์คลาสของคุณกับอ็อบเจ็กต์ UILabel ในตัวสร้างอินเทอร์เฟซโดยการประกาศตัวแปรอินสแตนซ์ UILabel ของคุณด้วยคำนำหน้า IBOutlet:

IBOutlet UILabel *label;

จากนั้นในตัวสร้างอินเทอร์เฟซคุณสามารถเชื่อมต่อได้


31
หมายเหตุประการหนึ่งคุณต้องตรวจสอบให้แน่ใจว่าคุณได้ตรวจสอบ "เปิดใช้งานการโต้ตอบกับผู้ใช้" ในตัวสร้างอินเทอร์เฟซไม่เช่นนั้นจะใช้ไม่ได้
midas06

ฉันตีหนึ่งปัญหาด้วยวิธีนี้ มันทำงานได้ดีเมื่อโหลดตัวควบคุมมุมมองโดยตรง แต่เมื่อฉันสร้างตัวควบคุมการนำทางดันตัวควบคุมที่มีป้ายกำกับไปยังตัวควบคุมการนำทางจากนั้นแสดงขึ้นมาดูเหมือนว่าการสัมผัสจะไม่เข้าสู่ป้ายกำกับอีกต่อไป ความคิดใด ๆ ?
midas06

หากเป็นคลาสคอนโทรลเลอร์มุมมองเดียวกับที่คุณกำลังผลักดันควรใช้งานได้ ดูเหมือนอาจมีปัญหาเล็กน้อยอื่น ๆ อาจจะเริ่มคำถามใหม่และโพสต์รหัส
Remover

5
วิธีการที่คล้ายกันที่ไม่ต้องใช้แท็กคือตรวจสอบว่า touch.view เท่ากับเต้ารับที่คุณตั้งค่าสำหรับฉลากหรือไม่ ฉันชอบสิ่งนี้มากกว่าเพราะหมายความว่าฉันไม่จำเป็นต้องติดตามแท็ก
Defragged

ทางออกที่ดี ขอแนะนำว่าอย่าตั้งค่าแท็กเป็น 0 เนื่องจากการคลิกที่อื่นมีค่าแท็กเป็น 0 เนื่องจากการดูของคุณมักจะมีค่าแท็กเป็น 0 มิฉะนั้นคุณสามารถตั้งค่าแท็กของมุมมองของคุณเป็น บางอย่างเช่น -1 จากนั้นคุณสามารถใช้ค่าแท็ก 0 ที่อื่นเช่นปุ่ม
kevinl

30

คุณสามารถใช้ UIButton ทำให้โปร่งใสเช่นประเภทกำหนดเองโดยไม่มีรูปภาพและเพิ่ม UILabel ลงไป (กึ่งกลาง) จากนั้นต่อสายเหตุการณ์ปุ่มปกติ


ฉันยอมรับประเภทปุ่มที่กำหนดเองควรให้ประสบการณ์ผู้ใช้ประเภท UILabel แก่คุณ
สติทซ์

2
+1 ดีและเรียบง่าย ฉันเคยลองสิ่งนี้มาก่อนโดยตั้งค่าปุ่มปกติเป็น opactiy 0 ซึ่งใช้งานไม่ได้ แต่เคล็ดลับในการเปลี่ยนประเภทเป็นกำหนดเองทำงานได้อย่างสมบูรณ์
Brian Moeskau

ความทึบจะส่งผลต่อปุ่มและมุมมองย่อยทั้งหมดดังนั้น opacity = 0 จะทำให้มองไม่เห็นสิ่งทั้งหมด
Eiko

10
อ๊ะ. นี่เป็นการแฮ็กเมื่อเทียบกับโซลูชันอื่น ๆ ในชุดข้อความนี้ ใช้เครื่องมือจดจำท่าทางการแตะบนฉลากหากคุณต้องการจดจำท่าทางการแตะบนฉลาก (ดูว่ามันมีความหมายสำหรับสิ่งนี้อย่างไร)
James Boutcher

นี่เป็นวิธีแก้ปัญหาที่ไกลและดีกว่ามากเพราะปุ่มต่างๆจัดการ touchupinside มากกว่าแค่แตะ (เริ่มต้น)

17

สวิฟต์ 3

คุณมี IBOutlet

@IBOutlet var label: UILabel!

ซึ่งคุณเปิดใช้งานการโต้ตอบกับผู้ใช้และเพิ่มตัวจดจำท่าทาง

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

และสุดท้ายจัดการแตะ

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

2
ฉันต้องเพิ่ม @objc ใน userDidTapLabel เพื่อให้มันใช้งานได้ อาจเป็น 4 สิ่งที่รวดเร็ว
สอดคล้องกับ POSIX
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.