美文网首页
String 各种计算高度

String 各种计算高度

作者: 沁晓Chr | 来源:发表于2016-03-15 14:37 被阅读931次

一般方法

+ (CGFloat)heightForLableWithText:(NSString *)text Font:(UIFont*)font AndlableWidth:(CGFloat)lableWidth

{

CGSize textSize = CGSizeMake(lableWidth, CGFLOAT_MAX);

//计算高度

CGSize sizeWithFont = [text boundingRectWithSize:textSize options: NSStringDrawingUsesLineFragmentOrigin |

NSStringDrawingUsesFontLeading|NSStringDrawingUsesDeviceMetrics attributes:@{NSFontAttributeName:font} context:nil].size;

return ceil(sizeWithFont.height);

}

带表情符号的时候string高度比不带的高2pt..怎么计算?

方式一

网上找来的一种取巧的计算方法

// 转换表情

if ([tempDic[@"content"] respondsToSelector:@selector(length)]) {

[self setValue:[ConvertToCommonEmoticonsHelper convertToSystemEmoticons:tempDic[@"content"]] forKey:@"content"];

self.attributedStringArray = [self expressionAttributedStringWithAttributedString:[[NSAttributedString alloc] initWithString:self.content]];

if (self.attributedStringArray.count) {

NSMutableString *string = [NSMutableString string];

NSMutableString *originalString = [NSMutableString string];

// 如果有

// NSLog(@"数组:%@", self.attributedStringArray);

int beginLength = 0;

int faceCount = 0;

//添加一张图片

for (int i = 0; i < self.attributedStringArray.count; i ++) {

id dic = self.attributedStringArray;

if ([dic isKindOfClass:[NSString class]]) {

// 是string

[string appendString:dic];

[originalString appendString:dic];

} else if ([dic isKindOfClass:[NSDictionary class]]){

// 是表情图片

[dic setValue:@([dic[@"location"] intValue] - beginLength) forKey:@"location"];

beginLength += [dic[@"length"] intValue];

faceCount++;

// 仅用于还原高度

[originalString appendString:@"换"];

}

}

// 修正计算误差

for (int i = 0; i < (int)(faceCount/2.5); i ++) {

[originalString appendString:@"?"];

}

self.content = string;

self.originalContent = originalString;

}

}

方式二 采用c底层方法

+ (CGFloat)heightForLableWithText:(NSAttributedString *)text lableWidth:(CGFloat)lableWidth {

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)text);

CGSize targetSize = CGSizeMake(lableWidth, CGFLOAT_MAX);

CGSize size = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, (CFIndex)[text length]), NULL, targetSize, NULL);

CFRelease(framesetter);

//取整

#if defined(__LP64__) && __LP64__

return ceil(size.height);

#else

//向上

return ceilf(size.height) ;

#endif

}

带linebreak属性->ios7

+ (CGFloat)heightForLableWithString:(NSString *)text lableWidth:(CGFloat)lableWidth font:(UIFont *)font

{

CGSize textSize = CGSizeMake(lableWidth , CGFLOAT_MAX);

if ([UIDevice currentDevice].systemVersion.floatValue >=7) {

NSMutableParagraphStyle *parStyle=[[NSMutableParagraphStyle alloc]init];

parStyle.lineBreakMode=NSLineBreakByWordWrapping;

NSDictionary *attributes=@{NSFontAttributeName:font,NSParagraphStyleAttributeName:parStyle };

return ceil([text boundingRectWithSize:textSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size.height)

;

}else{

return ceil([text sizeWithFont:font forWidth:lableWidth lineBreakMode:UILineBreakModeWordWrap].height);

}

}

相关文章

网友评论

      本文标题:String 各种计算高度

      本文链接:https://www.haomeiwen.com/subject/icqqlttx.html