UILabel 是我在第一次上手項目中,用得最多的一個控件。很是多的地方須要用它來顯示文本信息。服務器
一般須要繪製它的Frame、設置它的字體、顏色等等。最多見遇到的問題時,該如何去設置文本的大小以及位置,若是美工已經明確給出了視覺效果圖,那麼對於字體的大小,顏色均可以十分容易的進行設置了。而位置仍然是一個十分頭疼的問題。app
本文將主要就Text Attributes 和 Layout UILabel 來講一下個人體會。ide
首先,咱們來看一下UILable的常見屬性。佈局
objectivecUILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 120, 32]0, 30)]; label.text = @"文本內容文本內容文本內容"; label.attributedText = [[NSAttributedString alloc]initWithString:@"屬性文本屬性文本"]; label.font = [UIFont systemFontOfSize:15.0f]; label.textColor = [UIColor blackColor]; //文本的在文本框的顯示位置 label.textAlignment = NSTextAlignmentLeft; //文字過長時的現實方式 label.lineBreakMode = NSLineBreakByWordWrapping; //文本框是否容許多行(佈局相關) label.numberOfLines = 0; //設置是不是高亮 label.highlighted=YES; //高亮顏色 label.highlightedTextColor=[UIColor redColor]; //設置陰影顏色 label.shadowColor=[UIColor blueColor]; //陰影偏移量 label.shadowOffset=CGSizeMake(0.5, 0.5);
其中大多數屬性都是很是容易理解的。這裏簡單提一下其中的幾個屬性的枚舉值。字體
NSTextAlignmentLeft //左對齊
NSTextAlignmentCenter //居中
NSTextAlignmentRight //右對齊
NSTextAlignmentJustified//最後一行天然對齊
NSTextAlignmentNatural //默認對齊腳本spa
NSLineBreakByWordWrapping = 0,//以空格爲邊界,保留單詞
NSLineBreakByCharWrapping, //保留整個字符
NSLineBreakByClipping, //簡單剪裁,到邊界爲止
NSLineBreakByTruncatingHead, //按照"……文字"顯示
NSLineBreakByTruncatingTail, //按照"文字……文字"顯示
NSLineBreakByTruncatingMiddle //按照"文字……"顯示.net
首先設置UILabel的Frame,而後設置以上屬性,咱們即可以獲得你想要的文本框。設計
這個天然是有的,就好比我只寫了frame與text屬性,UILabel也會有默認的樣式來顯示內容。可是在開發中,特別是當沒有UI給定咱們字體的樣式時,如何設計出正常的(不醜)的文本樣式呢?那麼,就用系統的默認字體吧。code
objectivecUIFont *bodyFont = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
咱們將bodyFont設置成了UIFontStyleBody,系統不只提供了body的字體,還有更多其餘的:對象
objectivecNSString *const UIFontTextStyleHeadline; NSString *const UIFontTextStyleSubheadline; NSString *const UIFontTextStyleBody; NSString *const UIFontTextStyleFootnote; NSString *const UIFontTextStyleCaption1; NSString *const UIFontTextStyleCaption2;
在不一樣位置使用不一樣的默認字體,這樣是否是可以省去一些設計的麻煩呢。
固然咱們也能夠對獲取到的默認格式字體,進行修改,下面的代碼中,我向UIFontTextStyleBody中追加了加粗效果。
objectivecUIFontDescriptor *existingDescriptor = [bodyFont fontDescriptor]; UIFontDescriptorSymbolicTraits traints = existingDescriptor.symbolicTraits; traints |= UIFontDescriptorTraitBold; UIFontDescriptor *bodyBoldDescriptor = [existingDescriptor fontDescriptorWithSymbolicTraits:traints]; UIFont *boldBodyFont = [UIFont fontWithDescriptor:bodyBoldDescriptor size:0];
其中使用的UIFontDescriptor類,蘋果的官方解釋相信很是好理解。
UIFontDescriptor objects provide a mechanism to describe a font with a dictionary of attributes. This font descriptor can be used later to create or modify a UIFont object.
那麼經過這個類,咱們就能夠建立或者改造一個字體對象了。固然可供改造的屬性不少,這裏就不一一介紹了,由於不少我也沒有嘗試過。
關於文本框的樣式,簡單來講,就是文本框能夠顯示「藝術字」麼?UILabel提供了attributedText屬性,讓咱們爲UILabel設置Attributed字體。
簡單來講,過程是這樣的:
objectivecUILabel *lbl2 = [[UILabel alloc] initWithFrame:CGRectMake(0, 220, 320, 30)]; NSString *str = @"爲Label設置屬性字符串"; NSDictionary *fontAttributeDic = @{NSFontAttributeName:[UIFont preferredFontForTextStyle:UIFontTextStyleBody], NSForegroundColorAttributeName:[UIColor blueColor], NSStrokeColorAttributeName:[UIColor orangeColor], NSStrokeWidthAttributeName: @(-5), NSUnderlineStyleAttributeName: @(NSUnderlineStyleDouble), NSUnderlineColorAttributeName: [UIColor blackColor]}; NSMutableAttributedString *mutableAttributedStr = [[NSMutableAttributedString alloc]initWithString:str attributes:fontAttributeDic]; lbl2.attributedText = mutableAttributedStr; [self.view addSubview:lbl2];
代碼中咱們首先作了一個字典,字典中包含了我須要的屬性字符串的AttributeName。其中有前景色、邊緣色、邊緣寬度(設置爲-5,就表示邊緣在字體內部了)、下劃線類型、下劃線顏色等等。
也就是說
objectiveclabel.Text = @"aaaaa"; label.attributedText = @"bbbbb" ;
最後顯示在界面上的,會是attributedText,反之亦然。
上面代碼在模擬器中效果圖大概就是這樣子的啦:
寫一個固定寬高的UILabel,設置高度遠大於文本高度時,文本在文本框中是垂直方向上居中顯示的。
objectivecUILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(10, 20, 300, 100)]; label.backgroundColor = [UIColor yellowColor]; label.font = [UIFont systemFontOfSize:17.0f]; label.text = @"當高度太高時,UILabel是居中顯示的!!!"; [self.view addSubview:label]; UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(10, 220, 300, 100)]; label2.backgroundColor = [UIColor yellowColor]; label2.font = [UIFont systemFontOfSize:17.0f]; label2.text = @"當高度太高時,UILabel是居中顯示的!!!而且設置了多行顯示"; label2.numberOfLines = 0; [self.view addSubview:label2];
文本框垂直方向居中
也正是由於這個緣由,當咱們調整UILabel的高度時,發現文本的位置也發生了上下偏移。
但一般開發中,咱們但願能夠控制文本在Y方向上的位置,那麼高度就顯得很是重要了。
iOS提供了經過文本的字體及內容,計算文本框所需寬高的方法。返回的CGSize是牢牢包圍着文本內容的。
這樣,咱們就不再須要去估計UILabel的寬高了,能夠經過下面的方法,來根據內容和字體寫文本框寬高。
具體是下面這樣的:
objectivecUILabel *label3 = [[UILabel alloc]init]; label3.backgroundColor = [UIColor yellowColor]; label3.font = [UIFont systemFontOfSize:17.0f]; label3.text = @"根據文本框內容及字體,計算所需寬高"; label3.numberOfLines = 0; //================================================================================================================== NSDictionary *attributeDic = @{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}; CGSize constraintSize = CGSizeMake(100, CGFLOAT_MAX); CGSize realSize = [label3.text boundingRectWithSize:constraintSize options:NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading attributes:attributeDic context:nil].size; [label3 setFrame:CGRectMake(10, 310, realSize.width, realSize.height)]; //================================================================================================================== [self.view addSubview:label3];
上面的代碼中,咱們使用了下面的這個方法。
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
此方法能夠返回,符合條件的bounding rect,也就是咱們須要的CGRect對象,其中也就有咱們須要的寬和高了。
固然了這個方法,還有一個姐妹方法,不過已通過期了,仍是建議你們用這個方法來計算寬高。