2009-05-24 13 views
18

D-Pad에서 오른쪽 버튼을 누른 상태에서 Mario가 어떻게 계속 오른쪽으로 돌아가는지 알 수 있습니까? 같은 방식으로, UIButton이 계속 누르고있는 동안에도 UIButton의 동작을 계속 실행하길 바란다. UIButton이 가능합니까? 그렇지 않은 경우 UIImageView를 사용하여 터치 처리 메서드를 특정 방식으로 재정 의하여 할 수 있습니까? 실제로 UIButton을 사용하여이 작업을 수행하려고 시도하기 전에 터치 처리 방법으로 확인한 UIImageViews (D-Pad로 작동하도록 정렬 됨)가 있었지만 상황이 더러워지기 시작하여 UIButton에서이 작업을 더 쉽게 수행 할 수 있다고 생각했습니다. 전환했습니다. 지속적이고 고정 된 (움직이지 않은) 다운 터치에 대한 인식을 얻는 방법을 아는 사람이라면 누구나 공유하십시오.누르고있는 동안 UIButton을 계속해서 발사하는 방법은 무엇입니까?

답변

32

버튼을 사용하지 마십시오, 멀티 터치 및 NSTimer 사용

다음, 사용자의 인터페이스 내부에보기 로컬 NSTimer 개체를 만들기 시작하는 데 사용을 취소/타이머

-(void)movePlayer:(id)sender { 
    <Code to move player> 
} 

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    timer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(movePlayer:) userInfo:nil repeats:YES]; 
} 

-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event { 
    if (timer != nil) 
     [timer invalidate]; 
     timer = nil; 
} 

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    if (timer != nil) { 
     [timer invalidate]; 
     timer = nil; 
    } 
} 

이 그런데 미리 정의 된 간격으로 이벤트를 반복 할 수 있으며 버튼을 사용하지 않고 원하는 반복 동작을 얻을 수 있습니다. touchesMoved 트리거 - 손가락을 움직이면 타이머가 취소되고 플레이어가 움직이지 않습니다.

+0

2 개의 터치가 있습니다 .2 번째는 touchesMoved 여야합니다. – freespace

+0

위대한, 비록 당신이 의도 touchesMoved 중복 touchesBegan 트리거를 수정할 수 있지만 아무도 혼란스러워. – RexOnRoids

40

이전 답변과 비슷한 방법으로 UIButton을 사용할 수도 있습니다.

타이머를 "터치 다운"에서 시작하고 타이머를 "내부 위로 터치"또는 "외부로 터치"로 중지 시키십시오.

저는 개인적으로 코딩 할 필요가없는 시각적으로 강화 된 기능을 제공하기 때문에 개인적으로 UIButtons를 사용합니다. 나를 위해

+8

그냥 타이머를 멈추게하기 위해 "Touch Up Inside"및 "Touch Up Outside"이벤트를 구성해야합니다. – gerry3

+1

제 생각에는 선택한 것보다 더 나은 대답입니다. 인터페이스 빌더를 통해 구성 할 수 있습니다. 또한 IBActions를 사용하면 일반적으로 touchesBegan 및 frieds보다 코드를 더 명확하고 이해하기 쉽습니다. – txulu

+1

이 방법을 사용하면 UIControlEventTouchCancel을 처리하는 것을 잊지 마십시오. (비록 NSTimer를 캡슐화하는 UIButton 서브 클래스를 권장하지만 View Controller는 너무 커서 경향이 있으므로 View Controller의 코드 _out을 옮길 수있는 모든 것이 좋은 방법입니다.) –

2

다음 작품 :

  1. 는 만들기 버튼을 클릭합니다.
  2. 보기 컨트롤러 또는 하위 클래스에서 두 가지 메서드 (터치하지 않고 터치하기 시작)를 만듭니다.
  3. 제어 이벤트. 터치 업 내부터치 드래그 아웃 둘 다 터치 중지 방법으로 이동하고 터치 다운은 터치 방식으로 시작합니다.
  4. 시작 메서드를 호출 할 때 간격이 약 0.2 인 NSTimer를 시작해야합니다 (호출 속도는 사용자가 결정합니다). true를 반복하고 호출자가 원하는 메서드 (실제 사용자가 버튼을 눌렀을 때 실행하려는 항목).
  5. 중지 메서드를 호출 할 때 타이머 (.invalidate())을 무효화하고 타이머를 nil로 지정해야합니다.

그게 전부입니다!

0

그리고 지금은 완전히 다른 것 :
ReactiveCocoa 6.

self.button.reactive 
    .controlEvents([.touchDown]) 
    .observeValues { button in 
     SignalProducer.timer(interval: .milliseconds(500), on: QueueScheduler.main) 
      .take(until: button.reactive.controlEvents([.touchDragOutside, .touchDragExit, .touchUpInside, .touchUpOutside, .touchCancel]).map { _ in return }) 
      .prefix(value: Date()) 
      .startWithValues { date in 
       NSLog("\(date)") 
      } 
     }