CGAffineTransformMakeScale Делает UIView Перейти к исходному размеру до масштабирования - PullRequest
12 голосов
/ 16 октября 2010

У меня есть 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 ]

27 голосов
/ 16 октября 2010

Итак, есть два типа функций Scale (или преобразования в целом): CGAffineTransformMakeScale и CGAffineTransformScale

Первый, CGAffineTransformMakeScale, которым вы являетесьиспользуя, всегда трансформируется относительно исходного размера изображения.И именно поэтому вы видите скачок к его первоначальному размеру до того, как произойдет масштабирование.

Второй, CGAffineTransformScale, преобразуется из текущей позиции изображения.Это то, что вам нужно.Для этого требуется дополнительный аргумент transform.Аргумент 'transform' в вашем случае представляет увеличенное изображение.

Прочитайте это очень информативное сообщение в блоге о преобразованиях.

2 голосов
/ 11 ноября 2013

вы можете установить преобразование с помощью следующего кода:

ivClone setTransform:CGAffineTransformMakeScale(scale, scale)];

и вы можете получить текущее преобразование с помощью следующего кода:

newV.transform.a //x scale
newV.transform.d // y scale
2 голосов
/ 28 октября 2010
- (void)onPinch: (UIPinchGestureRecognizer*) gesture {  

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

  self.transform = CGAffineTransformScale(curTransform,gesture.scale, gesture.scale);
}
  • использовать CGAffineTransformScale вместо CGAffineTransformMakeScale
  • вам понадобится член -> CGAffineTransform curTransform;

;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...