문제

D-PAD에서 오른쪽 버튼을 누르고 누를 때 마리오가 어떻게 오른쪽으로 계속 달리는 지 알고 있습니까? 같은 방식으로, 나는 내 Uibutton이 그것이 고정 된 기간 동안 지속적으로 행동을 발사하기를 원합니다. Uibutton이 가능합니까? 그렇지 않다면, 이것은 특정 방식으로 터치 처리 방법을 재정의하여 Uiimageview와 관련이 있습니까? 실제로, Uibutton으로 이것을 완료하려고 노력하기 전에 터치 처리 방법으로 확인한 Uiimageviews (d-pad로 기능하도록 배열)가 있었지만 일이 지저분해지기 시작했기 때문에 Uibutton으로 더 쉬워 질 수 있다고 생각했습니다. 전환. 연속적이고 고정식 (노동되지 않은) 다운 터치를 인식하는 방법을 아는 사람이라면 공유하십시오.

도움이 되었습니까?

해결책

버튼을 사용하지 말고 멀티 터치 및 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 방아쇠에 주목하십시오 - 손가락을 움직이면 타이머가 취약되고 플레이어가 움직이지 않습니다.

다른 팁

또한 이전 답변에 표시된 것과 유사하게 수행 할 수 있으며 여전히 Uibutton을 사용할 수 있습니다.

"터치 다운"에서 타이머를 시작하고 타이머가 "내부 터치 업"또는 "외부 터치 업"에서 타이머를 멈췄습니다.

개인적으로, 나는 Uibuttons를 사용하는 것을 좋아합니다. 왜냐하면 그들은 당신이 스스로 코딩 할 필요가없는 시각적 향상을 제공하기 때문입니다.

나에게 다음은 다음과 같습니다.

  1. 버튼을 만듭니다.
  2. View Controller 또는 서브 클래스에서 2 가지 방법 (터치 및 터치 시작)을 만듭니다.
  3. 추가하다 3 제어 이벤트. 내부에 닿아 그리고 드래그 출구를 터치하십시오 둘 다 감동적인 방법을 중단하고 터치하십시오 터치 방법을 시작합니다.
  4. Touching Method가 호출되면 약 0.2 간격으로 Nstimer를 시작해야합니다 (호출하고 싶은 시간이 얼마나 빨리), True를 반복하고 선택기로 호출하려는 방법 (실제 물건이있는 실제 물건이 있습니다. 사용자가 버튼을 누르면 실행하려면).
  5. 터치 방법을 중지하면 타이머를 무효화해야합니다 (.invalidate()) 및 타이머를 nil로 할당하십시오.

그게 다야!

그리고 이제 완전히 다른 것을 위해 :
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)")
            }
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top