Skip to content

Commit 635a2ed

Browse files
committed
Merge pull request #28 from Grubas7/master
Fix `titleLabel` font upgrade for `SSDynamicButton` after font change…
2 parents c1666ed + 5d9c002 commit 635a2ed

10 files changed

Lines changed: 114 additions & 102 deletions

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# SSDynamicText CHANGELOG
22

3+
## 0.5.1
4+
###### unreleased
5+
6+
- **(fixed)** Fixed `titleLabel` font upgrade for `SSDynamicButton` after font change, [#27](https://github.com/splinesoft/SSDynamicText/issues/8). _([Grubas7](https://github.com/Grubas7))_
7+
38
## 0.5.0
49
###### October 5, 2015
510

Example/SSDynamicTextTests/SSDynamicButtonTests.m

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,6 @@ - (void)testButtonTitleLabelFontSizeShouldBeEqualToLabelFontSizeIncreasedByPrefe
8484
}
8585
}
8686

87-
/**
88-
Uncomment after fix: https://github.com/splinesoft/SSDynamicText/issues/27
8987
- (void)testButtonTitleLabelFontSizeShouldBeEqualToNewFontSizeIncreasedByContentSizeCategoryDelta {
9088
//Arrange
9189
CGFloat newFontSize = 7.0f;
@@ -103,9 +101,8 @@ - (void)testButtonTitleLabelFontSizeShouldBeEqualToNewFontSizeIncreasedByContent
103101
XCTAssertEqualWithAccuracy(button.titleLabel.font.pointSize, newFontSize + SSTestFontSizeDifferenceForSizeExtraExtraLarge, FLT_EPSILON);
104102
}
105103
}
106-
*/
107104

108-
- (void)testButtonTitleLabelAttributedStringFontSizesShouldBeIncreasedByContentSizeCategoryDelta {
105+
- (void)testButtonTitleLabelAttributedTitleFontSizesShouldBeIncreasedByContentSizeCategoryDelta {
109106
//Arrange
110107
NSAttributedString *attributedString = [SSAttributedStringValidator testAttributedString];
111108

@@ -120,8 +117,6 @@ - (void)testButtonTitleLabelAttributedStringFontSizesShouldBeIncreasedByContentS
120117
//Assert
121118
XCTAssertTrue([SSAttributedStringValidator isValidTestAttributedString:button.titleLabel.attributedText
122119
changedByDelta:SSTestFontSizeDifferenceForSizeExtraExtraLarge]);
123-
124-
XCTAssertEqualObjects(button.titleLabel.attributedText.string, attributedString.string);
125120
}
126121
}
127122

Example/SSDynamicTextTests/UIView+SSTextSizeTests.m

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@
66
// Copyright (c) 2015 Splinesoft. All rights reserved.
77
//
88

9-
#import "UIView+SSTextSize.h"
10-
#import "SSDynamicLabel.h"
9+
#import <XCTest/XCTest.h>
1110
#import "SSTestsHelper.h"
1211

13-
#import <XCTest/XCTest.h>
12+
#import "UIView+SSTextSize.h"
13+
#import "SSDynamicLabel.h"
1414

1515
@interface UIView_SSTextSizeTests : XCTestCase
1616

