【问题标题】:CGAffineTransformMakeScale Makes UIView Jump to Original Size before scaleCGAffineTransformMakeScale 使 UIView 在缩放前跳转到原始大小
【发布时间】:2011-04-26 04:44:33
【问题描述】:

我设置了一个 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

有什么想法吗?

【问题讨论】:

    标签: objective-c cocoa-touch ipad ios4


    【解决方案1】:

    所以有两种类型的 Scale(或者,一般的变换)函数:CGAffineTransformMakeScaleCGAffineTransformScale

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

    第二个,CGAffineTransformScale,从图像的当前位置变换。这就是你需要的。为此,它需要一个额外的“转换”参数。在您的情况下,“变换”参数代表放大的图像。

    阅读 this 关于转换的内容丰富的博文。

    【讨论】:

    • 此外,即使使用CAAffineTransformScale,自动调整大小也会导致约束干扰位置。
    【解决方案2】:
    - (void)onPinch: (UIPinchGestureRecognizer*) gesture {  
    
      if ([gesture state] == UIGestureRecognizerStateBegan) 
      {
        curTransform = self.transform;
      }
    
      self.transform = CGAffineTransformScale(curTransform,gesture.scale, gesture.scale);
    }
    
    • 使用 CGAffineTransformScale 代替 CGAffineTransformMakeScale
    • 你需要一个成员 -> CGAffineTransform curTransform;

    ;)

    【讨论】:

      【解决方案3】:

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

      ivClone setTransform:CGAffineTransformMakeScale(scale, scale)];
      

      您可以通过以下 coee 获得当前转换:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        • 1970-01-01
        • 2017-11-04
        • 1970-01-01
        • 2023-01-14
        相关资源
        最近更新 更多