CGAffineTransformMakeScale позволяет перевести UIView в исходный размер до масштаба
У меня есть 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
Любые мысли?
Ответы
Ответ 1
Итак, существуют два типа функций Scale (или, вообще говоря, преобразование): CGAffineTransformMakeScale и CGAffineTransformScale
Первый, CGAffineTransformMakeScale
, который вы используете, всегда преобразуется относительно исходного размера изображения. И именно поэтому вы видите скачок до его первоначального размера до того, как произойдет масштабирование.
Второй, CGAffineTransformScale
, преобразуется из текущей позиции изображения. Это то, что вам нужно. Для этого требуется дополнительный "transform" arg. "Преобразование" arg в вашем случае представляет увеличенное изображение.
Прочитайте этот очень информативный блог о трансформациях.
Ответ 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)];
и вы можете получить текущее преобразование следующим коей:
newV.transform.a //x scale
newV.transform.d // y scale