想了想,最简单的方法是使用多个UILabel排列显示,但是这样不仅麻烦而且效果也不好,索性自定义UILabel来尽可能的满足使用灵活性,
iOS开发笔记一种任意字体、颜色混排UILabel的实现
。实现方法
与正常自定义控件的方法类似,主要利用了CoreGraphics来动态绘制字体,但这里字体的参数都用NSArray存储,以尽最大可能不受具体内容约束,实现灵活性。
代码如下:
//
// UnevenHeightLabel.h
// demo
//
// Created by ZhangChangwei on 15/3/31.
// Copyright (c) 2015年 Changwei. All rights reserved.
//
#import
@interface UnevenHeightLabel : UIView
@property (nonatomic) NSArray *strings;
@property (nonatomic) NSArray *fonts;
@property (nonatomic) NSArray *fontFrames;
@property (nonatomic) NSArray *fontColors;
-(instancetype) initWithUnevenHeightStrings:(NSArray *)strings stringFonts:(NSArray *)fonts stringRects:(NSArray *)rects stringColors:(NSArray *) colors;
@end
//
// UnevenHeightLabel.m
// demo
//
// Created by ZhangChangwei on 15/3/31.
// Copyright (c) 2015年 Changwei. All rights reserved.
//
#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);
if(_strings!=nil&& _strings.count>0){
for (int i=0; i<_strings.count; i++) {
[_strings[i] drawInRect:[(NSValue *)_fontFrames[i] CGRectValue] withAttributes:@{NSFontAttributeName:_fonts[i],
NSForegroundColorAttributeName:_fontColors[i]}];
}
}
}
-(instancetype)initWithUnevenHeightStrings:(NSArray *)strings stringFonts:(NSArray *)fonts stringRects:(NSArray *)rects stringColors:(NSArray *)colors{
self=[super init];
self.strings=strings;
self.fonts=fonts;
self.fontFrames=rects;
self.fontColors=colors;
//[self setNeedsDisplay];
return self;
}
@end
Demo:
使用方法很简单,直接在需要使用的地方调用,如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
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]]
stringRects:@[
[NSValue valueWithCGRect:CGRectMake(0, 0, 40, 30)],
[NSValue valueWithCGRect:CGRectMake(20, 5, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(35, 0, 25, 30)],
[NSValue valueWithCGRect:CGRectMake(55, 5, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(70, 0, 25, 30)],
[NSValue valueWithCGRect:CGRectMake(90, 5, 20, 20)]]
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];
UnevenHeightLabel *mylabel1=[[UnevenHeightLabel alloc] initWithUnevenHeightStrings:@[@"11.",@"0",@"%"]
stringFonts:@[[UIFont systemFontOfSize:25],
[UIFont systemFontOfSize:20],
[UIFont systemFontOfSize:25]]
stringRects:@[
[NSValue valueWithCGRect:CGRectMake(0, 0, 40, 30)],
[NSValue valueWithCGRect:CGRectMake(35, 5, 20, 20)],
[NSValue valueWithCGRect:CGRectMake(50, 0, 25, 30)]]
stringColors:@[[UIColor getColorFromHex:@"#ff8946"],
[UIColor getColorFromHex:@"#ff8946"],[UIColor getColorFromHex:@"#ff8946"]]];
[mylabel1 setFrame.:CGRectMake(SCREEN_WIDTH/2-50, SCREEN_HEIGHT/2+30, 100, 50)];
[mylabel1 setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:mylabel1];
}