2011-08-30 36 views
1

我正在使用UIPinchGestureRecognizer擴展/縮小uiview。當使用捏手勢時,uiview的界限是否會發生變化?

UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleElement:)]; 
[pinchGesture setDelegate:self]; 
[element addGestureRecognizer:pinchGesture]; 
[pinchGesture release]; 

//量表元件方法

- (void)scaleElement:(UIPinchGestureRecognizer *)gestureRecognizer { 
    UIView *element = [gestureRecognizer view]; 
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer]; 
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan){ 
     lastTouchPosition = [gestureRecognizer locationInView:element]; 
    } 
    else if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged){ 
      CGPoint currentTouchPosition = [gestureRecognizer locationInView:element]; 
      CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition]; 
      float distance = sqrt(deltaMove.x*deltaMove.x + deltaMove.y*deltaMove.y); 
      float hScale = 1 - deltaMove.x/distance * (1-gestureRecognizer.scale); 
      float vScale = 1 - deltaMove.y/distance * (1-gestureRecognizer.scale); 
      if (distance == 0) { 
       hScale = 1; 
       vScale = 1; 
      } 
      element.transform = CGAffineTransformScale([element transform], hScale, vScale); 
      CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale); 
      element.bounds = CGRectApplyAffineTransform(element.bounds, transform); 
       [gestureRecognizer setScale:1]; 
       lastTouchPosition = currentTouchPosition; 
      } 
      if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) { 
       NSLog(@"scaling over"); 
       NSLog(@"bounds = %@",NSStringFromCGRect(element.bounds)); 
       NSLog(@"frame = %@", NSStringFromCGRect(element.frame)); 
      } 
      NSLog(@"scalePiece exit"); 
    } 

//adjustAnchorPointForGestureRecognizer method 

    - (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
     if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { 
      UIView *elementToAdjust = gestureRecognizer.view; 
      [self.view bringSubviewToFront:gestureRecognizer.view]; 
      CGPoint locationInView = [gestureRecognizer locationInView:elementToAdjust]; 
      CGPoint locationInSuperview = [gestureRecognizer locationInView:elementToAdjust.superview]; 
      elementToAdjust.layer.anchorPoint = CGPointMake(locationInView.x/elementToAdjust.bounds.size.width, locationInView.y/elementToAdjust.bounds.size.height); 
      elementToAdjust.center = locationInSuperview; 
     } 
    } 

控制檯打印:

bounds = {{0, 0}, {178.405, 179.018}} 
frame = {{300.642, 566.184}, {192.899, 194.227}} 

當框架改變爲什麼沒有邊界調整? 它有什麼與自動調整大小的面具,因爲我有這個視圖的子視圖?

回答

2

這與UIPinchGestureRecognizer無關。這與你設置transform來執行縮放有關。更改transform不會更改bounds。它只是改變這個視圖的座標空間(bounds)如何映射到超視圖的座標空間(frame)。如果您需要bounds以匹配frame,則必須直接更改其中一個,而不是使用transform。也就是說,你通常應該使用transform,因爲它更快。

編輯

如果你不是說要擴大,而是意味着要調整的觀點,呼籲setBounds:。您可以通過將變換應用於bounds而不是元素來找到新的bounds

CGPoint currentTouchPosition = [gestureRecognizer locationInView:element]; 
CGPoint deltaMove = [self calculatePointDistancewithPoint1:currentTouchPosition andPoint2:lastTouchPosition]; 
... 

CGAffineTransform transform = CGAffineTransformMakeScale(hScale, vScale); 
self.bounds = CGRectApplyAffineTransform(self.bounds, transform); 
+0

那麼你如何建議我改變視圖的界限? – Viraj

+0

gestureRecognizer沒有屬性轉換。你的意思是[gestureRecognizer視圖] .transform? – Viraj

+0

看看這段代碼是否更清晰。 –