CGAffineTransformMakeScale使UIView在缩放前跳转到原始大小

时间:2010-10-15 23:10:19

标签: objective-c cocoa-touch ipad ios4

我有一个UIView,我设置为响应捏手势并改变它的大小,除了,一旦你放大它然后尝试再次捏它,它跳到它的原始大小(恰好是100x200) 。这是代码:

@implementation ChartAxisView


- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // do gesture recognizers
        UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(onPinch:)]; 
        [self addGestureRecognizer:pinch]; 
        [pinch release];
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGColorRef redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0].CGColor;

    CGContextSetFillColorWithColor(context, redColor);
    CGContextFillRect(context, self.bounds);
}

- (void)onPinch: (UIPinchGestureRecognizer*) gesture {  
    self.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale);
}

- (void)dealloc {
    [super dealloc];
}


@end

有什么想法?

3 个答案:

答案 0 :(得分:27)

因此,有两种类型的Scale(或一般转换)函数:CGAffineTransformMakeScaleCGAffineTransformScale

您使用的第一个CGAffineTransformMakeScale始终会根据图像的原始大小进行转换。这就是为什么你会在缩放发生之前看到跳转到原始大小的原因。

第二个CGAffineTransformScale,从图像的当前位置转换。这就是你需要的。为此,它需要一个额外的'转换'arg。您的案例中的“变换”arg代表放大的图像。

阅读有关转化的this非常翔实的博客文章。

答案 1 :(得分:2)

- (void)onPinch: (UIPinchGestureRecognizer*) gesture {  

  if ([gesture state] == UIGestureRecognizerStateBegan) 
  {
    curTransform = self.transform;
  }

  self.transform = CGAffineTransformScale(curTransform,gesture.scale, gesture.scale);
}
  • 使用CGAffineTransformScale而不是CGAffineTransformMakeScale
  • 您需要一名会员 - > CGAffineTransform curTransform;

答案 2 :(得分:2)

您可以使用以下代码设置转换:

ivClone setTransform:CGAffineTransformMakeScale(scale, scale)];

你可以通过以下coee获得当前的变换:

newV.transform.a //x scale
newV.transform.d // y scale