2017-10-30 9 views
1

여러 UILabels에서 사용할 tapGestureRecognizer를 하나만 만들려고합니다.여러 UILabels에 대해 tapGestureRecognizer를 하나만 만드는 방법은 무엇입니까?

지금 당장 나는 viewDidLoad의 모든 레이블에 대해 별도의 tapGestureRecognizer를 만들어 적절한 레이블에 추가하고 있습니다. 모든 터치가 분명히 다른 기능을 호출해야하기 때문에 나는이 문제에 부딪쳤다.

이것은 내가 그들을 만드는 방법은 다음과 같습니다

@IBOutlet weak var buttonOne: UILabel! 
@IBOutlet weak var buttonTwo: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 

     //tapGestureRecognizer for buttonOne 

     buttonOne.isUserInteractionEnabled = true 
     let oneGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonOneAction)) 
     buttonOne.addGestureRecognizer(oneGestureRecognizer) 

     //tapGestureRecognizer for buttonTwo 

     buttonTwo.isUserInteractionEnabled = true 
     let twoGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MainViewController.buttonTwoAction)) 
     buttonTwo.addGestureRecognizer(twoGestureRecognizer) 

     ... 

그들은 잘 작동하지만, 어떻게, 어디 하나 tapGestureRecognizer 생성하고 다른 작업과 각 레이블에있는 viewDidLoad에 추가 할 수?

+1

왜 레이블 대신 버튼을 사용합니까? – kirander

답변

1

레이블 당 하나씩 만 작성하면됩니다.

대안으로 모든 대상보기의 공통 수퍼 뷰에 첨부 할 단일 탭 제스처 인식기를 만들고 히트 테스트를 수행하는 코드 묶음을 작성하여 해당 탭이 사용자의 레이블, 하나 인 경우 해당 레이블에 대해 원하는 메소드를 디스패치합니다.

그러나 탭 제스처 인식기의 전체적인 부분입니다. 아마도 여러 탭 제스처 인식기를 사용하는 것보다 이점이없는 코드를 개발하는 데 며칠이 걸릴 것입니다.

1

단일 제스처 인식기 대신 모든 레이블로 공유되는 단일 선택기를 사용할 수 있습니다. 그냥보기 컨트롤러의 속성으로 사용자의 제스처 인식기를 선언하고 해당 메서드 호출되는 하나 확인하기 위해 제스처를 전환 :

class ViewController: UIViewController { 
    @IBOutlet weak var buttonOne: UILabel! 
    @IBOutlet weak var buttonTwo: UILabel! 
    var tap1: UITapGestureRecognizer! 
    var tap2: UITapGestureRecognizer! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     buttonOne.isUserInteractionEnabled = true 
     buttonTwo.isUserInteractionEnabled = true 
     tap1 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     tap2 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     buttonOne.addGestureRecognizer(tap1) 
     buttonTwo.addGestureRecognizer(tap2) 
    } 
    @objc func tapAction(_ gesture: UITapGestureRecognizer) { 
     switch gesture { 
     case tap1: 
      print("buttonOne") 
     case tap2: 
      print("buttonTwo") 
     default: 
      break 
     } 
    } 
} 

편집 : 이미 @Duncan C 댓글을 달았 당신은 또한 제스처 인식기보기를 전환 할 수 있습니다 다음과 같이하십시오 :

class ViewController: UIViewController { 
    @IBOutlet weak var buttonOne: UILabel! 
    @IBOutlet weak var buttonTwo: UILabel! 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     buttonOne.isUserInteractionEnabled = true 
     buttonTwo.isUserInteractionEnabled = true 
     let tap1 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     let tap2 = UITapGestureRecognizer(target: self, action: #selector(tapAction)) 
     buttonOne.addGestureRecognizer(tap1) 
     buttonTwo.addGestureRecognizer(tap2) 
    } 
    @objc func tapAction(_ gesture: UITapGestureRecognizer) { 
     print("gesture") 
     guard let label = gesture.view as? UILabel else { return } 
     switch label { 
     case buttonOne: 
      print("buttonOne") 
     case buttonTwo: 
      print("buttonTwo") 
     default: 
      break 
     } 
    } 
} 
+0

... 또는 레이블을 전환 할 수도 있습니다. 그러나 명시된 목표는 각 라벨에 대해 다른 방법을 호출하는 것이 었습니다. –

+0

나는 시도하지는 않았지만 발신자는 제스처 인식 자라고 레이블이 아닙니다. –

+0

제스처 전환은 히트 테스트보다 훨씬 쉽습니다. –