UILabel을 클릭 가능하게 만드는 방법은 무엇입니까?


136

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

4
당신의 프레임은 무엇입니까 UILabel? 라벨의 프레임을 터치하고 있습니까? 당신은이이 있습니까 UIViews라벨을 포함? 인가 userInteractionEnabled로 설정 True레이블에 대한?
JAL

UILabel IBOutlet이 펜촉 또는 스토리 보드에 연결되어 있는지 확인하십시오
aahrens

답변:


178

라벨 에 설정 isUserInteractionEnabled을 시도 했습니까 ? 이 작동합니다.truetripDetails


1
답변 해주셔서 감사합니다!!! 나는 여기 UITapGestureRecognizer에 대한 또 다른 문제가 : stackoverflow.com/questions/33659078/...
다니엘 B

탭시 배경색을 변경하려고하지만 손가락을 놓으면 탭 이벤트가 시작됩니다. 터치 다운 이벤트를 잡을 수있는 방법이 있습니까? 긴 언론은 내가 찾고있는 것이 아닙니다.
Numan Karaaslan

109

스위프트 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")
    }
}

로 탭 기능에 주석을 달아야했습니다 @objc.
Scott D. Strader

46

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

15

스위프트 3 업데이트

yourLabel.isUserInteractionEnabled = true

1
이것은 나에게 도움이되지 않았다. 테이블 뷰의 라벨에 표시하려고합니다
Pavlos

스토리 보드에 이미 설정되어 있어도 여기에서도 작동합니다.
brainray

14

스위프트 5

@liorco비슷 하지만 @objc@IBAction 으로 바꿔야 합니다.

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에서 작동합니다.


2
@IBActionXcode의 인터페이스 빌더 (따라서 IB)에 메소드를 노출하는 데만 필요합니다. @objc코드 처럼 동작이나 다른 동작을 추가하는 경우 @objc주석 을 사용해야합니다.
Adam

7

좋고 편리한 솔루션 :

ViewController에서 :

@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()
    }
}

스토리 보드에서 레이블을 선택하고 필드 클래스의 "Identity Inspector"에있는 오른쪽 분할 창에서 LabelButton을 선택하십시오.

Label Attribute Inspector "User Interaction Enabled"에서 활성화하는 것을 잊지 마십시오


3

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

예를 들어

yourLabel.userInteractionEnabled = true


이것은 나에게 도움이되지 않았다. 테이블 뷰의 라벨에 표시하려고합니다
Pavlos

2

신속한 3.0의 경우 제스처 길게 누르기 지속 시간을 변경할 수도 있습니다.

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

1

내가 한 것처럼 간과하기는 쉽지만 UITapGestureRecognizer오히려 사용 하는 것을 잊지 마십시오 UIGestureRecognizer.


-4

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

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

스위프트 4-Xcode 9.2

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

나는 Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -> Void)'이것을 시도 할 때 얻는다 .
lionello
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.