Применение Масштабного 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) {
//
}];
}
2 ответа
Решение
Я наконец-то узнал, что происходит: Autolayout переставлял подпредставление и менял центр.
Я тестировал этот код в 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}
Так что я бы сказал, нет, это не ожидаемое поведение.