Можно ли изменить размер шрифта UILabel с помощью плавной анимации на iPhone? - PullRequest
38 голосов
/ 20 января 2010

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

Очевидная вещь, которую нужно попробовать, это изменить свойство label.font.pointSize , но это только для чтения.

Масштабирование свойства метки .transform с помощью CGAffineTransformationMakeScale () делает текст размытым.

Есть ли другой способ сделать это?

Ответы [ 5 ]

57 голосов
/ 21 декабря 2011

Установите шрифт на 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);
    }];
12 голосов
/ 29 сентября 2015

ОБНОВЛЕНО для Xcode 8 / Swift 3 / iOS 10 SDK.

Я создал расширение UILabel в Swift.Раскомментируйте закомментированные строки, если ваша метка выровнена по левому краю.

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
5 голосов
/ 03 мая 2016

Если вы хотите анимировать от 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)
2 голосов
/ 16 июня 2013

Я только что нашел решение для этого.Он также основан на CGAffineTransformScale, но у него также есть некоторые другие хитрости и обрабатывает все граничные случаи:

Проверьте это: https://github.com/ivankovacevic/ARLabel

0 голосов
/ 30 сентября 2010

Вы не можете изменить размер шрифта шрифта, но вы можете заменить шрифт UILabel новым UIFont, который использует новый желаемый размер точки.

label.font = [UIFont fontWithName:@"Arial-BoldMT" size:12.0];
// ... some time later
label.font = [UIFont fontWithName:@"Arial-BoldMT" size:14.0];

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

...