2014-03-05 2 views
4

핀치 줌의 속도를 줄이기 위해 어떻게 UIGestureRecognizer 많은this one같은 예상대로제작 한 UIGestureRecognizer

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer { 

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
     // Reset the last scale, necessary if there are multiple objects with different scales 
     lastScale = [gestureRecognizer scale]; 
    } 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
     [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

     CGFloat currentScale = [[[gestureRecognizer view].layer valueForKeyPath:@"transform.scale"] floatValue]; 

     // Constants to adjust the max/min values of zoom 
     const CGFloat kMaxScale = 2.0; 
     const CGFloat kMinScale = 1.0; 

     CGFloat newScale = 1 - (lastScale - [gestureRecognizer scale]); 
     newScale = MIN(newScale, kMaxScale/currentScale); 
     newScale = MAX(newScale, kMinScale/currentScale); 
     CGAffineTransform transform = CGAffineTransformScale([[gestureRecognizer view] transform], newScale, newScale); 
     [gestureRecognizer view].transform = transform; 

     lastScale = [gestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 
    } 
} 

이, 그러나 나의 클라이언트가 터치 민감하고 싶은 작품. 꼬집기 속도를 내/외 방향으로 줄여 기본 속도의 약 80 %로 확대 할 수 있습니까?

+0

당신이 당신의'scrollView'의 수동'zoomScale'을 설정하려고 했습니까? –

+0

@ NicolasBonnet 유감 스럽지만이 특정 파일은 스크롤 뷰로 래핑되지 않으므로이를 수행 할 수 없습니다. – brandonscript

답변

0

scale에 현재 값을 80 %로 시도 했습니까?

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
     [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

    CGFloat maxScale = 2.0; 
    CGFloat currentScale = [gestureRecognizer scale]; 
    currentScale = 0.8 * currentScale; //80% of scaling 

    if(currentScale < 0.8) 
     currentScale = 0.8; 

    if(currentScale > maxScale) 
     currentScale = maxScale; 

    [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], currentScale, currentScale); 

} 
+0

이것이 효과가있을 것이라고 생각하지만 규모의 가치를 왜 자르지 않는 이유는 그럴 필요가 없다고 생각합니다. – tiguero

+0

크기 조정 속성을 제한 할 수 있으므로 크기 조정 값을 자릅니다. –

+0

오케이 죄송합니다. 원래 코드를 빨리 읽었으며 그 부분을 놓쳤습니다. – tiguero

0

시도해보십시오.

- (void)handlePinching:(UIPinchGestureRecognizer *)gestureRecognizer { 

    if([gestureRecognizer state] == UIGestureRecognizerStateBegan) { 
     if (CGRectIsEmpty(self.initalFrame)) { 
      self.initalFrame = gestureRecognizer.view.frame; 
      // store view's original frame and never change it 
     } 

     if (self.preScale == 0.f) { 
      self.preScale = 1.f; 
     } 

     gestureRecognizer.scale = self.preScale; 
     // gestureRecognizer and view should share the same scale state at the beginning 
    } 

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || 
     [gestureRecognizer state] == UIGestureRecognizerStateChanged) { 

     const CGFloat kMaxScale = 2.0; 
     const CGFloat kMinScale = 1.0; 

     CGFloat newScale = gestureRecognizer.scale; 

     newScale = (newScale - self.preScale) * 0.8 + self.preScale; 

     newScale = MIN(newScale, kMaxScale); 
     newScale = MAX(newScale, kMinScale); 


     CGRect newFrame = self.initalFrame; 
     newFrame.size.height *= newScale; 
     newFrame.size.width *= newScale; 
     gestureRecognizer.view.frame = newFrame; 
     self.preScale = newScale; 
    } 

} 

포인트는 스케일을 구현하는

  • 사용하는 프레임이다.
  • 스케일 변수의 슬로우/스피드 스케일링 변경으로 변경하십시오.
+0

이것으로 꽤 많은 것을 망쳐 봤지만 아무것도 작동하지 않는 것 같습니다. – brandonscript

0

줌의 과도한 속도는 사실 링크 된 응답의 코드에서 버그였습니다. 슬프게도 이것은 실제로 내 실제 질문에 대답하지 않지만 (나는 아직도 대답을 원합니다!), 그러나 그것은 내 고객의 문제를 해결하는 역할을합니다.

주 1에 gestureRecognizer을 다시 재설정 하단의 추가 라인 :

- (void)handlePinchGesture:(UIPinchGestureRecognizer *)gestureRecognizer { 

     ... 

     lastScale = [gestureRecognizer scale]; // Store the previous scale factor for the next pinch gesture call 

     gestureRecognizer.scale = 1; 
     //^added this line 
    } 
} 
+0

오오 그렇습니다. 내 코드에 그 라인을 추가하지 않았습니다. 저의 실수입니다. –

+0

@HimanshuJoshi hrm. 이제 나에게 생각이 떠올랐다. 어쩌면 당신의 제안은 거기에있는 그 라인을 가지고 일할 것이다. 그것을 시도하기 위하여 가고있다. – brandonscript