關於UILabel的屬性與佈局的一些體會

UILabel 是我在第一次上手項目中,用得最多的一個控件。很是多的地方須要用它來顯示文本信息。服務器

一般須要繪製它的Frame、設置它的字體、顏色等等。最多見遇到的問題時,該如何去設置文本的大小以及位置,若是美工已經明確給出了視覺效果圖,那麼對於字體的大小,顏色均可以十分容易的進行設置了。而位置仍然是一個十分頭疼的問題。app

本文將主要就Text Attributes 和 Layout UILabel 來講一下個人體會。ide


Accessing the Text Attributes

首先,咱們來看一下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);

其中大多數屬性都是很是容易理解的。這裏簡單提一下其中的幾個屬性的枚舉值。字體

NSTextAlignment

NSTextAlignmentLeft //左對齊
NSTextAlignmentCenter //居中
NSTextAlignmentRight //右對齊
NSTextAlignmentJustified//最後一行天然對齊
NSTextAlignmentNatural //默認對齊腳本spa

NSLineBreakMode

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,就表示邊緣在字體內部了)、下劃線類型、下劃線顏色等等。

Tips:當同時設置了label.text 與 label.attributedText 時,之後設置的爲準。

也就是說

objectiveclabel.Text = @"aaaaa";
label.attributedText = @"bbbbb" ;

最後顯示在界面上的,會是attributedText,反之亦然。
上面代碼在模擬器中效果圖大概就是這樣子的啦:

img src=

UILabel固定寬度與高度的狀況下

寫一個固定寬高的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對象,其中也就有咱們須要的寬和高了。

img src=

固然了這個方法,還有一個姐妹方法,不過已通過期了,仍是建議你們用這個方法來計算寬高。

img src=

相關文章
相關標籤/搜索