0

입니다. 파형의 트림 편집기를 만들고 있는데, 움직임이 뒤처져 있지만 가끔씩 만 발생합니다.UIImageView lags의 움직임은

먼저 앱을 실행하고 완벽하게 작동합니다. 이것은 내가 일어나기를 원하는 것입니다 :

그러면 어떤 코드도 변경하지 않고 다시 실행하고 동작은 뒤처집니다. 그 동영상은 다음과 같습니다 : https://www.youtube.com/watch?v=9fZTV877hSA

때로는 효과가 있고 때로는 그렇지 않습니다.

작동 방식에 대한 간단한 개요 : 사용자가 확대하거나 팬 할 수있는 파형이 있습니다. 파형은 샘플로 나뉘어 지므로 먼저 트림 편집기의 x 좌표 아래에 샘플을 찾은 다음 줌 또는 팬으로 인해 샘플이 변경되면 뒤로 작업하여 트리밍 편집기가 어떤 샘플을 사용해야하는지 파악하고 트림 편집기와 그 구성 요소를 새로운 해당 샘플로 이동하십시오. 여기

내가 그 합성 그런

@property (strong, nonatomic) UIView *editor; 
@property (nonatomic, strong) UIPanGestureRecognizer *panGesture; 
@property (nonatomic, assign) CGFloat leftHandleSamples; 
@property (nonatomic, assign) CGFloat rightHandleSamples; 
@property CGFloat leftXDimension; 
@property CGFloat rightXDimension; 

를 초기화하는 방법입니다. 그런 다음

내가있는 viewDidLoad이 gestureRecognizer을 추가

self.waveformPanRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleWaveformPanGesture:)]; 
    self.waveformPanRecognizer.delegate = self; 
    [self.waveform addGestureRecognizer:self.waveformPanRecognizer]; 

그리고이

-(IBAction)edit:(id)sender { 

    if (player.duration) { 


     editor = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.waveform.frame.size.width/2, 22)]; 
     [editor setCenter: CGPointMake(self.waveform.center.x, self.waveform.center.y)]; 


     editor.backgroundColor = [UIColor grayColor]; 
     editor.alpha = .75; 
     [self.view addSubview:editor]; 

     leftHandleSamples = self.waveform.zoomStartSamples + (self.waveform.zoomEndSamples-self.waveform.zoomStartSamples) * (leftHandle.frame.origin.x)/self.waveform.bounds.size.width; 

     rightHandleSamples = self.waveform.zoomStartSamples + (self.waveform.zoomEndSamples-self.waveform.zoomStartSamples) * (rightHandle.frame.origin.x +rightHandle.frame.size.width)/self.waveform.bounds.size.width; 

    } 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return YES; 
} 


- (IBAction)handleWaveformPanGesture:(UIPanGestureRecognizer *)recognizer { 

    leftXDimension = ((leftHandleSamples - self.waveform.zoomStartSamples)/(self.waveform.zoomEndSamples-self.waveform.zoomStartSamples)) *(self.waveform.frame.size.width); 

    rightXDimension = ((rightHandleSamples - self.waveform.zoomStartSamples)/(self.waveform.zoomEndSamples-self.waveform.zoomStartSamples)) *(self.waveform.frame.size.width); 

    editor.center = CGPointMake((rightXDimension - leftXDimension)/2 + leftXDimension, editor.center.y); 

} 

그래서 무슨 일하는 것은 이것이다 :

이의 말을하자 실제로의 일부입니다 leftHandlesample 325 (파형)은 x 축 위치 20에 있습니다. 사용자가 파형을 왼쪽으로 이동하면 leftHandleSample 325가 x 축 위치 10에 있다고 가정 해 봅니다.

는 팬 제스처 위의 트림 편집기의 왼쪽 핸들도 그래서 leftHandleSample가 업데이트되지 않습니다 x 축 위치 (10)

에 가야 있도록 파형과 함께 이동하는 편집기를 알려줍니다. 사용자가 파형을 이동 한 후 샘플이있는 위치에 따라 x 값만 다시 계산됩니다.

그러나 지연이있는 것 같습니다 (일부만 해당). 그게 바로 당황한 것입니다.

내가 무엇을해야하나요? 감사.

+0

최소 테스트 케이스를 만들 수 있습니까? 문제에 영향을 미치지 않습니까? 예를 들어, 손잡이 이미지, 집어 넣는 제스처 등? 모든 것을 정수 값으로 만드는 경우에도 같은 문제가 계속 발생합니까? –

+0

예, 방금 pangesturerecognizer를 제거했습니다. 편집 작업에서 하위 뷰를 추가하지 않았고 leftHandle.center 및 rightHandle.center를 제거했으며 CGFloat 대신 int에 leftXDimension 및 rightXDimension을 설정했습니다. ? 모든 것의 중심을 정수 값으로 만드는 것?). 지금까지 같은 문제. – MScottWaller

+0

관련없는 코드를 질문에서 삭제할 수 있습니까? 또한 handleWaveformPanGesture가 실제로 제스처 인식기를 참조하지 않기 때문에 어떻게 작동하는지 이해할 수 없습니다. –

답변

1

따라서 두 개의 제스처 인식기가있어 사용자가 팬하면 둘 다 트리거됩니다. 그 중 하나는 사용자의 제스처를 기반으로 파형의 위치를 ​​업데이트합니다. 다른 하나는 사용자의 제스처를 무시하지만 액션 메소드를 사용하여 파형의 현재 위치를 기반으로 핸들 위치를 업데이트합니다.

여기에서 지연 될 수있는 이유는 파형 및 핸들이 업데이트되는 순서를 제어하지 않기 때문입니다. 각 프레임에서 파형 제스처 인식기가 먼저 트리거 된 다음 핸들의 인식기가 두 번째로 실행되면 두보기의 최종 위치가 잘게됩니다 (첫 번째 비디오에서와 같이). 그러나 순서가 바뀌면 핸들은 이전의 파형 위치를 기반으로 업데이트되고 이면 제스처 인식기를 기반으로 파형이 업데이트됩니다. 결과는 핸들이 한 프레임 뒤로되어 볼 수있는 지연을 제공합니다.

인식기가 트리거되는 순서가 지정되지 않았기 때문에 때때로 운이 좋고 가끔은 그렇지 않습니다.

해결책은 제스처 인식기를 사용하여 핸들을 업데이트하지 않는 것입니다. 파형이 업데이트되면 핸들을 호출하여 알림을 보내거나, 대리인 프로토콜을 사용하거나, KVO 등을 사용하여 핸들을 업데이트하도록 지시해야합니다.