blob: 9306ee2654b7fd8717d5050cad88e64c821d604a [file]
// Copyright 2017-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import "MDCFontTraits.h"
#import "MDCFontTextStyle.h"
static NSDictionary<NSString *, MDCFontTraits *> *_body1Traits;
static NSDictionary<NSString *, MDCFontTraits *> *_body2Traits;
static NSDictionary<NSString *, MDCFontTraits *> *_buttonTraits;
static NSDictionary<NSString *, MDCFontTraits *> *_captionTraits;
static NSDictionary<NSString *, MDCFontTraits *> *_display1Traits;
static NSDictionary<NSString *, MDCFontTraits *> *_headlineTraits;
static NSDictionary<NSString *, MDCFontTraits *> *_subheadlineTraits;
static NSDictionary<NSString *, MDCFontTraits *> *_titleTraits;
static NSDictionary<NSNumber *, NSDictionary *> *_styleTable;
@interface MDCFontTraits (MaterialTypographyPrivate)
+ (instancetype)traitsWithPointSize:(CGFloat)pointSize
weight:(CGFloat)weight
leading:(CGFloat)leading
tracking:(CGFloat)tracking;
- (instancetype)initWithPointSize:(CGFloat)pointSize
weight:(CGFloat)weight
leading:(CGFloat)leading
tracking:(CGFloat)tracking;
@end
@implementation MDCFontTraits
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wpartial-availability"
+ (void)initialize {
_body1Traits = @{
UIContentSizeCategoryExtraSmall : [MDCFontTraits traitsWithPointSize:11
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [MDCFontTraits traitsWithPointSize:12
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [MDCFontTraits traitsWithPointSize:13
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [MDCFontTraits traitsWithPointSize:14
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [MDCFontTraits traitsWithPointSize:16
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge : [MDCFontTraits traitsWithPointSize:18
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[MDCFontTraits traitsWithPointSize:20 weight:UIFontWeightRegular leading:0.0 tracking:0.0],
UIContentSizeCategoryAccessibilityMedium :
[MDCFontTraits traitsWithPointSize:25 weight:UIFontWeightRegular leading:0.0 tracking:0.0],
UIContentSizeCategoryAccessibilityLarge : [MDCFontTraits traitsWithPointSize:30
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryAccessibilityExtraLarge :
[MDCFontTraits traitsWithPointSize:37 weight:UIFontWeightRegular leading:0.0 tracking:0.0],
UIContentSizeCategoryAccessibilityExtraExtraLarge :
[MDCFontTraits traitsWithPointSize:44 weight:UIFontWeightRegular leading:0.0 tracking:0.0],
UIContentSizeCategoryAccessibilityExtraExtraExtraLarge :
[MDCFontTraits traitsWithPointSize:52 weight:UIFontWeightRegular leading:0.0 tracking:0.0],
};
_body2Traits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:11
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:12
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:13
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:14
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:16
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:18
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:20
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryAccessibilityMedium :
[[MDCFontTraits alloc] initWithPointSize:25
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryAccessibilityLarge :
[[MDCFontTraits alloc] initWithPointSize:30
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryAccessibilityExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:37
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryAccessibilityExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:44
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryAccessibilityExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:52
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
};
_buttonTraits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:11
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:12
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:13
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:14
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:16
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:18
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:20
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
};
_captionTraits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:11
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:11
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:11
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:12
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:14
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:16
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:18
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
};
_display1Traits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:28
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:30
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:32
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:34
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:36
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:38
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:40
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
};
_headlineTraits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:21
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:22
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:23
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:24
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:26
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:28
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:30
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
};
_subheadlineTraits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:13
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:14
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:15
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:16
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:18
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:20
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:22
weight:UIFontWeightRegular
leading:0.0
tracking:0.0],
};
_titleTraits = @{
UIContentSizeCategoryExtraSmall : [[MDCFontTraits alloc] initWithPointSize:17
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategorySmall : [[MDCFontTraits alloc] initWithPointSize:18
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryMedium : [[MDCFontTraits alloc] initWithPointSize:19
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryLarge : [[MDCFontTraits alloc] initWithPointSize:20
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraLarge : [[MDCFontTraits alloc] initWithPointSize:22
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:24
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
UIContentSizeCategoryExtraExtraExtraLarge :
[[MDCFontTraits alloc] initWithPointSize:26
weight:UIFontWeightMedium
leading:0.0
tracking:0.0],
};
_styleTable = @{
@(MDCFontTextStyleBody1) : _body1Traits,
@(MDCFontTextStyleBody2) : _body2Traits,
@(MDCFontTextStyleButton) : _buttonTraits,
@(MDCFontTextStyleCaption) : _captionTraits,
@(MDCFontTextStyleDisplay1) : _display1Traits,
@(MDCFontTextStyleHeadline) : _headlineTraits,
@(MDCFontTextStyleSubheadline) : _subheadlineTraits,
@(MDCFontTextStyleTitle) : _titleTraits
};
}
#pragma clang diagnostic pop
+ (instancetype)traitsWithPointSize:(CGFloat)pointSize
weight:(CGFloat)weight
leading:(CGFloat)leading
tracking:(CGFloat)tracking {
return [[MDCFontTraits alloc] initWithPointSize:pointSize
weight:weight
leading:leading
tracking:tracking];
}
- (instancetype)initWithPointSize:(CGFloat)pointSize
weight:(CGFloat)weight
leading:(CGFloat)leading
tracking:(CGFloat)tracking {
self = [super init];
if (self) {
_pointSize = pointSize;
_weight = weight;
_leading = leading;
_tracking = tracking;
}
return self;
}
+ (MDCFontTraits *)traitsForTextStyle:(MDCFontTextStyle)style
sizeCategory:(NSString *)sizeCategory {
NSDictionary *traitsTable = _styleTable[@(style)];
NSCAssert(traitsTable, @"traitsTable cannot be nil. Is style valid?");
MDCFontTraits *traits;
if (traitsTable) {
if (sizeCategory) {
traits = traitsTable[sizeCategory];
}
// If you have queried the table for a sizeCategory that doesn't exist, we will return the
// traits for XXXL. This handles the case where the values are requested for one of the
// accessibility size categories beyond XXXL such as
// UIContentSizeCategoryAccessibilityExtraLarge. Accessbility size categories are only
// defined for the Body Font Style.
if (traits == nil) {
traits = traitsTable[UIContentSizeCategoryExtraExtraExtraLarge];
}
}
return traits;
}
@end