UILabel에서 터치 이벤트를 처리하고 IBAction에 연결


101

좋아, 그래서 UILabel"시작하려면 누르기"라는 몇 가지 기본 텍스트를 표시하는 인터페이스 빌더를 만들었습니다.

사용자 UILabel가 IBAction 메서드를 실행하고 싶습니다 : -(IBAction)next;레이블의 텍스트를 업데이트하여 새로운 것을 말합니다.
이렇게하면 내 방법에서 내 레이블로 연결을 드래그 한 다음 버튼처럼 내부 터치 업을 선택할 수 있다면 정말 편리 할 것입니다. 그러나 아아, 시가는 없습니다.

그래서 어쨌든, 내 질문은 UILabel이것이 작동 하도록 하위 클래스 를 만들어야합니까? 또는 레이블 위로 버튼을 드래그하여 0 % 불투명하게 만들 수있는 방법이 있습니까? 아니면 내가 놓친 더 간단한 해결책이 있습니까?

답변:


255

확인 해봐:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

트릭은 사용자 상호 작용을 활성화하는 것입니다.


1
레이블이 여러 개인 경우 어떻게합니까? 어떤 것을 두드 렸는지 어떻게 구별 할 수 있습니까?
학습자

1
@learner는 tag 속성을 사용해보십시오. labelTap 대신 labelTap :을 사용해야합니다. 사용-(void) labelTap : (id) sender ;.
thedjaney

1
@thedjaney 보낸 사람은 UILabel이 아닌
UITapGestureRecognizer입니다

TapGestureRecognizer는 내부 터치 업과 동일하지 않으며 휴먼 인터페이스 적합성 및 접근성을 잃습니다.

1
@ h4labs UITapGestureRecognizer를 사용할 수 있습니다. * tapGesture = sender; 다음 tapGesture.view.tag와 라벨 태그를 얻을
DJTano

70

UILabel은 UIResponder에서 상속 된 UIView에서 상속됩니다. 모든 UIresponder 객체는 터치 이벤트를 처리 할 수 ​​있습니다. 따라서 (UIlabel 포함) 뷰에 대해 아는 클래스 파일에서 다음을 구현하십시오.

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

인터페이스 빌더에서 UILabel의 태그 값을 설정하십시오. touchesBegan 메서드에서 터치가 발생하면 태그가 속한 뷰의 태그 값을 확인합니다.

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

IBOutlet 접두사로 UILabel 인스턴스 변수를 선언하여 인터페이스 빌더의 UILabel 객체와 클래스 파일의 코드를 연결합니다.

IBOutlet UILabel *label;

그런 다음 인터페이스 빌더에서 연결할 수 있습니다.


31
참고로, 인터페이스 빌더에서 "사용자 상호 작용 사용"을 선택해야합니다. 그렇지 않으면 작동하지 않습니다.
midas06

이 방법으로 한 가지 문제가 발생했습니다. 뷰 컨트롤러가 직접로드되었을 때 제대로 작동했지만, 탐색 컨트롤러를 만들고 레이블이 포함 된 컨트롤러를 탐색 컨트롤러에 푸시 한 다음 표시하면 터치가 더 이상 레이블에 도달하지 않는 것 같습니다. 어떤 아이디어?
midas06

푸시하는 것과 동일한 뷰 컨트롤러 클래스이면 작동합니다. 다른 작은 문제가있는 것 같습니다. 어쩌면 또 다른 질문을 시작하고 몇 가지 코드를 게시
리무버

5
태그가 필요하지 않은 유사한 방법은 touch.view가 레이블에 대해 설정 한 콘센트와 동일한 지 확인하는 것입니다. 태그를 추적 할 필요가 없음을 의미하므로 이것을 선호합니다.
조각 모음

훌륭한 솔루션. 다른 곳을 클릭하면 태그 값이 0이되므로 태그를 0으로 설정하지 않는 것이 좋습니다. 이는 뷰의 태그 값이 0 일 가능성이 높기 때문입니다. 그렇지 않으면 뷰의 태그를 다음과 같이 설정할 수 있습니다. -1과 같이 태그 값 0을 다른 곳에서 사용할 수 있습니다. 즉, 버튼
kevinl

30

UIButton을 사용하여 투명하게 만들 수 있습니다 (예 : 이미지가없는 사용자 정의 유형). UILabel을 추가 할 수 있습니다 (중앙). 그런 다음 일반 버튼 이벤트를 연결합니다.


동의합니다. 맞춤 버튼 유형은 UILabel 유형의 사용자 경험을 제공해야합니다.
stitz 2010

2
+1, 멋지고 간단합니다. 나는 작동하지 않는 일반 버튼을 opactiy 0으로 설정하여 이전에 이것을 시도했지만 유형을 사용자 정의로 변경하는 팁은 완벽하게 작동했습니다.
Brian Moeskau

불투명도는 버튼과 모든 하위 뷰에 영향을 미치므로 불투명도 = 0은 모든 것을 보이지 않게 만듭니다.
Eiko 2010-08-14

10
Yikes. 이것은이 스레드의 다른 솔루션에 비해 해킹입니다. 레이블에서 탭 제스처를 인식하려면 레이블에서 탭 제스처 인식기를 사용하십시오. (그것이이 의미 한 것처럼 읽는 방법을 참조하십시오)
제임스 Boutcher

버튼이 탭 (시작)이 아닌 내부에서 터치 업을 처리하기 때문에 이것은 훨씬 더 나은 솔루션입니다.

17

스위프트 3

IBOutlet이 있습니다.

@IBOutlet var label: UILabel!

사용자 상호 작용을 활성화하고 제스처 인식기를 추가합니다.

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

마지막으로 탭 처리

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

2
이 작업을 수행하려면 @objc를 userDidTapLabel에 추가해야했습니다. 빠른 4 가지가 될 수 있습니다.
POSIX 준수
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.