Можно ли изменить размер шрифта UILabel с плавной анимацией на iPhone?
Я хочу, чтобы UILabel слегка набухал, когда был выбран, как на некоторых экранах меню игры. Чтобы получить плавное изменение размера, я полагаю, что я должен внести некоторые изменения в свойства метки в блоке анимации.
Очевидное, что нужно попробовать - изменить свойство label.font.pointSize, но это только для чтения.
Масштабирование свойства .transform с помощью CGAffineTransformationMakeScale() делает текст размытым.
Есть ли другой способ сделать это?
Ответы
Ответ 1
Установите шрифт на UILabel как размер, который вы хотите, когда он будет увеличен. Затем уменьшите его. Когда вы хотите, чтобы ярлык набухал, масштабируйте его до первоначального размера.
messageLabel.font = [UIFont boldSystemFontOfSize:45];
messageLabel.transform = CGAffineTransformScale(messageLabel.transform, 0.25, 0.25);
[self.view addSubview:messageLabel];
[UIView animateWithDuration:1.0 animations:^{
messageLabel.transform = CGAffineTransformScale(messageLabel.transform, 4, 4);
}];
Ответ 2
ОБНОВЛЕНО для Xcode 8/Swift 3/iOS 10 SDK.
Я создал расширение UILabel
в Swift. Uncomment прокомментировал строки, если ваш ярлык выровнен по левому краю.
import UIKit
extension UILabel {
func animateToFont(_ font: UIFont, withDuration duration: TimeInterval) {
let oldFont = self.font
self.font = font
// let oldOrigin = frame.origin
let labelScale = oldFont!.pointSize / font.pointSize
let oldTransform = transform
transform = transform.scaledBy(x: labelScale, y: labelScale)
// let newOrigin = frame.origin
// frame.origin = oldOrigin
setNeedsUpdateConstraints()
UIView.animate(withDuration: duration) {
// self.frame.origin = newOrigin
self.transform = oldTransform
self.layoutIfNeeded()
}
}
}
Objective-C версия:
@interface UILabel(FontAnimation)
- (void) animateToFont:(UIFont*)font withDuration:(NSTimeInterval) duration;
@end
@implementation UILabel(FontAnimation)
- (void) animateToFont:(UIFont*)font withDuration:(NSTimeInterval) duration {
UIFont * oldFont = self.font;
self.font = font;
// CGPoint oldOrigin = self.frame.origin;
CGFloat labelScale = oldFont.pointSize / font.pointSize;
CGAffineTransform oldTransform = self.transform;
self.transform = CGAffineTransformScale(self.transform, labelScale, labelScale);
// CGPoint newOrigin = self.frame.origin;
// self.frame = CGRectMake(oldOrigin.x, oldOrigin.y, self.frame.size.width, self.frame.size.height);
[self setNeedsUpdateConstraints];
[UIView animateWithDuration:duration animations: ^{
// self.frame = CGRectMake(newOrigin.x, newOrigin.y, self.frame.size.width, self.frame.size.height);
self.transform = oldTransform;
[self layoutIfNeeded];
}];
}
@end
Ответ 3
Если вы хотите анимировать от fontSize до fontSize, вы можете использовать класс CATextLayer
// create text layer
let textLayer = CATextLayer()
textLayer.font = UIFont.systemFontOfSize(50)
textLayer.fontSize = 50
textLayer.string = "text"
textLayer.foregroundColor = UIColor.redColor().CGColor
textLayer.backgroundColor = UIColor.blackColor().CGColor
textLayer.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
view.layer.addSublayer(textLayer)
// animation
let animation = CABasicAnimation(keyPath: "fontSize")
animation.toValue = 10
animation.duration = 3
textLayer.layer.addAnimation(animation, forKey: nil)
Ответ 4
Я только что решил для этого. Он также основан на CGAffineTransformScale, но он также имеет некоторые другие трюки в рукаве и обрабатывает все граничные случаи:
Проверьте это:
https://github.com/ivankovacevic/ARLabel
Ответ 5
Вы не можете изменить размер точки шрифта, но вы можете заменить шрифт UILabel новым UIFont, который использует новый размер точки, который вы желаете.
label.font = [UIFont fontWithName:@"Arial-BoldMT" size:12.0];
// ... some time later
label.font = [UIFont fontWithName:@"Arial-BoldMT" size:14.0];
Вероятно, вы также захотите изменить фрейм UILabel для размещения нового размера точки, особенно если вы увеличиваете размер точки. В противном случае ваша метка будет обрезана.