需求來源:
我們項(xiàng)目中使用的字體不是很標(biāo)準(zhǔn),顯示到label上會造成偏上兩個(gè)像素的效果,解決此問題重寫了一個(gè)label。
UILabel有兩個(gè)接口是專門用來重寫,以此來自定義自己的label,如下:
// override points. can adjust rect before calling super.
// label has default content mode of UIViewContentModeRedraw
– textRectForBounds:limitedToNumberOfLines:
– drawTextInRect:
上面這兩個(gè)方法不是用來調(diào)用的,只適合被UILabel子類重寫
– textRectForBounds:limitedToNumberOfLines:
用來改變label里面文字展示窗口的大小,你可以自己根據(jù)文字的多少,來計(jì)算窗口的大小
– drawTextInRect:
在繪圖環(huán)境實(shí)現(xiàn)文字的繪制,這個(gè)方法里面里面已經(jīng)配置好了繪圖環(huán)境,使用方式如下:
1.直接獲得當(dāng)前繪圖上下文,
2.接著更改繪圖環(huán)境設(shè)置
3.調(diào)用super方法來繪制即可
- .h 文件
@interface FLBaseMiddleLabel : UILabel
@property (assign, nonatomic) UIEdgeInsets edgeInsets;
@property (assign, nonatomic) CGFloat offset;
@end
- .m文件
@implementation FLBaseMiddleLabel
- (instancetype)init
{
self = [super init];
if (self) {
[self defaultSetting];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self defaultSetting];
}
return self;
}
-(void)defaultSetting {
self.offset = 0;
self.edgeInsets = UIEdgeInsetsZero;
}
// 修改繪制文字的區(qū)域,edgeInsets增加bounds
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
CGRect rect = [super textRectForBounds:UIEdgeInsetsInsetRect(bounds, self.edgeInsets) limitedToNumberOfLines:numberOfLines];
rect.origin.x -= self.edgeInsets.left;
rect.origin.y -= self.edgeInsets.top;
rect.size.width += self.edgeInsets.left + self.edgeInsets.right;
rect.size.height += self.edgeInsets.top + self.edgeInsets.bottom;
return rect;
}
//繪制文字
- (void)drawTextInRect:(CGRect)rect {
CGRect newRect = rect;
newRect.origin.y += self.offset;
if (self.text && ![self.text isEqualToString:@""]) {
[super drawTextInRect:UIEdgeInsetsInsetRect(newRect, self.edgeInsets)];
self.hidden = NO;
} else {
[super drawTextInRect:UIEdgeInsetsInsetRect(newRect, UIEdgeInsetsZero)];
self.hidden = YES;
}
}