#基本用法
//创建uilabel
UILabel*label1 = [[UILabelalloc]initWithFrame:CGRectMake(20,40,280,80)];
//设置背景色
label1.backgroundColor= [UIColorgrayColor];
//设置tag
label1.tag=91;
//设置标签文本
label1.text=@"CCBASE.NET!";
//设置标签文本字体和字体大小
label1.font= [UIFontfontWithName:@"Arial"size:30];
//设置文本对齐方式
label1.textAlignment=UITextAlignmentCenter;
//文本对齐方式有以下三种
//typedef enum {
// UITextAlignmentLeft = 0,左对齐
// UITextAlignmentCenter,居中对齐
// UITextAlignmentRight,右对齐
//} UITextAlignment;
//文本颜色
label1.textColor= [UIColorblueColor];
//超出label边界文字的截取方式
label1.lineBreakMode=UILineBreakModeTailTruncation;
//截取方式有以下6种
//typedef enum {
// UILineBreakModeWordWrap = 0,以空格为边界,保留整个单词
// UILineBreakModeCharacterWrap,保留整个字符
// UILineBreakModeClip,到边界为止
// UILineBreakModeHeadTruncation,省略开始,以……代替
// UILineBreakModeTailTruncation,省略结尾,以……代替
// UILineBreakModeMiddleTruncation,省略中间,以……代替,多行时作用于最后一行
//} UILineBreakMode;
//文本文字自适应大小
label1.adjustsFontSizeToFitWidth=YES;
//当adjustsFontSizeToFitWidth=YES时候,如果文本font要缩小时
//baselineAdjustment这个值控制文本的基线位置,只有文本行数为1是有效
label1.baselineAdjustment=UIBaselineAdjustmentAlignCenters;
//有三种方式
//typedef enum {
// UIBaselineAdjustmentAlignBaselines = 0,默认值文本最上端于label中线对齐
// UIBaselineAdjustmentAlignCenters,//文本中线于label中线对齐
// UIBaselineAdjustmentNone,//文本最低端与label中线对齐
//} UIBaselineAdjustment;
//文本最多行数,为0时没有最大行数限制
label1.numberOfLines=2;
//最小字体,行数为1时有效,默认为0.0
label1.minimumFontSize=10.0;
//文本高亮
label1.highlighted=YES;
//文本是否可变
label1.enabled=YES;
//去掉label背景色
//label1.backgroundColor = [UIColor clearColor];
//文本阴影颜色
label1.shadowColor= [UIColorgrayColor];
//阴影大小
label1.shadowOffset=CGSizeMake(1.0,1.0);
//是否能与用户交互
label1.userInteractionEnabled=YES;
[self.viewaddSubview:label1];
#延伸
很多时候我们再做一些类似于音乐软件的时候要对读过的文字进行着色下面提供一个思路:
- (void)drawRect:(CGRect)rect {
[super drawRect:rect];
// 1.填充颜色
[[UIColor greenColor] set];
// 2.设置改变颜色的宽度 (实际开发中,这里可以设置进度比例,然后外部刷新即可。为了演示效果,我就直接设置为0.5了)
rect.size.width *= 0.5;(此处可以来进行修改)
// 3.label颜色混合模式填充 kCGBlendModeSourceIn:来源颜色,也就是我们第一步填充的颜色
UIRectFillUsingBlendMode(rect, kCGBlendModeSourceIn);
}
如下图:
关于部分文字的点击事件:
label的点击事件我们可以通过加入tap手势来进行点击事件,在一些社交软件中会出现一些话题点击类似微博的话题.因为label的sizetofit这个方法所以label是可以自己给自己大小的.但是对于一些网址,和特殊颜色的文字的点击事件怎么处理呢?
- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc] init];
[label sizeToFit];
label.numberOfLines = 0;
label.frame = CGRectMake(30,30, 200, 300);
[self.view addSubview:label];
_label = label;
[self setupUI];
}
- (void)setupUI{
NSString *str = @"李白乘舟将欲行\n忽闻岸上踏歌声\n桃花潭水深千尺\n不及汪伦送我情";
//文字设置字体的限制和范围
NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithString:str];
[attrStr addAttribute:NSFontAttributeName
value:[UIFont systemFontOfSize:30.0f]
range:NSMakeRange(0, 3)];
//添加文字颜色
[attrStr addAttribute:NSForegroundColorAttributeName
value:[UIColor redColor]
range:NSMakeRange(16, 7)];
//添加下划线
[attrStr addAttribute:NSUnderlineStyleAttributeName
value:[NSNumber numberWithInteger:NSUnderlineStyleSingle]
range:NSMakeRange(8, 7)];
//调整段落样式(对文字的段落调整的时候要用到NSMutableParagraphStyle类)
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
//行间距
paragraph.lineSpacing = 10;
//段落间距
paragraph.paragraphSpacing = 20;
//对齐方式
paragraph.alignment = NSTextAlignmentLeft;
//指定段落开始的缩进像素
paragraph.firstLineHeadIndent = 30;
//调整全部文字的缩进像素
paragraph.headIndent = 10;
[attrStr addAttribute:NSParagraphStyleAttributeName
value:paragraph
range:NSMakeRange(0, [str length])];
NSString *urlStr = @"www.baidu.com";
NSURL *url = [NSURL URLWithString:urlStr];
[attrStr addAttribute:NSLinkAttributeName
value:url
range:NSMakeRange(23, 7)];
_label.attributedText = attrStr;
}
下面是效果图:
计算label的大小
对于我们开发者来说,有时候涉及到社交软件的时候,往往会需要根据文字来计算label的大小,之前做的一个社交软件,由于界面比较多的控件,性能不好的时候,往往要进行一个缓存行高但是对于其他字体的计算label的高度往往是不一样的,直接上代码吧:
//计算UILabel的高度(带有行间距的情况)
-(CGFloat)getSpaceLabelHeight:(NSString*)str withFont:(UIFont*)font withWidth:(CGFloat)width {
NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
paraStyle.alignment = NSTextAlignmentLeft;
paraStyle.lineSpacing = 12;
paraStyle.hyphenationFactor = 1.0;
paraStyle.firstLineHeadIndent = 0.0;
paraStyle.paragraphSpacingBefore = 0.0;
paraStyle.headIndent = 0;
paraStyle.tailIndent = 0;
NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:@1.5f
};
CGSize size = [str boundingRectWithSize:CGSizeMake(width, KSREENHEIGHT) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
return size.height;
}
此方法计算的label的高度与字体相结合,当然也有少许的误差,基本上无大碍.
类似于微信的一些评论界面的实现(点击名字可以实现跳转,点击评论可以实现回复):
之前做这种的时候,有点难受.如果处理的不好很影响用户的体验,个人推荐TTTLabel,这个用起来还是比较好用的,因为字体的问题,有可能要进行计算,不然有可能会出现点击效果出问题.
当然还有一种方法是别人的一个思路,就是当你的label自动计算出大小,我们可以在他的上面覆盖一个textFlied 然后根据文字的范围来确定点击事件.当然可行,但是我试过性能呢不是太好.
显示多条评论和二级评论其实是比较复杂的,多条评论的解决方法,我的方法是:评论界面用一个tableView来实现,每一行都只包含一个Label(tttlabel),然后在model里面直接计算出TableView的大小(这样性能会好),再根据每条的数据计算出每个cell的高度,再整个cell的高度计算出来就基本上实现了一个很好性能的cell.