Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Плавная анимация кадра UILabel

Автор вопроса: Scott LittleОтветов: 5

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

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

Предварительная анимация

Пост-анимация

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

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

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

  • Это старый вопрос, но я борюсь с той же проблемой. Как-то это нелогично. Насколько я понимаю методы анимации, вы должны иметь возможность анимировать большинство свойств класса UIView. Но почему свойство frame UILabel при анимации ведет себя иначе, чем обычный подкласс UIView. Похоже, что класс UILabel игнорирует анимацию для размера и только анимирует изменение местоположения. Это создает довольно странную анимацию. Я был бы признателен, если бы кто-нибудь мог мне помочь с этим. Chris 12.11.2010

cocoa-touchanimationuilabel

Ответы

Ответ 1 · рейтинг 38 · cliclcly

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

Ответ 2 · рейтинг 7 · titaniumdecoy

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

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

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

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

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

Ответ 3 · рейтинг 6 · user3099609

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

Исходный кадр:

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

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

Ответ 4 · TechZen

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

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

Ответ 5 · рейтинг -3 · farid98

Просто отключите автоматический макет для вашей этикетки.

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы