最近开发新App,射妓狮给的图上出现一种不同大小字体混排的Label,就像下面这种:
想了想,最简单的方法是使用多个UILabel排列显示,但是这样不仅麻烦而且效果也不好,索性自定义UILabel来尽可能的满足使用灵活性。
实现方法
与正常自定义控件的方法类似,主要利用了CoreGraphics来动态绘制字体,但这里字体的参数都用NSArray存储,以尽最大可能不受具体内容约束,实现灵活性。
代码如下:
#import <UIKit/UIKit.h> @interface UnevenHeightLabel : UIView
@property (nonatomic) NSArray *strings;
@property (nonatomic) NSArray *fonts;
@property (nonatomic) NSArray *originY;
@property (nonatomic) NSArray *fontColors; -(instancetype) initWithUnevenHeightStrings:(NSArray *)strings stringFonts:(NSArray *)fonts originY:(NSArray *)originY stringColors:(NSArray *) colors;
@end
#import "UnevenHeightLabel.h"
#import "UIColor+HexColor.h" @implementation UnevenHeightLabel // Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(ctx, 1.0f);
CGRect startRect;
CGSize requiredSize;
float sumWidth=;
if(_strings!=nil&& _strings.count>){
for (int i=; i<_strings.count; i++) {
CGSize maxSize=rect.size;
requiredSize=[_strings[i] boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:_fonts[i]} context:nil].size;
if(i==){
startRect=CGRectMake(, , maxSize.width, maxSize.height);
}
else{
startRect=CGRectMake(sumWidth, [_originY[i] floatValue], requiredSize.width, requiredSize.height); }
[_strings[i] drawInRect:startRect
withAttributes:@{NSFontAttributeName:_fonts[i],
NSForegroundColorAttributeName:_fontColors[i]}]; sumWidth=sumWidth+requiredSize.width; } }
} -(instancetype)initWithUnevenHeightStrings:(NSArray *)strings stringFonts:(NSArray *)fonts originY:(NSArray *)originY stringColors:(NSArray *)colors {
self=[super init];
self.strings=strings;
self.fonts=fonts;
self.originY=originY;
self.fontColors=colors;
//[self setNeedsDisplay];
return self;
} @end
Demo:
使用方法很简单,直接在需要使用的地方调用,如下:
UnevenHeightLabel *label=[[UnevenHeightLabel alloc] initWithUnevenHeightStrings:@[@"11.",@"",@"%"] stringFonts:@[[UIFont systemFontOfSize:],[UIFont systemFontOfSize:],[UIFont systemFontOfSize:]] originY:@[@,@,@] stringColors:@[[UIColor redColor],[UIColor blueColor],[UIColor greenColor]]]; label.frame=CGRectMake(, , , );
label.backgroundColor=[UIColor clearColor];
[self.view addSubview:label];
UnevenHeightLabel *mylabel=[[UnevenHeightLabel alloc] initWithUnevenHeightStrings:@[@"A",@"a",@"B",@"b",@"C",@"c"]
stringFonts:@[[UIFont systemFontOfSize:],
[UIFont systemFontOfSize:],
[UIFont systemFontOfSize:],
[UIFont systemFontOfSize:],
[UIFont systemFontOfSize:],
[UIFont systemFontOfSize:]]
originY:@[@,@,@,@,@,@]
stringColors:@[
[UIColor redColor],
[UIColor orangeColor],
[UIColor greenColor],
[UIColor blueColor],
[UIColor cyanColor],
[UIColor purpleColor]]];
[mylabel setFrame:CGRectMake(SCREEN_WIDTH/-, SCREEN_HEIGHT/-, , )];
[mylabel setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:mylabel];
效果如下: