UILabel

对于UILabel其实我觉得并没有太多的要素需要仔细去弄明白的,因为至今为止,我所了解到的label属性不外乎就是NumberOfLines以及text、lineBreakMode这三种基本属性,而对于其他的基础属性基本都是类似于其他的基础控件,因而不值得一谈。但今天遇到一些比较纠结的问题,明明代码问题没有,将这类型的代码换到另外一个干净而简单的新建项目中就没有任何问题,而在我现在这个项目中却出现不可能错误。总结一下排错方式:

1、text文本是显示在那个控件上?在这个控件上有木有其他影响参数,如果有,替换掉。

2、确保第一步准确而无误的条件下,仔细分类好项目中的代码,条理要清晰,方便排错。

3、在调试过程中,难免会遇到明明没有问题的情况下还是会存在问题,保持一个虚心,谦逊的态度仔细分析问题,相信很快就能找出问题的出处。

下面粘贴一下关于UILabel的基础属性以及方法的用法

动态设置label的大小应该用代码实现UILabel的创建。

UILabel* label = [[UILabelalloc]initWithFrame:CGRectMake(50, 50, 200, 400)];

[self.viewaddSubview:label];

这样就用代码实现了label的创建,其中initWithFrame设置了label的位置还有大小,其中CGRectMake可以通过另外声明CGRect rect =CGRectMake(50,50,200,400)再将变量rect放在方法initWithFrame后实现CGRectMake的四个数值分别代表rect的位置坐标x值,坐标y值,宽度width,高度height。第二句[self.view addSubview:label]就是在当前的视图self.view中通过调用addSubview方法加入子视图,就像贴纸一样贴上去,会因为添加的顺序不同而发生后一个添加的子视图遮盖前一个子视图的现象,这个在后面讲为label添加背景图时还会提到。

或者用下面的代码来改变label的大小

[objc]view plaincopy

label.frame = CGRectMake(97, 47, 223, 19);

设置label的标记(tag)

[objc]view plaincopy

label.tag =101;

设置label的文本内容

[objc]view plaincopy

label.text =@"abcd"或者

NSString*labelText =@"abcd";

label.text = labelText;

把字符串的值赋给label

设置label的文字类型与大小

[objc]view plaincopy

label.font = [UIFontsystemFontOfSize:12];//采用系统默认文字设置大小

label.font = [UIFontfontWithName:@"Arial"size:30];//设置文字类型与大小

设置label的文字颜色

[objc]view plaincopy

label.textColor = [UIColorlightGrayColor];//其中textColor要用UIColor类型

设置文本的对齐方式

[objc]view plaincopy

label.textAlignment = NSTextAlignmentLeft;

其中textAlignment有三种设置方式:NSTextAlignmentLeft为向左对齐,NSTextAlignmentCenter为居中对齐,NSTextAlignmentRight为向右对齐

如果有一些文章介绍时用的是UITextAlignmentCenter/UITextAlignmentLeft/UITextAlignmentRight,那是iOS6以前的用法,iOS6的最新用法已改

当文本内容很多,label无法全部显示时label会将文本内容以省略号的方式代替,下面说一下label文本省略方式的设置

[objc]view plaincopy

label.lineBreakMode =NSLineBreakByCharWrapping;//其中lineBreakMode可选值为

linBreakModeenum{

NSLineBreakByWordWrapping = 0,//保留整个单词,以空格为边界

NSLineBreakByCharWrapping,//保留整个字符

NSLineBreakByClipping,//以边界为止

NSLineBreakByTruncatingHead,//省略开头,以省略号代替

NSLineBreakByTruncatingTail,//省略结尾,以省略号代替

NSLineBreakByTruncatingMiddle//省略中间,以省略号代替

}

设置文本的行数

[objc]view plaincopy

label.numberOfLines = 1;//行数设置为1,不设置时系统会默认行数为1

当需要设置的行数为不限数量的时候可以用numberOfLines=0实现

当label大小使用sizeToFit方法,调整大小时会考虑到该属性中存储的值。例如,如果此属性设置为3,sizeToFit方法会调整label使它大到足以显示三行文本。

[objc]view plaincopy

[labelsizeToFit];

实现文本多行显示

[objc]view plaincopy

commentTextLabel.lineBreakMode = NSLineBreakByCharWrapping;

commentTextLabel.numberOfLines = 0;

文本自动根据label大小自动调整字体尺寸

[objc]view plaincopy

label.numberOfLines =1;

label.adjustsFontSizeToFitWidth =YES;

adjustFontSizeToFitWidth方法可实现文本自动根据label大小自动调整字体尺寸,直到文本的大小达到了自己设置的label文本尺寸最大、最小值与字符串的最大最小值,要是用这个方法还有一个很大的限制就是只有在numberOfLines设置为1时才能用

如果行数是超过了1行,要实现自动调整字体大小功能,就没有可以自适应的系统方法可以使用,只有自己用代码实现,在设计时因为要考虑到手机屏幕的实际大小有限,如果字体太小会影响用户体验,所以要设置一个最小字号的判断,小于最小字号就要用到缩略显示,下面的代码中主要是用到

[objc]view plaincopy

CGSize size = [textsizeWithFont:fontconstrainedToSize:CGSizeMake(100, 180)lineBreakMode:NSLineBreakByCharWrapping];

来得到字体在某一字号下的高度,判断与label高度是否一致,其中text是输入label的文本内容,sizWithFont设置字体,constrainedToSize设置约束文本的矩形大小参数,其中宽度要和label一致,高度设置要足够高,要比label高很多,否则会出现文本显示不全的问题,lineBreakMode的作用上文有讲过。如果算出的高度超出了label高度,就把字号以循环的方式减小直到高度符合就跳出循环。

[objc]view plaincopy

floatmaxHeight =50;//设置最大高度

floatminFontSize =9;

floatheight;

intfontSize = 31;//设置最大字号

NSString*text =@"输入文本内容";

do{

fontSize = fontSize - 1;

UIFont*font =[UIFontfontWithName:@"Arial"size:fontSize];

CGSize size = [textsizeWithFont:fontconstrainedToSize:CGSizeMake(100, 180)/*宽度与label的宽度一样,高度应高于label高度*/lineBreakMode:NSLineBreakByCharWrapping];

height = size.height;

NSLog(@"height=%f,fontSize=%d,text=%@",height,fontSize,text);

}while(height > maxHeight&&fontSize>minFontSize);

UILabel*label = [[UILabelalloc]initWithFrame:CGRectMake(50, 50, 100, 50)];

label.text =text;

if(fontSize ==9) {//判断字体是否小于最小字号,小于最小字号时就使用系统默认的缩略显示

label.font = [UIFontfontWithName:@"Arial"size:15];

}

else{

label.font = [UIFontfontWithName:@"Arial"size:fontSize];

label.lineBreakMode = NSLineBreakByCharWrapping;//实现文字多行显示

label.numberOfLines = 0;

}

[self.viewaddSubview:label];

根据文本数量自动调整label高度

其实就是用上面的方法得到高度再生成label

[objc]view plaincopy

NSString*text =[[NSStringalloc]init];

text =@"输入文本内容";

CGSize size = CGSizeMake(280, 180);

UIFont*fonts = [UIFontsystemFontOfSize:14.0];

CGSize msgSie = [textsizeWithFont:fontsconstrainedToSize:sizelineBreakMode:NSLineBreakByCharWrapping];

UILabel*textLabel  = [[UILabelalloc]init];

[textLabelsetFont:[UIFontboldSystemFontOfSize:14]];

textLabel.frame = CGRectMake(20,70, 280,msgSie.height);

textLabel.text = text;

textLabel.lineBreakMode = NSLineBreakByCharWrapping;//实现文字多行显示

textLabel.numberOfLines = 0;

[self.viewaddSubview:textLabel];

设置label的边框粗细与颜色,设置前要在相应文件中加入#import

[objc]view plaincopy

label.layer.borderColor = [UIColorlightGrayColor].CGColor;//边框颜色,要为CGColor

label.layer.borderWidth = 1;//边框宽度

设置label的背景颜色

[objc]view plaincopy

label.backgroundColor =[UIColoryellowColor];

设置label背景图

设置背景图有两种方法,下面先介绍第一种方法:

设置背景图可以把一张大小与label一样的图放在label的后面一层,然后把label的背景设置为透明,这样实现label有背景

[objc]view plaincopy

UILabel* label = [[UILabelalloc]initWithFrame:CGRectMake(50, 50, 200, 400)];

UIImageView*imageView =[[UIImageViewalloc]init];

imageView.frame =CGRectMake(50, 50, 200, 400);

UIImage*image=[UIImageimageNamed:@"1.jpg"];

imageView.image =image;//imageView会根据自身大小改变添加的图片的大小所以不需要额外设置image

label.backgroundColor = [UIColorclearColor];

label.text =@"hello world";

label.font = [UIFontsystemFontOfSize:30];

label.textColor = [UIColoryellowColor];

[self.viewaddSubview:imageView];//添加的顺序不能错,否则图片会覆盖label

[self.viewaddSubview:label];

这个是一个有点不正统的方法,下面要介绍更加规范的第二种方法:用UIColor设置图片,然后把UIColor作为背景颜色,就可以实现label设置背景图

[objc]view plaincopy

UIColor* color = [UIColorcolorWithPatternImage:image];//image为需要添加的背景图

UILabel* label = [[UILabelalloc]initWithFrame:CGRectMake(50, 50, 100, 200)];

[labelsetBackgroundColor:color];

[self.viewaddSubview:label];

但这个方法有一个严重的缺陷,就是当背景图的尺寸与label大小不一致时,会出现背景图被部分截取或者平铺重复的情况,所以更完善的方法是要先修改好背景图的大小与label大小一致再设置背景颜色。可以用下面的函数设置image尺寸

[objc]view plaincopy

-(UIImage*)scaleImage:(UIImage*)imgToSize:(CGSize)itemSize{

UIImage*i;

//创建一个bitmap的context,并把它设置成为当前正在使用的context

UIGraphicsBeginImageContext(itemSize);

CGRect imageRect=CGRectMake(0, 0, itemSize.width, itemSize.height);

//绘制改变大小的图片

[imgdrawInRect:imageRect];

//从当前context中创建一个改变大小后的图片

i=UIGraphicsGetImageFromCurrentImageContext();

//使当前的context出堆栈

UIGraphicsEndImageContext();

//返回新的改变大小后的图片

returni;

}

然后在主函数中调用即可

[objc]view plaincopy

CGSize size= CGSizeMake(100, 200);

UIImage*image =[UIImageimageNamed:@"1.jpg"];

UIImage*laterImage =[selfscaleImage:imageToSize:size];

UIColor* color = [UIColorcolorWithPatternImage:laterImage];

UILabel* label = [[UILabelalloc]initWithFrame:CGRectMake(50, 50, 100, 200)];

[labelsetBackgroundColor:color];

[self.viewaddSubview:label];

设置高亮

[objc]view plaincopy

label.highLighted =YES;

设置文本阴影

[objc]view plaincopy

label.shadowColor =[UIColorgrayColor];

设置阴影大小

[objc]view plaincopy

label.shadowOffset = CGSizeMake(2.0, 2.0);

设置label圆角

[objc]view plaincopy

label.layer.cornerRadius = 10;

要是用这样的设置要先在头文件中加上#import

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容