1.第一种
demo
#pragma mark 给UILabel设置行间距和字间距等属性
+(NSAttributedString *)setAttributesWithLabel:(UILabel*)label withText:(NSString*)text withFont:(UIFont*)font{
NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
paraStyle.alignment = NSTextAlignmentCenter;
paraStyle.lineSpacing = 1; //设置行间距
paraStyle.hyphenationFactor = 1.0;
paraStyle.firstLineHeadIndent = 0.0;
paraStyle.paragraphSpacingBefore = 0.0;
paraStyle.headIndent = 0;
paraStyle.tailIndent = 0;
//设置字间距 NSKernAttributeName:@1.5f
NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle, NSKernAttributeName:@1.5f
};
NSAttributedString *attributeStr = [[NSAttributedString alloc] initWithString:text attributes:dic];
label.attributedText = attributeStr;
return label.attributedText;
}
#pragma mark 文字不同大小
+(NSAttributedString *)setSpecialAttributesWithLabel:(UILabel*)label withTipLength:(NSInteger)length withText:(NSString*)text withFontTip:(UIFont*)fontTip withFont:(UIFont*)font withColor:(UIColor *)color{
NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
paraStyle.lineBreakMode = NSLineBreakByCharWrapping;
paraStyle.alignment = NSTextAlignmentCenter;
paraStyle.lineSpacing = 1; //设置行间距
paraStyle.hyphenationFactor = 1.0;
paraStyle.firstLineHeadIndent = 0.0;
paraStyle.paragraphSpacingBefore = 0.0;
paraStyle.headIndent = 0;
paraStyle.tailIndent = 0;
//设置字间距 NSKernAttributeName:@1.5f
NSMutableAttributedString* rate = [[NSMutableAttributedString alloc] initWithString:text];
[rate addAttribute:NSFontAttributeName value:fontTip range:NSMakeRange(0, length)];
[rate addAttribute:NSFontAttributeName value:font range:NSMakeRange(length, text.length-length)];
[rate addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(length, text.length-length)];
[rate addAttribute:NSParagraphStyleAttributeName value:paraStyle range:NSMakeRange(0, text.length)];
[rate addAttribute:NSKernAttributeName value:@1.5f range:NSMakeRange(0, text.length)];
label.attributedText = rate;
return label.attributedText;
}
#pragma mark 计算UILabel的高度(先设置属性,再根据返回的NSAttributedString计算高度)
+(CGFloat)getLabelHeightWithAttributedString:(NSAttributedString*)attributedString withWidth:(CGFloat)width{
CGRect rect = [attributedString boundingRectWithSize:CGSizeMake(width, kScreenHeight) options:NSStringDrawingUsesLineFragmentOrigin context:nil];
return rect.size.height;
}
2.第二种:NSString的分类
/**
根据字体、行数、行间距和constrainedWidth计算文本占据的size
**/
- (CGSize)textSizeWithFont:(UIFont*)font
numberOfLines:(NSInteger)numberOfLines
lineSpacing:(CGFloat)lineSpacing
constrainedWidth:(CGFloat)constrainedWidth{
if (self.length == 0) {
return CGSizeZero;
}
CGFloat oneLineHeight = font.lineHeight;
CGSize textSize = [self boundingRectWithSize:CGSizeMake(constrainedWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
// 行数
CGFloat rows = textSize.height / oneLineHeight;
CGFloat realHeight = oneLineHeight;
// 0 不限制行数,真实高度加上行间距
if (numberOfLines == 0) {
if (rows >= 1) {
realHeight = (rows * oneLineHeight) + (rows - 1) * lineSpacing;
}
} else {
// 行数超过指定行数的时候,限制行数
if (rows > numberOfLines) {
rows = numberOfLines;
}
realHeight = (rows * oneLineHeight) + (rows - 1) * lineSpacing;
}
// 返回真实的宽高
return CGSizeMake(constrainedWidth, realHeight);
}
- (CGSize)textSizeWithFont:(UIFont*)font
numberOfLines:(NSInteger)numberOfLines
constrainedWidth:(CGFloat)constrainedWidth{
if (self.length == 0) {
return CGSizeZero;
}
CGFloat oneLineHeight = font.lineHeight;
CGSize textSize = [self boundingRectWithSize:CGSizeMake(constrainedWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:font} context:nil].size;
// 行数
CGFloat rows = textSize.height / oneLineHeight;
CGFloat realHeight = oneLineHeight;
// 0 不限制行数,真实高度加上行间距
if (numberOfLines == 0) {
if (rows >= 1) {
realHeight = (rows * oneLineHeight) + (rows - 1) ;
}
} else {
// 行数超过指定行数的时候,限制行数
if (rows > numberOfLines) {
rows = numberOfLines;
}
realHeight = (rows * oneLineHeight) + (rows - 1) ;
}
// 返回真实的宽高
return CGSizeMake(constrainedWidth, realHeight);
}
/// 计算字符串长度(一行时候)
- (CGSize)textSizeWithFont:(UIFont*)font
limitWidth:(CGFloat)maxWidth {
CGSize size = [self boundingRectWithSize:CGSizeMake(MAXFLOAT, 36)options:(NSStringDrawingTruncatesLastVisibleLine | NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes:@{ NSFontAttributeName : font} context:nil].size;
size.width = size.width > maxWidth ? maxWidth : size.width;
size.width = ceil(size.width);
size.height = ceil(size.height);
return size;
}
- (CGSize)textSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode {
CGSize textSize;
if (CGSizeEqualToSize(size, CGSizeZero)) {
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
textSize = [self sizeWithAttributes:attributes];
} else {
textSize = [self sizeWithFont:font constrainedToSize:size lineBreakMode:NSLineBreakByCharWrapping];
}
return textSize;
}
网友评论