iOS-анимация изменения размера текста в UILabel или UITextView?

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

Я где-то читал, что бросать это изменение в UIView блок анимации не работает, потому что свойство font не является анимируемым, так что мои варианты действий это?

для моей конкретной реализации я не просто масштабировать UILabel/UITextView как есть; границы поля увеличиваются больше (пропорционально), чем размер шрифта, поэтому в тексте будет повторный поток. Меня это устраивает.

Edit: я был бы в порядке с простым масштабированием UITextView.

кроме того, я рассматривал "анимацию" вручную: у меня есть метод, который излагает мои представления и настраивает размер шрифта. Если бы я знал, когда начнется ротация, и продолжительность анимации, я мог бы время, чтобы он отображает промежуточный размер шрифта или два в середине анимации. Любая помощь в их получении будет оценена по достоинству.

4 ответов


Если бы я знал, когда вращение было около для начала, и продолжительность анимация...

забавно, что вы должны упомянуть об этом. Непосредственно перед началом анимации ваш контроллер Вида получит willAnimateRotationToInterfaceOrientation:duration: сообщение, которое дает вам точную информацию, вам нужно.


один из вариантов-выцветание старого текста, изменение размера шрифта и его выцветание. Свойство font может не быть анимируемым, но alpha является. Поскольку alpha является свойством UIView, вы можете обрабатывать все ваши текстовые представления одинаково: UILabel, UITextView и т. д. И выглядит неплохо.


способ продолжить может быть:

  1. создать CAKeyframeAnimation
  2. определите масштабирование и вращение, которые вы хотите достичь во время этой анимации, используя набор объектов CATransform3D
  3. добавить эти преобразования, чтобы ваши ключевые кадры анимации
  4. отправить addAnimation сообщение объекту слоя надписи:[[label layer] addAnimation];

здесь будет образец кода, предполагающий yourLabel - это UILabel вы хотите масштабировать и поворот:

CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform"];

CATransform3D scaleUp = CATransform3DMakeScale(1.5, 1.5, 1); // Scale in x and y
CATransform3D rotationScaled = CATransform3DRotate (scaleUp, 90, 0, 0, 1); // Rotate the scaled font

[scale setValues:[NSArray arrayWithObjects:
[NSValue valueWithCATransform3D:CATransform3DIdentity],
[NSValue valueWithCATransform3D:rotationScaled],
nil]];

// set the duration
[scale setDuration: 1.0];

// animate your label layer
[[yourLabel layer] addAnimation:scale forKey:@"scaleText"];

это, как правило, как текст подпрыгивая вокруг будет анимирован, например.

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

вам понадобится настройка, чтобы найти правильное время и вращение.


изменить размер шрифта при didAnimateFirstHalfOfRotationToInterfaceOrientation: называется. Таким образом, пользователь не увидит изменения после завершения вращения. Было бы довольно сложно увидеть изменение размера шрифта, так как происходит вращение!