UPDATED for Xcode 8 / Swift 3 / iOS 10 SDK.
I've created UILabel
extension in Swift. Uncomment commented lines if your label is left aligned.
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 version:
@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