對于UILabel其實我覺得并沒有太多的要素需要仔細(xì)去弄明白的,因為至今為止,我所了解到的label屬性不外乎就是NumberOfLines以及text、lineBreakMode這三種基本屬性,而對于其他的基礎(chǔ)屬性基本都是類似于其他的基礎(chǔ)控件,因而不值得一談。但今天遇到一些比較糾結(jié)的問題,明明代碼問題沒有,將這類型的代碼換到另外一個干凈而簡單的新建項目中就沒有任何問題,而在我現(xiàn)在這個項目中卻出現(xiàn)不可能錯誤。總結(jié)一下排錯方式:
1、text文本是顯示在那個控件上?在這個控件上有木有其他影響參數(shù),如果有,替換掉。
2、確保第一步準(zhǔn)確而無誤的條件下,仔細(xì)分類好項目中的代碼,條理要清晰,方便排錯。
3、在調(diào)試過程中,難免會遇到明明沒有問題的情況下還是會存在問題,保持一個虛心,謙遜的態(tài)度仔細(xì)分析問題,相信很快就能找出問題的出處。
下面粘貼一下關(guān)于UILabel的基礎(chǔ)屬性以及方法的用法
動態(tài)設(shè)置label的大小應(yīng)該用代碼實現(xiàn)UILabel的創(chuàng)建。
UILabel*?label?=?[[UILabelalloc]initWithFrame:CGRectMake(50,?50,?200,?400)];
[self.viewaddSubview:label];
這樣就用代碼實現(xiàn)了label的創(chuàng)建,其中initWithFrame設(shè)置了label的位置還有大小,其中CGRectMake可以通過另外聲明CGRect rect =CGRectMake(50,50,200,400)再將變量rect放在方法initWithFrame后實現(xiàn)CGRectMake的四個數(shù)值分別代表rect的位置坐標(biāo)x值,坐標(biāo)y值,寬度width,高度height。第二句[self.view addSubview:label]就是在當(dāng)前的視圖self.view中通過調(diào)用addSubview方法加入子視圖,就像貼紙一樣貼上去,會因為添加的順序不同而發(fā)生后一個添加的子視圖遮蓋前一個子視圖的現(xiàn)象,這個在后面講為label添加背景圖時還會提到。
或者用下面的代碼來改變label的大小
[objc]view plaincopy
label.frame?=?CGRectMake(97,?47,?223,?19);
設(shè)置label的標(biāo)記(tag)
[objc]view plaincopy
label.tag?=101;
設(shè)置label的文本內(nèi)容
[objc]view plaincopy
label.text?=@"abcd"或者
NSString*labelText?=@"abcd";
label.text?=?labelText;
把字符串的值賦給label
設(shè)置label的文字類型與大小
[objc]view plaincopy
label.font?=?[UIFontsystemFontOfSize:12];//采用系統(tǒng)默認(rèn)文字設(shè)置大小
label.font?=?[UIFontfontWithName:@"Arial"size:30];//設(shè)置文字類型與大小
設(shè)置label的文字顏色
[objc]view plaincopy
label.textColor?=?[UIColorlightGrayColor];//其中textColor要用UIColor類型
設(shè)置文本的對齊方式
[objc]view plaincopy
label.textAlignment?=?NSTextAlignmentLeft;
其中textAlignment有三種設(shè)置方式:NSTextAlignmentLeft為向左對齊,NSTextAlignmentCenter為居中對齊,NSTextAlignmentRight為向右對齊
如果有一些文章介紹時用的是UITextAlignmentCenter/UITextAlignmentLeft/UITextAlignmentRight,那是iOS6以前的用法,iOS6的最新用法已改
當(dāng)文本內(nèi)容很多,label無法全部顯示時label會將文本內(nèi)容以省略號的方式代替,下面說一下label文本省略方式的設(shè)置
[objc]view plaincopy
label.lineBreakMode?=NSLineBreakByCharWrapping;//其中l(wèi)ineBreakMode可選值為
linBreakModeenum{
NSLineBreakByWordWrapping?=?0,//保留整個單詞,以空格為邊界
NSLineBreakByCharWrapping,//保留整個字符
NSLineBreakByClipping,//以邊界為止
NSLineBreakByTruncatingHead,//省略開頭,以省略號代替
NSLineBreakByTruncatingTail,//省略結(jié)尾,以省略號代替
NSLineBreakByTruncatingMiddle//省略中間,以省略號代替
}
設(shè)置文本的行數(shù)
[objc]view plaincopy
label.numberOfLines?=?1;//行數(shù)設(shè)置為1,不設(shè)置時系統(tǒng)會默認(rèn)行數(shù)為1
當(dāng)需要設(shè)置的行數(shù)為不限數(shù)量的時候可以用numberOfLines=0實現(xiàn)
當(dāng)label大小使用sizeToFit方法,調(diào)整大小時會考慮到該屬性中存儲的值。例如,如果此屬性設(shè)置為3,sizeToFit方法會調(diào)整label使它大到足以顯示三行文本。
[objc]view plaincopy
[labelsizeToFit];
實現(xiàn)文本多行顯示
[objc]view plaincopy
commentTextLabel.lineBreakMode?=?NSLineBreakByCharWrapping;
commentTextLabel.numberOfLines?=?0;
文本自動根據(jù)label大小自動調(diào)整字體尺寸
[objc]view plaincopy
label.numberOfLines?=1;
label.adjustsFontSizeToFitWidth?=YES;
adjustFontSizeToFitWidth方法可實現(xiàn)文本自動根據(jù)label大小自動調(diào)整字體尺寸,直到文本的大小達(dá)到了自己設(shè)置的label文本尺寸最大、最小值與字符串的最大最小值,要是用這個方法還有一個很大的限制就是只有在numberOfLines設(shè)置為1時才能用
如果行數(shù)是超過了1行,要實現(xiàn)自動調(diào)整字體大小功能,就沒有可以自適應(yīng)的系統(tǒng)方法可以使用,只有自己用代碼實現(xiàn),在設(shè)計時因為要考慮到手機(jī)屏幕的實際大小有限,如果字體太小會影響用戶體驗,所以要設(shè)置一個最小字號的判斷,小于最小字號就要用到縮略顯示,下面的代碼中主要是用到
[objc]view plaincopy
CGSize?size?=?[textsizeWithFont:fontconstrainedToSize:CGSizeMake(100,?180)lineBreakMode:NSLineBreakByCharWrapping];
來得到字體在某一字號下的高度,判斷與label高度是否一致,其中text是輸入label的文本內(nèi)容,sizWithFont設(shè)置字體,constrainedToSize設(shè)置約束文本的矩形大小參數(shù),其中寬度要和label一致,高度設(shè)置要足夠高,要比label高很多,否則會出現(xiàn)文本顯示不全的問題,lineBreakMode的作用上文有講過。如果算出的高度超出了label高度,就把字號以循環(huán)的方式減小直到高度符合就跳出循環(huán)。
[objc]view plaincopy
floatmaxHeight?=50;//設(shè)置最大高度
floatminFontSize?=9;
floatheight;
intfontSize?=?31;//設(shè)置最大字號
NSString*text?=@"輸入文本內(nèi)容";
do{
fontSize?=?fontSize?-?1;
UIFont*font?=[UIFontfontWithName:@"Arial"size:fontSize];
CGSize?size?=?[textsizeWithFont:fontconstrainedToSize:CGSizeMake(100,?180)/*寬度與label的寬度一樣,高度應(yīng)高于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)?{//判斷字體是否小于最小字號,小于最小字號時就使用系統(tǒng)默認(rèn)的縮略顯示
label.font?=?[UIFontfontWithName:@"Arial"size:15];
}
else{
label.font?=?[UIFontfontWithName:@"Arial"size:fontSize];
label.lineBreakMode?=?NSLineBreakByCharWrapping;//實現(xiàn)文字多行顯示
label.numberOfLines?=?0;
}
[self.viewaddSubview:label];
根據(jù)文本數(shù)量自動調(diào)整label高度
其實就是用上面的方法得到高度再生成label
[objc]view plaincopy
NSString*text?=[[NSStringalloc]init];
text?=@"輸入文本內(nèi)容";
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;//實現(xiàn)文字多行顯示
textLabel.numberOfLines?=?0;
[self.viewaddSubview:textLabel];
設(shè)置label的邊框粗細(xì)與顏色,設(shè)置前要在相應(yīng)文件中加入#import
[objc]view plaincopy
label.layer.borderColor?=?[UIColorlightGrayColor].CGColor;//邊框顏色,要為CGColor
label.layer.borderWidth?=?1;//邊框?qū)挾?/p>
設(shè)置label的背景顏色
[objc]view plaincopy
label.backgroundColor?=[UIColoryellowColor];
設(shè)置label背景圖
設(shè)置背景圖有兩種方法,下面先介紹第一種方法:
設(shè)置背景圖可以把一張大小與label一樣的圖放在label的后面一層,然后把label的背景設(shè)置為透明,這樣實現(xiàn)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會根據(jù)自身大小改變添加的圖片的大小所以不需要額外設(shè)置image
label.backgroundColor?=?[UIColorclearColor];
label.text?=@"hello?world";
label.font?=?[UIFontsystemFontOfSize:30];
label.textColor?=?[UIColoryellowColor];
[self.viewaddSubview:imageView];//添加的順序不能錯,否則圖片會覆蓋label
[self.viewaddSubview:label];
這個是一個有點不正統(tǒng)的方法,下面要介紹更加規(guī)范的第二種方法:用UIColor設(shè)置圖片,然后把UIColor作為背景顏色,就可以實現(xiàn)label設(shè)置背景圖
[objc]view plaincopy
UIColor*?color?=?[UIColorcolorWithPatternImage:image];//image為需要添加的背景圖
UILabel*?label?=?[[UILabelalloc]initWithFrame:CGRectMake(50,?50,?100,?200)];
[labelsetBackgroundColor:color];
[self.viewaddSubview:label];
但這個方法有一個嚴(yán)重的缺陷,就是當(dāng)背景圖的尺寸與label大小不一致時,會出現(xiàn)背景圖被部分截取或者平鋪重復(fù)的情況,所以更完善的方法是要先修改好背景圖的大小與label大小一致再設(shè)置背景顏色。可以用下面的函數(shù)設(shè)置image尺寸
[objc]view plaincopy
-(UIImage*)scaleImage:(UIImage*)imgToSize:(CGSize)itemSize{
UIImage*i;
//創(chuàng)建一個bitmap的context,并把它設(shè)置成為當(dāng)前正在使用的context
UIGraphicsBeginImageContext(itemSize);
CGRect?imageRect=CGRectMake(0,?0,?itemSize.width,?itemSize.height);
//繪制改變大小的圖片
[imgdrawInRect:imageRect];
//從當(dāng)前context中創(chuàng)建一個改變大小后的圖片
i=UIGraphicsGetImageFromCurrentImageContext();
//使當(dāng)前的context出堆棧
UIGraphicsEndImageContext();
//返回新的改變大小后的圖片
returni;
}
然后在主函數(shù)中調(diào)用即可
[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];
設(shè)置高亮
[objc]view plaincopy
label.highLighted?=YES;
設(shè)置文本陰影
[objc]view plaincopy
label.shadowColor?=[UIColorgrayColor];
設(shè)置陰影大小
[objc]view plaincopy
label.shadowOffset?=?CGSizeMake(2.0,?2.0);
設(shè)置label圓角
[objc]view plaincopy
label.layer.cornerRadius?=?10;
要是用這樣的設(shè)置要先在頭文件中加上#import