탭에 응답하도록 UILabel을 얻는 방법은 무엇입니까?


94

UITextField보다 훨씬 빠르게 UILabel을 만들 수 있음을 발견했으며 대부분의 경우 데이터 표시 앱에 UILabel을 사용할 계획입니다.

긴 이야기를 짧게 만들기 위해 사용자가 UILabel을 탭하고 내 콜백이 이에 응답하도록하고 싶습니다. 가능합니까?

감사.


1
당신은 지정해야합니다userInteractionEnabled = true
onmyway133

답변:


208

UITapGestureRecognizerUILabel에 인스턴스를 추가 할 수 있습니다 .

예를 들면 :

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

13
아하, 여기서 'userInteractionEnabled'속성이 핵심입니다 (다른 구성은 스토리 보드에서 설정할 수 있고 설정하는 것이 바람직하기 때문에). Label은 기본적으로 상호 작용을 off로 설정하여 터치를 통과하도록합니다.하지만이 경우 제스처 인식기가 활성화 되려면 터치를 관찰해야합니다. 감사!
Marchy jul.

1
잘 했어! 라벨에 탭을 던 졌는데 사용자 상호 작용을 활성화하는 것을 완전히 잊었습니다. 감사!
마이크 Critchley

37

스토리 보드를 사용하는 경우 추가 코드없이 스토리 보드에서 전체 프로세스를 수행 할 수 있습니다. 스토리 보드에 레이블을 추가 한 다음 레이블에 탭 제스처를 추가하십시오. 유틸리티 창에서 레이블에 대해 "사용자 상호 작용 활성화"가 선택되어 있는지 확인합니다. 탭 제스처 (스토리 보드의보기 컨트롤러 하단에 있음)에서 ctrl + 클릭하고 ViewController.h 파일로 드래그하고 액션을 만듭니다. 그런 다음 ViewController.m 파일에서 작업을 구현합니다.


스토리 보드없이 인터페이스 빌더 만 사용하여 방법도 사용 가능
Gomino 2010-10-21

Accessibility Traits뿐만 아니라 Attributes inspector 의 View 섹션에서 "User Interaction Enabled"가 선택되어 있는지 확인하십시오 .
SeanR

17

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

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

스위프트 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이 여러 줄 텍스트를 왼쪽 정렬하는 데 항상 문제가있었습니다. 왼쪽 정렬을 가운데로 설정해도 여전히 발생합니다.
Happy

나는 UIButton을 시도해 보았고 꽤 좋습니다. 문제가되는 것은 단지 여러 줄 버튼입니다. 감사.
Happy '

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 {

}

참고 : .h 파일에 UIGestureRecognizerDelegate 추가


2

스위프트 버전 : 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

Alvin George의 Swift 3

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
}

이로 인해 잠재적으로 메모리 누수가 발생할 수 있지만 아직 해결 방법을 결정하지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.