33// SSDynamicText
44//
55// Created by Adam Grzegorowski on 18/07/15.
6- //
6+ // Copyright (c) 2015 Splinesoft. All rights reserved.
77//
88
99#import " SSDynamicButton.h"
@@ -15,8 +15,6 @@ @interface SSDynamicButton ()
1515
1616@property (nonatomic , strong ) NSMutableDictionary *baseAttributedTitlesDictionary;
1717
18- - (void )setup ;
19-
2018@end
2119
2220@implementation SSDynamicButton
@@ -39,7 +37,7 @@ - (void)setAttributedTitle:(NSAttributedString *)title forState:(UIControlState)
3937}
4038
4139- (instancetype )initWithFrame : (CGRect)frame {
42- if (( self = [super initWithFrame: frame]) ) {
40+ if (self = [super initWithFrame: frame]) {
4341 [self setup ];
4442 }
4543
@@ -50,20 +48,7 @@ - (void)awakeFromNib {
5048 [super awakeFromNib ];
5149
5250 NSAssert (self.buttonType == UIButtonTypeCustom, @" Change SSDynamicButton.buttonType to UIButtonTypeCustom in your nib" );
53- NSString *fontName;
54- CGFloat baseSize = 0 ;
55-
56- if (self.titleLabel .font ) {
57- fontName = self.titleLabel .font .fontName ;
58- baseSize = self.titleLabel .font .pointSize ;
59- }
60-
61- fontName = (fontName ?: [self ss_defaultFontName ]);
62- baseSize = (baseSize ?: [self ss_defaultBaseSize ]);
63-
64- self.defaultFontDescriptor = (self.titleLabel .font .fontDescriptor ?:
65- [UIFontDescriptor fontDescriptorWithName: fontName
66- size: baseSize]);
51+ [self setupDefaultFontDescriptorBasedOnFont: self .titleLabel.font];
6752
6853 [self setup ];
6954}
@@ -82,14 +67,18 @@ + (instancetype)buttonWithFontDescriptor:(UIFontDescriptor *)descriptor {
8267
8368- (void )dealloc {
8469 [self ss_stopObservingTextSizeChanges ];
70+ [self removeTitleLabelFontObserver ];
8571}
8672
8773- (void )changeFontWithDelta : (NSInteger )newDelta {
8874 CGFloat preferredSize = [self .defaultFontDescriptor.fontAttributes[UIFontDescriptorSizeAttribute] floatValue ];
8975 preferredSize += newDelta;
9076
77+ [self removeTitleLabelFontObserver ];
9178 self.titleLabel .font = [UIFont fontWithDescriptor: self .defaultFontDescriptor
9279 size: preferredSize];
80+
81+ [self addTitleLabelFontObserver ];
9382}
9483
9584- (void )changeAttributedTitle : (NSAttributedString *)attributedTitle forState : (UIControlState)state withFontSizeDelta : (NSInteger )newDelta {
@@ -98,13 +87,15 @@ - (void)changeAttributedTitle:(NSAttributedString *)attributedTitle forState:(UI
9887
9988- (void )changeAttributedStringWithDelta : (NSInteger )newDelta {
10089 [self .baseAttributedTitlesDictionary enumerateKeysAndObjectsUsingBlock: ^(NSNumber *key, NSAttributedString *obj, BOOL *stop) {
101- [self changeAttributedTitle: obj forState: key.integerValue withFontSizeDelta: newDelta];
90+ [self changeAttributedTitle: obj forState: key.unsignedIntegerValue withFontSizeDelta: newDelta];
10291 }];
10392}
10493
10594- (void )setup {
10695 __weak typeof (self) weakSelf = self;
10796
97+ [self addTitleLabelFontObserver ];
98+
10899 SSTextSizeChangedBlock changeHandler = ^(NSInteger newDelta) {
109100
110101 [weakSelf changeFontWithDelta: newDelta];
@@ -114,4 +105,27 @@ - (void)setup {
114105 [self ss_startObservingTextSizeChangesWithBlock: changeHandler];
115106}
116107
108+ #pragma mark - Font observing
109+
110+ - (void )addTitleLabelFontObserver {
111+ [self .titleLabel addObserver: self forKeyPath: NSStringFromSelector (@selector (font )) options: NSKeyValueObservingOptionNew context: NULL ];
112+ }
113+
114+ - (void )removeTitleLabelFontObserver {
115+ [self .titleLabel removeObserver: self forKeyPath: NSStringFromSelector (@selector (font ))];
116+ }
117+
118+ - (void )observeValueForKeyPath : (NSString *)keyPath ofObject : (id )object change : (NSDictionary <NSString *,id> *)change context : (void *)context {
119+ if ([keyPath isEqualToString: NSStringFromSelector (@selector (font ))]) {
120+
121+ NSInteger newDelta = [UIApplication sharedApplication ].preferredFontSizeDelta ;
122+ [self setupDefaultFontDescriptorBasedOnFont: self .titleLabel.font];
123+
124+ [self changeFontWithDelta: newDelta];
125+ [self changeAttributedStringWithDelta: newDelta];
126+ } else {
127+ [super observeValueForKeyPath: keyPath ofObject: object change: change context: context];
128+ }
129+ }
130+
117131@end
0 commit comments