@@ -51,7 +51,7 @@ - (void)testDefaultBaseSizeShouldBeEqualTo16IfInfoBundleNotSet {
5151
CGFloat baseSize = [self.label ss_defaultBaseSize];
5252

5353
//Assert
54-
XCTAssertEqualWithAccuracy(16, baseSize, FLT_EPSILON, @"Default base size should be 16");
54+
XCTAssertEqualWithAccuracy(baseSize, 16, FLT_EPSILON, @"Default base size should be 16");
5555

5656
//Clean Up
5757
[SSTestsHelper stopMockingBundleDictionary];
@@ -68,12 +68,12 @@ - (void)testDefaultFontNameShouldBeEqualToInfoBundleIfSet {
6868
//Assert
6969
XCTAssertEqualObjects(fontName, expectedfontName, @"Default base name should be %@", expectedfontName);
7070

71-
// Clean Up
71+
//Clean Up
7272
[SSTestsHelper stopMockingBundleDictionary];
7373
}
7474

7575
- (void)testDefaultFontNameShouldBeEqualToSystemFontIfInfoBundleNotSet {
76-
// Arrange
76+
//Arrange
7777
NSString *expectedFontName = [UIFont systemFontOfSize:SSTestFontSize].fontName;
7878
[SSTestsHelper startMockingBundleDictionary:nil];
7979

@@ -83,8 +83,34 @@ - (void)testDefaultFontNameShouldBeEqualToSystemFontIfInfoBundleNotSet {
8383
//Assert
8484
XCTAssertEqualObjects(fontName, expectedFontName, @"Default base name should be %@", expectedFontName);
8585

86-
// Clean Up
86+
//Clean Up
8787
[SSTestsHelper stopMockingBundleDictionary];
8888
}
8989

90+
- (void)testSetupDefaultFontDescriptiorBasedOnFontShouldBeEqualToInitialFontDescriptor {
91+
//Arrange
92+
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:SSTestFontName size:SSTestFontSize];
93+
SSDynamicLabel *label = [SSDynamicLabel labelWithFontDescriptor:fontDescriptor];
94+
95+
//Act
96+
[label setupDefaultFontDescriptorBasedOnFont:[UIFont fontWithDescriptor:fontDescriptor size:SSTestFontSize]];
97+
98+
//Assert
99+
XCTAssertEqualObjects(label.defaultFontDescriptor, fontDescriptor,
100+
@"Default font descriptor should have font %@ with size %f" , fontDescriptor.postscriptName, fontDescriptor.pointSize);
101+
}
102+
103+
- (void)testSetupDefaultFontDescriptiorBasedOnNilFontShouldSetFontDescriptorWithDefaultValues {
104+
//Arrange
105+
UIView *testView = [[UIView alloc] init];
106+
UIFontDescriptor *fontDescriptor = [UIFontDescriptor fontDescriptorWithName:[testView ss_defaultFontName] size:[testView ss_defaultBaseSize]];
107+
108+
//Act
109+
[testView setupDefaultFontDescriptorBasedOnFont:nil];
110+
111+
//Assert
112+
XCTAssertEqualObjects(testView.defaultFontDescriptor, fontDescriptor,
113+
@"Default font descriptor should have font %@ with size 16" , [UIFont systemFontOfSize:16.0].fontName);
114+
}
115+
90116
@end

SSDynamicText/SSDynamicButton.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
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 <UIKit/UIKit.h>

SSDynamicText/SSDynamicButton.m

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
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

SSDynamicText/SSDynamicLabel.m

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ - (void)setDefaultFontDescriptor:(UIFontDescriptor *)defaultFontDescriptor {
3232

3333
- (void)setFont:(UIFont *)font {
3434
[super setFont:font];
35-
[self setupBaseFontBasedOnCurrentFont];
35+
[self setupDefaultFontDescriptorBasedOnFont:self.font];
3636
}
3737

3838
- (instancetype)initWithFrame:(CGRect)frame {
39-
if ((self = [super initWithFrame:frame])) {
39+
if (self = [super initWithFrame:frame]) {
4040
[self startObservingTextSizeChanges];
4141
}
4242

@@ -46,7 +46,7 @@ - (instancetype)initWithFrame:(CGRect)frame {
4646
- (void)awakeFromNib {
4747
[super awakeFromNib];
4848

49-
[self setupBaseFontBasedOnCurrentFont];
49+
[self setupDefaultFontDescriptorBasedOnFont:self.font];
5050
[self startObservingTextSizeChanges];
5151
}
5252

@@ -83,23 +83,6 @@ - (SSDynamicTextSizeChanger *)createTextChanger {
8383
return changer;
8484
}
8585

86-
- (void)setupBaseFontBasedOnCurrentFont {
87-
NSString *fontName;
88-
CGFloat baseSize = 0;
89-
90-
if (self.font) {
91-
fontName = self.font.fontName;
92-
baseSize = self.font.pointSize;
93-
}
94-
95-
fontName = (fontName ?: [self ss_defaultFontName]);
96-
baseSize = (baseSize ?: [self ss_defaultBaseSize]);
97-
98-
self.defaultFontDescriptor = (self.font.fontDescriptor ?:
99-
[UIFontDescriptor fontDescriptorWithName:fontName
100-
size:baseSize]);
101-
}
102-
10386
- (void)startObservingTextSizeChanges {
10487
[self ss_startObservingTextSizeChangesWithBlock:self.textSizeChanger.changeHandler];
10588
}

SSDynamicText/SSDynamicTextField.m

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ - (void)setDefaultFontDescriptor:(UIFontDescriptor *)defaultFontDescriptor {
3232

3333
- (void)setFont:(UIFont *)font {
3434
[super setFont:font];
35-
[self setupBaseFontBasedOnCurrentFont];
35+
[self setupDefaultFontDescriptorBasedOnFont:self.font];
3636
}
3737

3838
- (instancetype)initWithFrame:(CGRect)frame {
39-
if ((self = [super initWithFrame:frame])) {
39+
if (self = [super initWithFrame:frame]) {
4040
[self startObservingTextSizeChanges];
4141
}
4242

@@ -46,7 +46,7 @@ - (instancetype)initWithFrame:(CGRect)frame {
4646
- (void)awakeFromNib {
4747
[super awakeFromNib];
4848

49-
[self setupBaseFontBasedOnCurrentFont];
49+
[self setupDefaultFontDescriptorBasedOnFont:self.font];
5050
[self startObservingTextSizeChanges];
5151
}
5252

@@ -83,23 +83,6 @@ - (SSDynamicTextSizeChanger *)createTextChanger {
8383
return changer;
8484
}
8585

86-
- (void)setupBaseFontBasedOnCurrentFont {
87-
NSString *fontName;
88-
CGFloat baseSize = 0;
89-
90-
if (self.font) {
91-
fontName = self.font.fontName;
92-
baseSize = self.font.pointSize;
93-
}
94-
95-
fontName = (fontName ?: [self ss_defaultFontName]);
96-
baseSize = (baseSize ?: [self ss_defaultBaseSize]);
97-
98-
self.defaultFontDescriptor = (self.font.fontDescriptor ?:
99-
[UIFontDescriptor fontDescriptorWithName:fontName
100-
size:baseSize]);
101-
}
102-
10386
- (void)startObservingTextSizeChanges {
10487
[self ss_startObservingTextSizeChangesWithBlock:self.textSizeChanger.changeHandler];
10588
}

SSDynamicText/SSDynamicTextView.m

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ - (void)setDefaultFontDescriptor:(UIFontDescriptor *)defaultFontDescriptor {
3232

3333
- (void)setFont:(UIFont *)font {
3434
[super setFont:font];
35-
[self setupBaseFontBasedOnCurrentFont];
35+
[self setupDefaultFontDescriptorBasedOnFont:self.font];
3636
}
3737

3838
- (instancetype)initWithFrame:(CGRect)frame {
39-
if ((self = [super initWithFrame:frame])) {
39+
if (self = [super initWithFrame:frame]) {
4040
[self startObservingTextSizeChanges];
4141
}
4242

@@ -46,7 +46,7 @@ - (instancetype)initWithFrame:(CGRect)frame {
4646
- (void)awakeFromNib {
4747
[super awakeFromNib];
4848

49-
[self setupBaseFontBasedOnCurrentFont];
49+
[self setupDefaultFontDescriptorBasedOnFont:self.font];
5050
[self startObservingTextSizeChanges];
5151
}
5252

@@ -83,23 +83,6 @@ - (SSDynamicTextSizeChanger *)createTextChanger {
8383
return changer;
8484
}
8585

86-
- (void)setupBaseFontBasedOnCurrentFont {
87-
NSString *fontName;
88-
CGFloat baseSize = 0;
89-
90-
if (self.font) {
91-
fontName = self.font.fontName;
92-
baseSize = self.font.pointSize;
93-
}
94-
95-
fontName = (fontName ?: [self ss_defaultFontName]);
96-
baseSize = (baseSize ?: [self ss_defaultBaseSize]);
97-
98-
self.defaultFontDescriptor = (self.font.fontDescriptor ?:
99-
[UIFontDescriptor fontDescriptorWithName:fontName
100-
size:baseSize]);
101-
}
102-
10386
- (void)startObservingTextSizeChanges {
10487
[self ss_startObservingTextSizeChangesWithBlock:self.textSizeChanger.changeHandler];
10588
}

0 commit comments

Comments
 (0)