Я пытался найти достойный способ плавно анимировать изменение размера кадра на UILabel без странной перерисовки начального прыжка. По умолчанию, когда я делаю что-то вроде этого:
// Assume myLabel frame starts as (0, 0, 100, 200)
[UIView beginAnimations:@"myAnim" context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:1.0];
myLabel.frame = CGRectMake(0.0, 0.0, 50, 100);
[UIView commitAnimations];
Я получаю плавную анимацию с меткой, однако способ, которым она это делает, заключается в том, что он берет перерисованный слой изображения для целевого размера метки и растягивает контент, чтобы он соответствовал текущему, а затем анимируется с Прямоугольник назначения. Это заканчивается очень странным скачком на текстовом дисплее. Вот два изображения, показывающие внешний вид до анимации, а затем сразу после начала анимации:
Предварительная анимация
Пост-анимация
Я пытался использовать только этот слой для анимации, но все равно получаю те же проблемы.
Итак, вопрос в том, как мне этого избежать?
Спасибо за любую помощь,
Скотт
Ответ 2 · рейтинг 7 · titaniumdecoy
Чтобы расширить ответ @ cliclcly: из обзора документации UILabel:
Режим содержимого по умолчанию для класса UILabel - UIViewContentModeRedraw. Этот режим заставляет представление перерисовывать свое содержимое каждый раз, когда изменяется его ограничивающий прямоугольник. Вы можете изменить этот режим, изменив унаследованное свойство contentMode класса.
Из документации свойства contentMode UIView:
Значение этого свойства по умолчанию - UIViewContentModeScaleToFill.
UILabels по умолчанию ведут себя иначе, чем другие UIView, потому что их свойство contentMode по умолчанию отличается.
Ответ 3 · рейтинг 6 · user3099609
Я обнаружил, что анимация кадров UIlabel странная - их размер сразу устанавливается равным конечному размеру, а текст отображается для этого размера. После этого анимируется только изменение позиции, что означает, что если размер назначения равен (0,0), то метка немедленно исчезает. Чтобы обойти это ограничение, я разместил метку внутри представления того же размера, что и вложенные представления, отключил автоматическое изменение размера для метки, и я анимирую супервизор метки вместо самой метки. Конечным результатом является то, что рамка метки полностью анимирована, но содержащийся текст не перерисовывается, скажем, с другим размером шрифта, и при этом не изменяется усечение текста. Он все еще не идеален, но подходит для моей цели.
Исходный кадр:
Во время анимации:
Анимация закончилась:
Ответ 4 · TechZen
Анимация кадра не приводит к изменению размера шрифта. Если я понимаю, что вы наблюдаете за поведением, я думаю, что у вас adjustsFontSizeToFitWidth метки установлено на "Истина", так что вы видите, что кадр анимируется до размера, за которым следует мгновенная корректировка размера шрифта.
Вы можете попытаться масштабировать преобразование метки так, чтобы рамка и шрифт масштабировались одновременно.