2012-12-01 18 views
0

可能重複寬度:
Using UIPinchGestureRecognizer to scale uiviews in single direction僅增加高度或使用捏合姿態

我的代碼是下面:

UIPinchGestureRecognizer *croperViewGessture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(croperViewScale:)]; 
     croperViewGessture.delegate=self; 
     [croperView addGestureRecognizer:croperViewGessture]; 

    -(void)CanvasScale:(id)sender 
{ 
    if([(UIPinchGestureRecognizer *)sender state]==UIGestureRecognizerStateBegan) 
    { 
     if ([sender numberOfTouches] == 2) { 
      _pntOrig[0] = [(UIPinchGestureRecognizer *)sender locationOfTouch:0 inView:cropedAngle]; 
      _pntOrig[1] = [(UIPinchGestureRecognizer *)sender locationOfTouch:1 inView:cropedAngle]; 
     } else { 
      _pntOrig[0] = [(UIPinchGestureRecognizer *)sender locationInView:cropedAngle]; 
      _pntOrig[1] = _pntOrig[0]; 
     } 
     _lenOrigX = fabs(_pntOrig[1].x - _pntOrig[0].x); 
     _lenOrigY = fabs(_pntOrig[1].y - _pntOrig[0].y); 
     _xScale = 1.0; 
     _yScale = 1.0; 
    } 
    if ([(UIPinchGestureRecognizer *)sender state] == UIGestureRecognizerStateChanged) { 
     if ([sender numberOfTouches] == 2) { 
      CGPoint pntNew[2]; 
      pntNew[0] = [(UIPinchGestureRecognizer *)sender locationOfTouch:0 inView:cropedAngle]; 
      pntNew[1] = [(UIPinchGestureRecognizer *)sender locationOfTouch:1 inView:cropedAngle]; 

      CGFloat lenX = fabs(pntNew[1].x - pntNew[0].x); 
      CGFloat lenY = fabs(pntNew[1].y - pntNew[0].y); 

      CGFloat dX = fabs(lenX - _lenOrigX); 
      CGFloat dY = fabs(lenY - _lenOrigY); 
      CGFloat tot = dX + dY; 

      CGFloat pX = dX/tot; 
      CGFloat pY = dY/tot; 

      CGFloat scale = [(UIPinchGestureRecognizer *)sender scale]; 
      CGFloat dscale = scale - 1.0; 
      _xScale = dscale * pX + 1; 
      _yScale = dscale * pY + 1; 
     } 
    } 
CGAffineTransform transform = cropedAngle.transform; 
CGAffineTransform newTarnsform = CGAffineTransformScale(transform, _lenOrigX, _lenOrigY); 
[cropedAngle setTransform:newTarnsform]; 

}

但問題是,當我做縮放或縮小,然後查看傳播在整個屏幕上,並禁用後請查看我的代碼,並告訴我什麼是錯的。

請幫我這個問題 我很感謝提前。

+0

你必須實現在'croperViewScale代碼:''不CanvasScale:'或改變這一行'UIPinchGestureRecognizer * croperViewGessture = [[ UIPinchGestureRecognizer ALLOC] initWithTarget:自動作:@selector(croperViewScale :)];''到* UIPinchGestureRecognizer croperViewGessture = [[UIPinchGestureRecognizer的alloc] initWithTarget:自動作:@selector(CanvasScale :)];' –

+0

索裏,無論是相同或我的意思是說兩者是相同的功能,名字我funtion的名字是canvasScale我必須implment現在正確的位置 –

+0

沒得到你.... –

回答

0

看看HERE

你行CGAffineTransformScale(transform, scaleTemp,scaleTemp);使用相同scaleTemp要修改的變量x和的變換y值。

+0

Thnaks Adam!當我在這裏cahnge然後,視圖禁用和它不顯示後,請給我任何例子,解決我的問題 –

+0

你需要做一些計算。類似的問題已經在這裏問:http://stackoverflow.com/questions/6759028/using-uipinchgesture-to-scale-uiviews-in-single-direction –

+0

這個問題也是同樣的問題,當我使用它,並嘗試解決它然後在我的問題中再次成爲它只在y方向旋轉後解決它也增加了高度和寬度不是我的問題另外感謝您的時間有你的任何其他解決方案,所以請告訴我....... .............感謝 –

2

我寫我自己的自定義擴展到UIPinchGestureRecognizer提供一個xScaleyScale,除了正常scale。這是UIPinchGestureRecognizer替代品的下降。您現在可以選擇查看正常的scale或新的xScaleyScale。根據用戶如何進行捏合手勢來相應地使用這些值來縮放視圖。

RMPinchGestureRecognizer.h

#import <Foundation/Foundation.h> 
#import <UIKit/UIGestureRecognizerSubclass.h> 

@interface RMPinchGestureRecognizer : UIPinchGestureRecognizer { 
    CGPoint _pntOrig[2]; 
    CGFloat _lenOrigX; 
    CGFloat _lenOrigY; 
    CGFloat _xScale; 
    CGFloat _yScale; 
} 

@property (nonatomic, readonly) CGFloat xScale; 
@property (nonatomic, readonly) CGFloat yScale; 

@end 

RMPinchGestureRecognizer.m

#import "RMPinchGestureRecognizer.h" 

@implementation RMPinchGestureRecognizer 

@synthesize xScale = _xScale; 
@synthesize yScale = _yScale; 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    [super touchesMoved:touches withEvent:event]; 

    if (self.state == UIGestureRecognizerStateChanged) { 
     if ([self numberOfTouches] == 2) { 
      CGPoint pntNew[2]; 
      pntNew[0] = [self locationOfTouch:0 inView:self.view]; 
      pntNew[1] = [self locationOfTouch:1 inView:self.view]; 

      CGFloat lenX = fabs(pntNew[1].x - pntNew[0].x); 
      CGFloat lenY = fabs(pntNew[1].y - pntNew[0].y); 

      CGFloat dX = fabs(lenX - _lenOrigX); 
      CGFloat dY = fabs(lenY - _lenOrigY); 
      CGFloat tot = dX + dY; 

      CGFloat pX = dX/tot; 
      CGFloat pY = dY/tot; 

      CGFloat scale = [self scale]; 
      CGFloat dscale = scale - 1.0; 
      _xScale = dscale * pX + 1; 
      _yScale = dscale * pY + 1; 
     } 
    } 
} 

- (void)setState:(UIGestureRecognizerState)state { 
    if (state == UIGestureRecognizerStateBegan) { 
     if ([self numberOfTouches] == 2) { 
      _pntOrig[0] = [self locationOfTouch:0 inView:self.view]; 
      _pntOrig[1] = [self locationOfTouch:1 inView:self.view]; 
     } else { 
      _pntOrig[0] = [self locationInView:self.view]; 
      _pntOrig[1] = _pntOrig[0]; 
     } 
     _lenOrigX = fabs(_pntOrig[1].x - _pntOrig[0].x); 
     _lenOrigY = fabs(_pntOrig[1].y - _pntOrig[0].y); 
     _xScale = 1.0; 
     _yScale = 1.0; 
    } 

    [super setState:state]; 
} 

@end 
+0

@感謝Rmaddy:我在IOS是新請告訴我如何在我上面顯示的代碼中使用它。 –

+0

+1作品很有魅力 –

+0

+1。喜歡這個解決方案比較這裏的一個http:// stackoverflow。com/questions/6759028/using-uipinchgesture-scale-uiviews-in-single-direction – iDev