-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathUILabel_LabelSize.h
More file actions
63 lines (53 loc) · 1.87 KB
/
Copy pathUILabel_LabelSize.h
File metadata and controls
63 lines (53 loc) · 1.87 KB
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
//
// UILabel_LabalSize.h
//
// Created by Shin Yamamoto on 30/1/2014
//
//
@interface UILabel (LabelSize)
- (CGSize)labelSizeToFitWidth:(CGFloat)width;
- (CGSize)labelSizeToFitHeight:(CGFloat)height;
- (CGSize)labelSizeToFit:(CGSize)size;
- (CGSize)labelSize;
@end
/** NOTE:
-[UILabel textRectForBounds:limitedToNumberOfLines:]で取得したRectだと
ヒラギノ角ゴシック体で、gやpのleadingがある文字の下が切れてしまう問題がある。
そのため、-[NSAttributedString boundingRectWithSize:options:context:]を利用している。
このとき、optionには、必ず、NSStringDrawingUsesLineFragmentOrigin,NSStringDrawingUsesFontLeadingが必要
*/
@implementation UILabel(LabelSize)
- (CGSize)labelSizeToFitWidth:(CGFloat)width
{
CGSize maxSize = CGSizeMake(width, CGFLOAT_MAX);
return [self labelSizeToFit:maxSize];
}
- (CGSize)labelSizeToFitHeight:(CGFloat)height
{
CGSize maxSize = CGSizeMake(CGFLOAT_MAX, height);
return [self labelSizeToFit:maxSize];
}
- (CGSize)labelSizeToFit:(CGSize)maxSize
{
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
if (self.lineBreakMode == NSLineBreakByTruncatingHead ||
self.lineBreakMode == NSLineBreakByTruncatingTail ||
self.lineBreakMode == NSLineBreakByTruncatingMiddle )
{
options |= NSStringDrawingTruncatesLastVisibleLine;
}
NSLineBreakMode mode = self.lineBreakMode;
self.lineBreakMode = NSLineBreakByWordWrapping;
if (self.numberOfLines > 0) {
maxSize = CGSizeMake(maxSize.width, self.font.lineHeight * self.numberOfLines);
}
CGRect textRect = [self.attributedText boundingRectWithSize:maxSize options:options context:NULL];
self.lineBreakMode = mode;
return textRect.size;
}
- (CGSize)labelSize
{
CGSize maxSize = CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX);
return [self labelSizeToFit:maxSize];
}
@end