簡介
在這里label布局所需的width的最大值是個定值,也就是說我們是在縱向上對label進(jìn)行布局,橫向做了限制。
思路
- 需要先判斷在一行中是否可以容納這個label:如果可以則采用單行的計(jì)算方式,如果不可以,則采用多行的計(jì)算方式
- 對于label,我們采用屬性attributedText來生成label。
- 在這里寫了一個NSString的extend文件
類目文件
// NSString+SFExtension.h
// CellTest
//
// Created by hushunfeng on 2017/8/31.
// Copyright ? 2017年 hushunfeng. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface NSString (SFExtension)
/**
獲取一段文字的高度
@param text 字符串
@param fontSize 字體大小
@param spacing 行間距
@param width 單行的最大寬度
@return 高度、寬度返回
*/
+ (CGSize)getTextHWithText:(NSString *)text FontSize:(int)fontSize lineSpacing:(CGFloat)spacing maxWidthLimit:(CGFloat)width;
/**
獲取屬性字符串,用于label
@param text 字符串
@param fontSize 字體大小
@param spacing 行間距
@param textColor 字體顏色
@return 屬性字符串
*/
+ (NSMutableAttributedString *)getAttributedStringWithText:(NSString *)text fontSize:(int)fontSize lineSpacing:(CGFloat)spacing color:(UIColor *)textColor maxWidthLimit:(CGFloat)width;
@end
//
// NSString+SFExtension.m
// CellTest
//
// Created by hushunfeng on 2017/8/31.
// Copyright ? 2017年 hushunfeng. All rights reserved.
//
#import "NSString+SFExtension.h"
@implementation NSString (SFExtension)
+ (CGSize)getTextHWithText:(NSString *)text FontSize:(int)fontSize lineSpacing:(CGFloat)spacing maxWidthLimit:(CGFloat)width {
//先判斷是否需要多行
CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}];
if (size.width <= width) {//單行里可以實(shí)現(xiàn)
return size;
}
else {
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
CGRect textSize = [text boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesFontLeading|NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSParagraphStyleAttributeName:paragraphStyle} context:nil];
return textSize.size;
}
}
+ (NSMutableAttributedString *)getAttributedStringWithText:(NSString *)text fontSize:(int)fontSize lineSpacing:(CGFloat)spacing color:(UIColor *)textColor maxWidthLimit:(CGFloat)width{
//這里range默認(rèn)為整個字符串
NSRange allRange = [text rangeOfString:text];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = spacing;
CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}];
if (size.width <= width) {//單行里可以實(shí)現(xiàn)
paragraphStyle.lineSpacing = 0;
}
NSMutableAttributedString *labelStr = [[NSMutableAttributedString alloc] initWithString:text];
[labelStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:fontSize] range:allRange];
[labelStr addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:allRange];
[labelStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:allRange];
return labelStr;
}
@end
使用辦法
// ViewController.m
// CellTest
//
// Created by hushunfeng on 2017/8/30.
// Copyright ? 2017年 hushunfeng. All rights reserved.
//
#import "ViewController.h"
#import "NSString+SFExtension.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *textStr = @"第 九 十 的 dfjsak sjeaflk ";
UILabel *label = [[UILabel alloc] init];
label.numberOfLines = -1;
CGSize size = [NSString getTextHWithText:textStr FontSize:12 lineSpacing:18 maxWidthLimit:200];
NSMutableAttributedString *attributedString = [NSString getAttributedStringWithText:textStr fontSize:12 lineSpacing:18 color:[UIColor redColor] maxWidthLimit:200];
label.attributedText = attributedString;
label.frame = CGRectMake(100, 100, size.width, size.height);
[self.view addSubview:label];
}