Анимационная рамка UILabel плавно - PullRequest
8 голосов
/ 13 ноября 2009

Я пытался найти достойный способ плавно анимировать изменение размера кадра на 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];  

Я получаю плавную анимацию с меткой, однако делает так, что он берет слой перерисованного изображения для целевого размера метки и растягивает содержимое, чтобы оно соответствовало текущему, затем анимирует до места назначения Это заканчивается очень странным скачком на текстовом дисплее. Вот два изображения, показывающие внешний вид до анимации, а затем сразу после запуска анимации:

Pre-анимация
image

Post-анимация
image

Я пытался использовать только слой, чтобы оживить это, но у меня все еще возникают те же проблемы.

Итак, вопрос в том, как мне этого избежать?

Спасибо за любую помощь,
Скотт

Ответы [ 5 ]

33 голосов
/ 07 июля 2011

Ура за ответ на двухлетний мертвый вопрос, но я нашел ответ. В Интерфейсном Разработчике или в коде измените свойство contentMode метки. Ваш, кажется, установлен на scaleToFill; попробуйте left или right.

7 голосов
/ 02 октября 2012

Чтобы расширить ответ @ cliclcly: Из Обзора документации UILabel:

Режим содержимого по умолчанию для класса UILabel: UIViewContentModeRedraw. Этот режим заставляет представление перерисовать его содержимое каждый раз, когда его ограничивающий прямоугольник изменяется. Ты можешь измениться этот режим, изменяя унаследованное свойство contentMode класс.

Из документации свойства contentMode в UIView:

Значением по умолчанию для этого свойства является UIViewContentModeScaleToFill.

UILabels ведут себя по-другому, чем другие UIViews по умолчанию, потому что их свойство contentMode отличается по умолчанию.

5 голосов
/ 06 марта 2014

Я обнаружил, что анимации кадров UIlabel странные - их размер сразу устанавливается равным конечному размеру, и текст отображается для этого размера. После этого анимируется только изменение положения, что означает, что если размер назначения равен (0,0), метка сразу исчезает. Чтобы обойти это ограничение, я поместил метку внутри представления того же размера, который обрезает подвиды, отключил автоматическое изменение размера для метки, и я анимирую суперпредставление метки вместо самой метки. Конечный результат заключается в том, что рамка метки полностью анимирована, но содержащийся текст не перерисовывается, скажем, с другим размером шрифта, и усечение текста не изменяется. Это все еще не идеально, но это подходит для моих целей.

Начальный кадр:

initial frame

Во время анимации:

During animation

Анимация закончилась:

Animation ended

0 голосов
/ 23 декабря 2013

Просто отключите автоматическую разметку для вашего ярлыка.

В Xcode, нажмите на метку, а затем на панели свойств снимите флажок с автоматическим макетом

0 голосов
/ 13 ноября 2009

Анимация кадра не приводит к изменению размера шрифта. Если я понимаю, что вы наблюдаете за своим поведением, я думаю, что для метки adjustsFontSizeToFitWidth установлено значение «Истина», поэтому вы видите, что кадр соответствует размеру, за которым следует мгновенная корректировка размера шрифта.

Вы можете попытаться масштабировать преобразование метки так, чтобы рамка и шрифт масштабировались одновременно.

...