Làm cách nào để UILabel phản hồi khi nhấn?


94

Tôi đã phát hiện ra rằng tôi có thể tạo UILabel nhanh hơn nhiều so với UITextField và tôi dự định sử dụng UILabel hầu hết thời gian cho ứng dụng hiển thị dữ liệu của mình.

Mặc dù vậy, để tạo một câu chuyện dài, tôi muốn cho phép người dùng chạm vào UILabel và yêu cầu gọi lại của tôi phản hồi điều đó. Điều đó có thể không?

Cảm ơn.


1
Bạn cần phải xác địnhuserInteractionEnabled = true
onmyway133

Câu trả lời:


208

Bạn có thể thêm một UITapGestureRecognizerphiên bản vào UILabel của mình.

Ví dụ:

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

13
Aha, thuộc tính 'userInteractionEnabled' ở đây là chìa khóa (vì cấu hình khác có thể và tốt nhất nên được đặt trong bảng phân cảnh). Nhãn mặc định tương tác là tắt để truyền qua các lần chạm qua chúng - nhưng trong trường hợp này, chúng cần quan sát các lần chạm để kích hoạt trình nhận dạng cử chỉ. Cảm ơn!
Marchy,

1
Đẹp quá! Tôi chỉ đang nhấn vào một nhãn và hoàn toàn quên bật tương tác của người dùng. Cảm ơn!
Mike Critchley

37

Nếu bạn đang sử dụng bảng phân cảnh, bạn có thể thực hiện toàn bộ quá trình này trong bảng phân cảnh mà không cần mã bổ sung. Thêm nhãn vào bảng phân cảnh, sau đó thêm động tác nhấn vào nhãn. Trong ngăn Tiện ích, đảm bảo rằng "Đã bật Tương tác Người dùng" được chọn cho nhãn. Từ thao tác chạm (ở cuối bộ điều khiển chế độ xem của bạn trong bảng phân cảnh), ctrl + nhấp và kéo đến tệp ViewController.h của bạn và tạo Hành động. Sau đó triển khai hành động trong tệp ViewController.m.


Phương pháp này cũng có sẵn bằng xây dựng giao diện một mình mà không storyboards
Gomino

Đảm bảo rằng "Đã bật tương tác với người dùng" được chọn trong phần Chế độ xem trong trình kiểm tra Thuộc tính , không chỉ Đặc điểm hỗ trợ tiếp cận.
SeanR

17

Swift 3.0

Khởi tạo cử chỉ cho tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

Người nhận hành động

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

Swift 4.0

Khởi tạo cử chỉ cho tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

Người nhận hành động

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

Làm cách nào để lấy văn bản nhãn từ đối tượng người gửi? Nói cách khác làm thế nào để xác định người gửi?
Vineel

Phiên bản Swift 4 có @selector thay vì #selector.
Kirby Todd

8

Swift 2.0:

Tôi đang thêm chuỗi nsmutable dưới dạng văn bản của sampleLabel, cho phép tương tác với người dùng, thêm cử chỉ nhấn và kích hoạt một phương pháp.

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

Thay vào đó, bạn có thể sử dụng UIButton và đặt văn bản thành những gì bạn muốn. Nút không cần phải trông giống như một nút nếu bạn không muốn


1
Về điều đó, tôi luôn gặp rắc rối với văn bản nhiều dòng căn trái của UIButton. Ngay cả khi tôi đặt căn chỉnh bên trái thành căn giữa, nó vẫn xảy ra.
Chúc mừng

Mặc dù vậy, tôi đã thử UIButton và nó khá hay. Đó chỉ là các nút nhiều dòng là một vấn đề. Cảm ơn.
Chúc mừng

3

Để thêm cử chỉ Tap vào 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];   

và để đánh giá phương pháp bộ chọn

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {

}

Lưu ý: Thêm UIGestureRecognizerDelegate trong tệp .h


2

Phiên bản Swift: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

Sau đó, bên trong viewDidLoad(), thêm cái này:

  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

Nếu bạn muốn sử dụng Văn bản nhiều dòng trong nút của mình, hãy tạo một UILabelvới Văn bản nhiều dòng và thêm làm chế độ xem phụ vào nút của bạn.

ví dụ:

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

1

Swift 3 từ 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

Phiên bản Swift trông như thế này:

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

Cá nhân tôi thích phương pháp viết phần mở rộng cho UILabel hơn. Đây là những gì tôi sử dụng.

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()]?()
    }
}

Sau đó, bạn sẽ sử dụng nó như thế này từ bất kỳ phiên bản UILabel nào:

myLabel.setOnTapped {
    // do something
}

Tôi tin rằng điều này có thể gây ra một số rò rỉ bộ nhớ, nhưng tôi vẫn chưa xác định được cách tốt nhất để giải quyết chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.