简介
在这里label布局所需的width的最大值是个定值,也就是说我们是在纵向上对label进行布局,横向做了限制。
思路
- 需要先判断在一行中是否可以容纳这个label:如果可以则采用单行的计算方式,如果不可以,则采用多行的计算方式
- 对于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) {//单行里可以实现
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默认为整个字符串
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) {//单行里可以实现
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];
}
网友评论