#ios #cocoa-touch #core-animation
#iOS #cocoa-touch #ядро-анимация
Вопрос:
У меня есть родительский UIView, у которого есть дочерний UIView (UILabel, используемый в приведенном ниже коде), для фрейма которого установлены границы родительского, а для авторазмерной маски установлены гибкие ширина и высота:
UIView* parentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
UILabel* childLabel = [[UILabel alloc] initWithFrame:parentView.bounds];
childLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
childLabel.textAlignment = UITextAlignmentCenter;
childLabel.text = @"Hello";
Я хочу иметь возможность анимировать фрейм родительского представления, в частности его размер, и изменять размер вложенного представления как часть анимации:
[UIView animateWithDuration:1.0 animations:^{ parentView.frame = CGRectMake(0, 0, 160, 240); }];
В результате этой анимации я бы хотел, чтобы текст UILabel анимировался вместе с анимацией родительского представления, поэтому визуально вы увидите, что текст перемещается с центра на (160, 240) на (80, 120). Однако вместо анимации появляется, что фрейму вложенного представления немедленно присваивается значение, которое оно должно иметь в конце анимации, поэтому вы видите, что положение текста сразу же меняется при запуске анимации.
Есть ли способ заставить вложенные представления автоматически изменять размер как часть анимации?
Ответ №1:
Я не совсем понимаю, что происходит, но я думаю, что основная проблема заключается в том, что UIKit не хочет перерисовывать текст в каждом кадре анимации, поэтому содержимое UILabel нельзя анимировать. По умолчанию свойство contentMode UILabel имеет значение UIViewContentModeRedraw, что означает, что оно перерисует UILabel до целевого размера, как только свойство будет установлено.
Если вы измените contentMode на UIViewContentModeCenter, содержимое не будет перерисовываться и останется центрированным в UILabel.
childLabel.contentMode = UIViewContentModeCenter;
Комментарии:
1. Это отличная информация. UIViewContentModeCenter работает для того, что мне действительно нужно — для того, чтобы текст оставался центрированным, пока фрейм родительского представления уменьшается или увеличивается. Спасибо.