2014-03-05 28 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

原來,變焦速度過快實際上是鏈接答案代碼中的一個錯誤。可悲的是,這實際上並沒有回答我的實際問題(爲此我仍然希望得到答案!),但它確實有助於解決我的客戶的問題。

注意在那個重置gestureRecognizer回1底部添加一行:

- (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