2013-10-30 2 views
2

타이머가 실행 중이고 화면에서 버튼을 드래그하려고 할 때 타이머가 지연됩니다. 이것은 타이머가 움직이는 이미지이기 때문에 눈에.니다.PanGesture로 인한 지연 타이머?

뭔가를 변경하여 문제를 해결할 수있는 방법이 있습니까, 아니면 전체 프로젝트를 변경해야합니까?

답변

1

CoreAnimation (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/coreanimation_guide/introduction/introduction.html) 또는 간단한 애니메이션의 경우 UIView의 animateWithDuration:animations 메서드 (https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/clm/UIView/animateWithDuration:animations :)를 사용하는 것이 좋습니다.

이유는 외부 이벤트에 관계없이 Apple 프레임 워크가 애니메이션 타이밍을 정확하고 매끄럽게 유지하려고하기 때문입니다. 즉, 외부 이벤트로 인해 애니메이션이 일부 프레임을 드롭하면 프레임 워크는 지정된 기간 동안 애니메이션을 적절히 보간하여 비교적 멋진 애니메이션을 생성합니다.

  1. 가 사이의 차이를 기반으로 애니메이션
  2. 화재 일정한 간격
  3. 에서 타이머의 시작 부분에 시간을 기억

    당신은 타이머를 고수 할 경우

    는, 보간 자신을 새로운 시간과 원래 시간, 애니메이션의 총 재생 시간과 이동 거리를 고려하여 이미지의 위치를 ​​계산하십시오.

T 그의 결과는 단순한 "Y 픽셀마다 Y 픽셀의 이미지 이동"접근 방식보다 더 매끄러운 결과를 만들어 낼 것이며 애니메이션이 정확히 지정된 기간 동안 실행되도록 보장합니다.

0

NSTimer은 실행 루프에서 이벤트로 구현됩니다. 그것은 언제 발사 될지에 대한 어떤 약속도하지 않으며, 시간이 중요한 모든 것에는 적합하지 않습니다. NSTimer이 1 초에 두 번 이상 발사된다면, 아마도 잘못된 것을 사용하고있을 것입니다. 런 루프가 빠르게 처리되지 못하게하는 일을 수행하면 확실히 타이머 문제가 발생할 것입니다.

팬 제스처 인식기는 주 실행 루프에 많은 메시지를 보낼 수 있습니다. 일반적으로 괜찮 으면 좋겠지 만, 특히 이동 콜백에서 중요한 작업을 수행하지 않으면 확실히 타이머를 방해 할 수 있습니다.

일반적으로 올바른 해결책은 UIView 애니메이션, Core Animation 또는 UIKit Dynamics를 사용하여 화면에서 물건을 움직이는 것입니다. 그것이 바로 이러한 도구가 구축 한 것입니다. @ksimons는 좋은 링크를 제공합니다. GCD 타이머는 일반적으로 NSTimer보다 빠른 솔루션입니다.

타이머를 사용하여 화면을 업데이트해야하는 경우 NSTimer 대신 항상 CADisplayLink을 사용해야합니다. 사람들이 자주 범하는 실수는 NSTimer이 화면보다 빠르게 업데이트되도록 예약하는 것입니다. CADisplayLink은 애니메이션이 아닌 사용자 지정 그리기 상황에 가장 적합합니다. 다시 말하지만, 매우 훌륭한 애니메이션 프레임 워크가 있습니다.