Подтвердить что ты не робот

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

Любые мысли?

4b9b3361

Ответ 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