最近开发新App,射妓狮给的图上出现一种不一样大小字体混排的Label,就像下面这种:ide
想了想,最简单的方法是使用多个UILabel排列显示,可是这样不只麻烦并且效果也很差,索性自定义UILabel来尽量的知足使用灵活性。字体
实现方法ui
与正常自定义控件的方法相似,主要利用了CoreGraphics来动态绘制字体,但这里字体的参数都用NSArray存储,以尽最大可能不受具体内容约束,实现灵活性。atom
代码以下:spa
#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=0; if(_strings!=nil&& _strings.count>0){ for (int i=0; i<_strings.count; i++) { CGSize maxSize=rect.size; requiredSize=[_strings[i] boundingRectWithSize:maxSize options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName:_fonts[i]} context:nil].size; if(i==0){ startRect=CGRectMake(0, 0, 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:code
使用方法很简单,直接在须要使用的地方调用,以下:orm
UnevenHeightLabel *label=[[UnevenHeightLabel alloc] initWithUnevenHeightStrings:@[@"11.",@"00",@"%"] stringFonts:@[[UIFont systemFontOfSize:20],[UIFont systemFontOfSize:25],[UIFont systemFontOfSize:30]] originY:@[@0,@0,@0] stringColors:@[[UIColor redColor],[UIColor blueColor],[UIColor greenColor]]]; label.frame=CGRectMake(100, 100, 200, 30); label.backgroundColor=[UIColor clearColor]; [self.view addSubview:label]; UnevenHeightLabel *mylabel=[[UnevenHeightLabel alloc] initWithUnevenHeightStrings:@[@"A",@"a",@"B",@"b",@"C",@"c"] stringFonts:@[[UIFont systemFontOfSize:25], [UIFont systemFontOfSize:20], [UIFont systemFontOfSize:25], [UIFont systemFontOfSize:20], [UIFont systemFontOfSize:25], [UIFont systemFontOfSize:20]] originY:@[@0,@0,@0,@0,@0,@0] stringColors:@[ [UIColor redColor], [UIColor orangeColor], [UIColor greenColor], [UIColor blueColor], [UIColor cyanColor], [UIColor purpleColor]]]; [mylabel setFrame:CGRectMake(SCREEN_WIDTH/2-55, SCREEN_HEIGHT/2-30, 110, 50)]; [mylabel setBackgroundColor:[UIColor clearColor]]; [self.view addSubview:mylabel];
效果以下:blog