จะทำให้ UILabel ตอบสนองต่อการแตะได้อย่างไร


94

ฉันค้นพบว่าฉันสามารถสร้าง UILabel ได้เร็วกว่า UITextField มากและฉันวางแผนที่จะใช้ UILabel เกือบตลอดเวลาสำหรับแอปแสดงข้อมูลของฉัน

ในการสร้างเรื่องสั้นให้สั้นฉันต้องการให้ผู้ใช้แตะที่ UILabel และให้ติดต่อกลับตอบกลับ เป็นไปได้หรือไม่

ขอบคุณ.


2
คุณต้องระบุuserInteractionEnabled = true
onmyway133

คำตอบ:


211

คุณสามารถเพิ่มUITapGestureRecognizerอินสแตนซ์ให้กับ UILabel ของคุณได้

ตัวอย่างเช่น:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

14
Aha คุณสมบัติ 'userInteractionEnabled' ที่นี่เป็นกุญแจสำคัญ (เนื่องจากการกำหนดค่าอื่น ๆ สามารถและควรตั้งค่าในสตอรีบอร์ด) ค่าเริ่มต้นของป้ายกำกับจะปิดการโต้ตอบเพื่อที่จะส่งผ่านการสัมผัสผ่านพวกเขา - แต่ในกรณีนี้พวกเขาจำเป็นต้องสังเกตการสัมผัสเพื่อให้ตัวจดจำท่าทางเปิดใช้งาน ขอบคุณ!
มีนาคม

1
ทำได้ดีนี่! ฉันแค่แตะไปที่ป้ายกำกับและลืมที่จะเปิดใช้งานการโต้ตอบกับผู้ใช้โดยสิ้นเชิง ขอบคุณ!
Mike Critchley

37

หากคุณใช้สตอรีบอร์ดคุณสามารถทำกระบวนการทั้งหมดนี้ได้ในสตอรีบอร์ดโดยไม่ต้องใช้รหัสเพิ่มเติม เพิ่มป้ายกำกับในสตอรีบอร์ดจากนั้นเพิ่มท่าทางสัมผัสในป้ายกำกับ ในบานหน้าต่างยูทิลิตี้ตรวจสอบให้แน่ใจว่าได้เลือก "เปิดใช้งานการโต้ตอบกับผู้ใช้" สำหรับป้ายกำกับ จากท่าทางการแตะ (ที่ด้านล่างของตัวควบคุมมุมมองของคุณในกระดานเรื่องราว) ให้ ctrl + คลิกแล้วลากไปที่ไฟล์ ViewController.h ของคุณและสร้าง Action จากนั้นใช้การดำเนินการในไฟล์ ViewController.m


วิธีนี้สามารถใช้ได้โดยใช้เครื่องมือสร้างอินเทอร์เฟซเพียงอย่างเดียวโดยไม่มีสตอรีบอร์ด
Gomino

ตรวจสอบให้แน่ใจว่าได้เลือก "เปิดใช้งานการโต้ตอบกับผู้ใช้" ในส่วนมุมมองในตัวตรวจสอบแอตทริบิวต์ไม่ใช่แค่ลักษณะการช่วยสำหรับการเข้าถึง
SeanR

17

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
}

วิธีรับข้อความป้ายกำกับจากวัตถุผู้ส่ง กล่าวอีกนัยหนึ่งว่าจะระบุผู้ส่งได้อย่างไร?
Vineel

Swift 4 เวอร์ชันมี @selector แทน #selector
Kirby Todd

8

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")
}

4

คุณสามารถใช้ UIButton แทนและตั้งค่าข้อความเป็นสิ่งที่คุณต้องการ ปุ่มไม่จำเป็นต้องมีลักษณะเหมือนปุ่มถ้าคุณไม่ต้องการ


1
สำหรับเรื่องนั้นฉันมีปัญหากับ UIButton ข้อความหลายบรรทัดแบบชิดซ้ายเสมอ แม้ว่าฉันจะตั้งค่าการจัดตำแหน่งด้านซ้ายเป็นกึ่งกลางมันก็ยังเกิดขึ้น
มีความสุข

ฉันได้ลองใช้ UIButton แล้วและมันก็ค่อนข้างดี มันเป็นเพียงปุ่มหลายบรรทัดที่เป็นปัญหา ขอบคุณ.
สุขสันต์

3

ในการเพิ่มท่าทางสัมผัสบน 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


2

เวอร์ชัน 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:")

1

หากคุณต้องการใช้ข้อความหลายบรรทัดในปุ่มของคุณให้สร้างไฟล์ UILabelด้วยข้อความหลายบรรทัดและเพิ่มเป็นมุมมองย่อยในปุ่มของคุณ

สำหรับเช่น:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]

1

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")
}

0

เวอร์ชัน 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()
}

0

โดยส่วนตัวแล้วฉันชอบวิธีการเขียนส่วนขยายสำหรับ 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
}

สิ่งนี้อาจทำให้เกิดการรั่วไหลของหน่วยความจำ แต่ฉันยังไม่ได้กำหนดวิธีที่ดีที่สุดในการแก้ไข


0

ใช้งานได้ดีใน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")
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.