2016-10-21 1 views
0

프로그래밍 방식으로 뷰를 만들 수있는 기본 UI에 버튼이 있습니다. 그것은 아래쪽에 있습니다. PanGestureRecognizer를 사용하여 이동할 수있는 녹색 원으로 나옵니다.더블 탭 게이지 인식기와 신속한 흐름을 사용하여 pangesturderecognizer 끄기

내 목표는 TapGestureRecognizer를 사용하여 PanGestureRecognizer를 끄는 것입니다 (필자는 두 번 탭으로하고 싶습니다). 필자가 두 번 탭하면 특정 뷰를 잠글 수 있습니다.

이것은 내가 지금까지 가지고있는 코드입니다. 보기를 탭하면 실제로 색상이 변경되지만 PanGestureRecognizer를 사용하지 않도록 설정하는 방법을 알 수 없습니다.

class MakeACircle: UIView { 
var circleCenter = CGPoint() 
    let tap = UITapGestureRecognizer() 
    let panGesture = UIPanGestureRecognizer() 
    var checkSomething = 1 



    init() { 

     super.init(frame: CGRect(x: 0.0, y: 0.0, width: 100, height: 100)) 
     self.layer.cornerRadius = 50.0 
     self.backgroundColor = UIColor.green 
     self.isUserInteractionEnabled = true 
     UITapGestureRecognizer().numberOfTapsRequired = 2 
     } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    func dragCircle(gesture: UIPanGestureRecognizer) { 
     let target = gesture.view! 

     switch gesture.state { 
     case .began, .ended: 
      circleCenter = target.center 
     case .changed: 
      let translation = gesture.translation(in: self.superview) 
      target.center = CGPoint(x: circleCenter.x + translation.x, y: circleCenter.y + translation.y) 
     default: break 
     } 
    } 

    func freeze(gesture: UITapGestureRecognizer) { 

      switch checkSomething { 
      case 1: 
       self.panGesture.isEnabled = false 
       self.backgroundColor = UIColor.blue 
       checkSomething += 1 
       print(checkSomething) 


      case 2: 
       self.panGesture.isEnabled = true 
       self.backgroundColor = UIColor.red 
       checkSomething -= 1 
       print(checkSomething) 

      default: 
       break 
      } 

     } 
} 

나는 ... 당신이 볼 수있는 나는 그것을 색상을 설정하는가에있는 스위치가, 도청 작업이 IBButton

@IBAction func makeACircle(_ sender: UIButton) { 
    let something = MakeACircle() 
    self.view.addSubview(something) 

    something.addGestureRecognizer(UIPanGestureRecognizer(target: something, action: #selector(something.dragCircle(gesture:)))) 
    something.addGestureRecognizer(UITapGestureRecognizer(target: something, action: #selector(something.freeze(gesture:)))) 

    something.center = self.view.center 

} 

과 프로그래밍 뷰를 생성하고이 번호를 인쇄하고 색상이 변합니다 ..하지만 한 번만 탭하면 팬이 계속 켜져 있습니다.

어떤 통찰력이라도 대단히 감사합니다! 이것은 나의 첫 실행이며, 나는 문앞에 있음을 알고 있지만, 나는 그것을 알아낼 수 없다.

+0

나는 이해하지만, 'cancelsTouchesInView'를 보았습니다. 문서를 보면 '이 속성이 true (기본값)이고 수신자가 제스처를 인식하면 보류중인 해당 제스처의 터치는보기로 전달되지 않고 이전에 전달 된 터치는 touchesCancelled (_ :와 함께 취소됩니다. :) 메시지를 보냈습니다. 제스처 인식기가 제스처를 인식하지 못하거나이 속성의 값이 false이면 멀티 터치 시퀀스에서 모든 뷰를 볼 수 있습니다. " – mat

+0

설명이 약간 변경되었으므로 도움이 될 것입니다. 나는 터치 제스처를 통해 팬 제스처를 비활성화하고 활성화 할 수 있기를 원하기 때문에 터치를 취소하고 싶지 않습니다. 따라서보기를 두 번 탭하면 잠겨 있습니다. 다시 두 번 탭하면 다시 움직일 수 있습니다. 좀 더 이해가 되니? 내 인스턴스의 특정 PanGestureRecognizer를 참조하여 내 수업의 코드를 사용하지 않도록 설정하는 방법을 알아낼 수 없습니다. 내가 잘못 생각한 부분입니다. { 스위치 탭 { 경우 1! : 만약 탭 = TRUE { self.panGesture.isEnabled = 거짓 self.backgroundColor = 당신의 도움이 –

+0

그냥 멍 생각 ... FUNC 동결 (UITapGestureRecognizer 제스처)에 대한 감사 UIColor.blue } 경우 2 : 경우이 탭 == 사실 { self.panGesture.isEnabled = 사실 self.backgroundColor = UIColor.red } 기본 : 휴식 } } //이 일이 어떻게되는지보십시오 ... – Joe

답변

2

MakeACircle() 객체를 추가 할 때 self.panGesture에 대한 참조를 저장하지 않는 것처럼 보입니다. 비활성화하려고하면 아무 것도 수행하지 않습니다. self.panGesture는 어디에 설정되어 있습니까? 대신이의

:

something.addGestureRecognizer(UIPanGestureRecognizer(target: something, action: #selector(something.dragCircle(gesture:)))) 

이 시도 :

something.panGesture = UIPanGestureRecognizer(target: something, action: #selector(something.dragCircle(gesture:))) 
something.addGestureRecognizer(something.panGesture) 

UPDATE 당신의 탭 제스처 인식기

, 당신은 또한에 대한 참조를 저장하고 있는지 확인 당신이 팬 제스처와 같은 방식으로.

UITapGestureRecognizer().numberOfTapsRequired = 2 

하지만 당신이

something.addGestureRecognizer(UITapGestureRecognizer(...)) 

그래서 당신이해야 말했을 때 추가 한 같은 탭 제스처 아니기 때문에 그것은 아무것도하지 않습니다 : 당신의 init()에서

는, 당신은 다른 제스처로했던 것과 비슷합니다.

something.tap = UITapGestureRecognizer(target: something, action: #selector(whatever)) 
something.tap.numberOfTapsRequired = 2 
something.addGestureRecognizer(something.tap) 
+0

나는 당신을 사랑합니다. 이것은 효과가있다! 그것은 또한 클래스 내에서 이러한 것들을 작동시키는 방법에 대한 약간의 통찰력을 제공합니다. 그래서 저는 매우 감사드립니다! –

+0

@TomMohr 나는 그것이 당신을 위해 일해서 기쁘다! 질문은 "어디에 설정되어 있습니까?" 및 "정의 된 위치는 무엇입니까?" 이처럼 많은 혼란스러운 버그에 대해 올바른 방향으로 인도 할 것입니다. – LulzCow

+0

ok - 후속 질문을 할 수 있습니까? 탭 인식기가 두 번 두드리면 시작됩니다. 다음과 같이합니다. 1 읽는 데 아무리 노력해도 아무 것도 작동하지 않습니다. 나는 다시 손가락의 끝 부분에있는 것처럼 느낀다. (다시 한 번 도울 수 있다면 고맙다.) –