forked from facebook/componentkit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCKLabelComponent.mm
82 lines (73 loc) · 3.06 KB
/
CKLabelComponent.mm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
#import "CKLabelComponent.h"
#import <ComponentKit/CKTextComponent.h>
@implementation CKLabelComponent
+ (instancetype)newWithLabelAttributes:(const CKLabelAttributes &)attributes
viewAttributes:(const CKViewComponentAttributeValueMap &)viewAttributes
size:(const CKComponentSize &)size
{
CKViewComponentAttributeValueMap copiedMap = viewAttributes;
return [super newWithComponent:
[CKTextComponent
newWithTextAttributes:textKitAttributes(attributes)
viewAttributes:std::move(copiedMap)
options:{.accessibilityContext = {.isAccessibilityElement = @(YES)}}
size:size]];
}
static const CKTextKitAttributes textKitAttributes(const CKLabelAttributes &labelAttributes)
{
return {
.attributedString = formattedAttributedString(labelAttributes.string, labelAttributes),
.truncationAttributedString = formattedAttributedString(labelAttributes.truncationString, labelAttributes),
.lineBreakMode = labelAttributes.lineBreakMode,
.maximumNumberOfLines = labelAttributes.maximumNumberOfLines,
.shadowOffset = labelAttributes.shadowOffset,
.shadowColor = labelAttributes.shadowColor,
.shadowOpacity = labelAttributes.shadowOpacity,
.shadowRadius = labelAttributes.shadowRadius,
};
}
static NSAttributedString *formattedAttributedString(NSString *string, const CKLabelAttributes &labelAttributes)
{
if (!string) {
return nil;
}
return [[NSAttributedString alloc] initWithString:string
attributes:stringAttributes(labelAttributes)];
}
static NSDictionary *stringAttributes(const CKLabelAttributes &labelAttributes)
{
NSMutableDictionary *attributes = [NSMutableDictionary dictionary];
if (labelAttributes.font) {
attributes[NSFontAttributeName] = labelAttributes.font;
}
if (labelAttributes.color) {
attributes[NSForegroundColorAttributeName] = labelAttributes.color;
}
attributes[NSParagraphStyleAttributeName] = paragraphStyle(labelAttributes);
return attributes;
}
static NSParagraphStyle *paragraphStyle(const CKLabelAttributes &labelAttributes)
{
NSMutableParagraphStyle *ps = [[NSMutableParagraphStyle alloc] init];
ps.alignment = labelAttributes.alignment;
ps.firstLineHeadIndent = labelAttributes.firstLineHeadIndent;
ps.headIndent = labelAttributes.headIndent;
ps.tailIndent = labelAttributes.tailIndent;
ps.lineHeightMultiple = labelAttributes.lineHeightMultiple;
ps.maximumLineHeight = labelAttributes.maximumLineHeight;
ps.minimumLineHeight = labelAttributes.minimumLineHeight;
ps.lineSpacing = labelAttributes.lineSpacing;
ps.paragraphSpacing = labelAttributes.paragraphSpacing;
ps.paragraphSpacingBefore = labelAttributes.paragraphSpacingBefore;
return ps;
}
@end