通過代碼創建label 計算最佳尺寸 讓其自適應文本高度或寬度


通過xib創建label  讓label隨着文本內容的變化而動態改變尺寸比較簡單  只要不固定死尺寸就可以了  但是通過代碼創建的話我們需要給label設置一個frame  否則label默認是沒有尺寸也就不會顯示出來的

但是一旦我們設置了frame label的尺寸也就固定了  所以我們需要通過另外的屬性來獲取最佳的尺寸從而設置label的尺寸達到最佳的顯示效果:

sizeThatFits

// return 'best' size to fit given size. does not actually resize view. Default is return existing view size

//會根據輸入的文本長度  返回“最佳”大小適合給定的大小

使用:

        //首先創建一個label
        UILabel *nameLabel = [[UILabel alloc]init];
        nameLabel.font = [UIFont systemFontOfSize:14];
       //在設置frame之前要給label一個初始化的文字 沒有文字的話label是沒有尺寸的
        nameLabel.text = @"  ";
      //設置想要的效果:比如說我想讓label寬度固定 高度不固定  那我只需要設置好寬度就可以了   高度的話可以隨便給個值
        CGSize maximumLabelSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - nameLabel.x-10, 9999);//labelsize的最大值
      //根據文本內容返回最佳的尺寸
        CGSize expectSize = [nameLabel sizeThatFits:maximumLabelSize];
     //設置label的frame
        nameLabel.frame = CGRectMake(CGRectGetMaxX(iconBtn.frame)+20, iconBtn.y+5,expectSize.width,expectSize.height);
     //設置文字對齊方式
        nameLabel.textAlignment = NSTextAlignmentLeft;
        [self.contentView addSubview:nameLabel];

如果后面需要更改label中的文字內容或者重新賦值  還需要重新設置label的frame或者尺寸:

    //這個x與y是我在我的代碼中設置的 不是固定的 要根據實際需求去設置  主要是長度與寬度的設置
    CGSize maximumLabelSize = CGSizeMake([UIScreen mainScreen].bounds.size.width - _nickName.x-10, 30);//labelsize的最大值
    CGSize expectSize = [_nickName sizeThatFits:maximumLabelSize];
    _nickName.frame = CGRectMake(CGRectGetMaxX(self.icon.frame)+20, self.icon.y+5,expectSize.width,expectSize.height);

效果圖:

另外  我們經常會用到TTTAttributedLabel去達到某個功能 或者實現某個效果  效果圖中的評論部分就是繼承自TTTAttributedLabel的  行間距是自定義的  所以在計算最佳尺寸的時候 TTTAttributedLabel重寫了sizeThatFits方法:

- (CGSize)sizeThatFits:(CGSize)size {
    if (!self.attributedText) {
        return [super sizeThatFits:size];
    } else {
        NSMutableAttributedString *fullString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
        
        if (self.attributedTruncationToken) {
            [fullString appendAttributedString:self.attributedTruncationToken];
        }
        
        NSAttributedString *string = [[NSAttributedString alloc] initWithAttributedString:fullString];
        
        CGSize labelSize = CTFramesetterSuggestFrameSizeForAttributedStringWithConstraints([self framesetter], string, size, (NSUInteger)self.numberOfLines);
        labelSize.width += self.textInsets.left + self.textInsets.right;
        labelSize.height += self.textInsets.top + self.textInsets.bottom;

        return labelSize;
    }
}

所以即使是TTTAttributedLabel也能像普通label一樣計算出最佳尺寸

注意:

  1.設置lable大小的時候需要先進行lable的text賦值  否則label會沒有尺寸

     2.如果要將lable居中顯示的話,lable.center屬性的設置必須放在設置新大小之后,不然會出現不居中的情況


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM