programing

UILabel을 클릭 가능하게 하는 방법

lovejava 2023. 4. 14. 20:51

UILabel을 클릭 가능하게 하는 방법

UILABEL을 클릭할 수 있도록 하고 싶습니다.

시도했지만 작동하지 않습니다.

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let tap = UITapGestureRecognizer(target: self, action: Selector("tapFunction:"))
        tripDetails.addGestureRecognizer(tap)
    }

    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

설정해 보셨습니까?isUserInteractionEnabled로.true에서tripDetails라벨이요? 이거면 될 거예요

Swift 3 업데이트

교체하다

Selector("tapFunction:")

와 함께

#selector(DetailViewController.tapFunction)

예:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @objc
    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

SWIFT 4 업데이트

 @IBOutlet weak var tripDetails: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(GameViewController.tapFunction))
    tripDetails.isUserInteractionEnabled = true
    tripDetails.addGestureRecognizer(tap)
}

@objc func tapFunction(sender:UITapGestureRecognizer) {

    print("tap working")
}

스위프트 5

@liorco와 비슷하지만 @objc @IBAtion으로 대체해야 합니다.

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @IBAction func tapFunction(sender: UITapGestureRecognizer) {
        print("tap working")
    }
}

이것은 Xcode 10.2에서 동작하고 있습니다.

Swift 3 업데이트

yourLabel.isUserInteractionEnabled = true

우수하고 편리한 솔루션:

View Controller:

@IBOutlet weak var label: LabelButton!

override func viewDidLoad() {
    super.viewDidLoad()

    self.label.onClick = {
        // TODO
    }
}

이 파일은 ViewController 또는 다른 .swift 파일(예: CustomView.swift)에 배치할 수 있습니다.

@IBDesignable class LabelButton: UILabel {
    var onClick: () -> Void = {}
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        onClick()
    }
}

Storyboard에서 Label을 선택하고 필드 클래스의 "Identity Inspector" 오른쪽 영역에서 LabelButton을 선택합니다.

Label Attribute Inspector(라벨 속성 검사기)에서 "User Interaction Enabled(사용자 상호 작용 활성화)"를 활성화해야 합니다.

해당 라벨의 사용자 상호 작용을 활성화해야 합니다.

예:

yourLabel.userInteractionEnabled = true

swift 3.0의 경우 제스처도 길게 누를 수 있습니다.

label.isUserInteractionEnabled = true
let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
longPress.minimumPressDuration = 0.2
label.addGestureRecognizer(longPress)

나처럼 간과하기 쉽지만, 잊지 말고 사용하세요.UITapGestureRecognizer보다는UIGestureRecognizer.

연구원님 감사합니다.

다음은 UIKit을 사용한 프로그램 사용자 인터페이스용 솔루션입니다.

Swift 5에서만 해봤어요.그리고 그것은 성공하였다.

재미있는 사실은, 이 설정을 할 필요가 없다는 것입니다.isUserInteractionEnabled = true명쾌하게

import UIKit

open class LabelButon: UILabel {
    var onClick: () -> Void = {}
    
    public override init(frame: CGRect) {
        super.init(frame: frame)
        isUserInteractionEnabled = true
    }
    
    public required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
    
    public convenience init() {
        self.init(frame: .zero)
    }
    
    open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        onClick()
    }
}

용도:

override func viewDidLoad() {
    super.viewDidLoad()
    
    let label = LabelButton()
    label.text = "Label"
    label.onClick = {
        // TODO
    }
}

제약 조건을 설정하는 것을 잊지 마세요.그렇지 않으면 화면에 표시되지 않습니다.

다른 모든 답변과 더불어 라벨의 위치에 따라 일부 하위 뷰 뒤에 있을 수 있습니다.라벨을 탭하고 있다고 생각할 수도 있지만, 상단의 뷰를 클릭할 수도 있습니다.이 문제를 해결하려면 다음 선을 사용하여 레이블 보기를 앞으로 가져올 수 있습니다.

self.view.bringSubviewToFront(lblView)

위의 솔루션에서 설명한 바와 같이 먼저 사용자 상호 작용을 활성화하고 탭 제스처를 추가해야 합니다.

이 코드는 다음을 사용하여 테스트되었습니다.

Swift4 - Xcode 9.2

yourlabel.isUserInteractionEnabled = true
yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                //TODO 
            })

언급URL : https://stackoverflow.com/questions/33658521/how-to-make-a-uilabel-clickable