답변:
UITapGestureRecognizer
UILabel에 인스턴스를 추가 할 수 있습니다 .
예를 들면 :
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;
스토리 보드를 사용하는 경우 추가 코드없이 스토리 보드에서 전체 프로세스를 수행 할 수 있습니다. 스토리 보드에 레이블을 추가 한 다음 레이블에 탭 제스처를 추가하십시오. 유틸리티 창에서 레이블에 대해 "사용자 상호 작용 활성화"가 선택되어 있는지 확인합니다. 탭 제스처 (스토리 보드의보기 컨트롤러 하단에 있음)에서 ctrl + 클릭하고 ViewController.h 파일로 드래그하고 액션을 만듭니다. 그런 다음 ViewController.m 파일에서 작업을 구현합니다.
스위프트 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
}
스위프트 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")
}
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 추가
스위프트 버전 :
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:")
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")
}
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()
}
저는 개인적으로 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
}
이로 인해 잠재적으로 메모리 누수가 발생할 수 있지만 아직 해결 방법을 결정하지 못했습니다.
userInteractionEnabled = true