我有一个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
有什么想法?
答案 0 :(得分:27)
因此,有两种类型的Scale(或一般转换)函数:CGAffineTransformMakeScale和CGAffineTransformScale
您使用的第一个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);
}
)
答案 2 :(得分:2)
您可以使用以下代码设置转换:
ivClone setTransform:CGAffineTransformMakeScale(scale, scale)];
你可以通过以下coee获得当前的变换:
newV.transform.a //x scale
newV.transform.d // y scale