Применение Scale AffineTransform к UIView изменяет его центр

Я запускаю этот код, чтобы уменьшить UIView, когда пользователь нажимает на его супервизор. Однако при применении CGAffineTransformScale () он также меняет центр. Это ожидаемое поведение?

-(void) onTap:(UITapGestureRecognizer *)tap{


    [UIView animateWithDuration:1.2
                          delay:0
                        options:0
                     animations:^{
                         CGAffineTransform transform = self.icon.transform;
                         NSLog(@"Previous center: %@", NSStringFromCGPoint(self.icon.center));

                         self.icon.transform = CGAffineTransformScale(transform, 0.5, 0.5);

                         NSLog(@"Next center: %@", NSStringFromCGPoint(self.icon.center));
                     } completion:^(BOOL finished) {
                         //
                     }];


}

person cfischer    schedule 20.09.2012    source источник
comment
Центр обзора перемещается вниз и влево.   -  person cfischer    schedule 24.09.2012
comment
Не могли бы вы отредактировать код для вывода границ и центра перед вызовом animateWithDuration и в блоке завершения: ^? И добавить фактический вывод NSLog? Я использую MonoTouch и такого поведения не наблюдал. Центр остался на месте, а масштаб изображения увеличился относительно центральной точки.   -  person cod3monk3y    schedule 24.09.2012


Ответы (2)


Я наконец-то понял, что происходит: Autolayout перемещал подвид и менял центр.

person cfischer    schedule 17.10.2012
comment
Я написал небольшое эссе об этой проблеме и некоторых возможных решениях: stackoverflow.com/questions/12943107 / - person matt; 01.01.2013
comment
Я не использую Autolayout и все равно получаю тот же результат. - person durazno; 31.01.2016

Я тестировал этот код в ViewController с помощью ObjC:

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Create a subview
    CGRect bounds = CGRectMake(10, 10, 100, 100);
    UIView* v = [[UIView alloc] initWithFrame: bounds];
    [v setBackgroundColor:[UIColor yellowColor]];
    [self.view addSubview:v];

    icon = v;
}

И запустил анимацию в viewDidAppear:

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"Previous center: %@", NSStringFromCGPoint(self.icon.center));

    [UIView animateWithDuration:1.2 
          delay:1.0 
        options:0 
     animations:^{
         NSLog(@"Before center: %@", NSStringFromCGPoint(self.icon.center));

         CGAffineTransform transform = self.icon.transform;
         self.icon.transform = CGAffineTransformScale(transform, 0.5, 0.5);

         NSLog(@"After center: %@", NSStringFromCGPoint(self.icon.center));
     }
     completion:^(BOOL finished){
         // nothing
         NSLog(@"Completion center: %@", NSStringFromCGPoint(self.icon.center));
     }];        
}

И при каждом звонке центр был одинаковым (60,60):

2012-09-24 10:22:11.776 ScaleView[19611:f803] Previous center: {60, 60}
2012-09-24 10:22:11.778 ScaleView[19611:f803] Before center: {60, 60}
2012-09-24 10:22:11.779 ScaleView[19611:f803] After center: {60, 60}
2012-09-24 10:22:13.979 ScaleView[19611:f803] Completion center: {60, 60}

Поэтому я бы сказал, что нет, это не ожидаемое поведение.

person cod3monk3y    schedule 24.09.2012