iOS关于UITextView计算⽂本⾼度不准确的坑
问题: 字段由后端控制,⾥⾯出现换⾏的时候 \r\n是成对出现的 , 转义字符并未纳⼊字符串的计算范围 。。。 所以导致显⽰不全的bug
解决⽅案⼀:
由于这个⽅法计算字符串的⼤⼩的通过取得字符串的size来计算, 如果你计算的字符串中包含\r\n 这样的字符,也只会把它当成字符来计算。但是在显⽰的时候就是\n是转义字符,那么显⽰的计算的⾼度就不⼀样了,所以可以采⽤:计算的⾼度 = boundingRectWithSize计算出来的⾼度 + \r\n转义字符出现的个数 * 单⾏⽂本的⾼度。
///MARK:- 查询字串出现的次数⽅法⼆
- (NSInteger)searchSubStringCountWithSubString:(NSString *)subStr
{
NSUInteger count = 0, length = [subStr length];
NSRange range = NSMakeRange(0, length);
while(range.location != NSNotFound){
range = [self rangeOfString: subStr options:0 range:range];
if(range.location != NSNotFound){
range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
衣服码号count++;
}
}
return count;
}
解决⽅案⼆:
索尼a6300采⽤UILabel来展⽰⽂本就没有这个坑,主要看⾃⼰选择,毕竟有些特性只有UITextView才有的
@implementation NSString (Extension)
///MARK:- 查询字串出现的次数⽅法⼀
- (NSInteger)countOccurencesOfString:(NSString*)searchString {
NSInteger strCount = [self length] - [[self stringByReplacingOccurrencesOfString:searchString withString:@""] length];
return strCount / [searchString length];
}
///MARK:- 查询字串出现的次数⽅法⼆
- (NSInteger)searchSubStringCountWithSubString:(NSString *)subStr
{
NSUInteger count = 0, length = [subStr length];
NSRange range = NSMakeRange(0, length);
while(range.location != NSNotFound){
range = [self rangeOfString: subStr options:0 range:range];
if(range.location != NSNotFound){
range = NSMakeRange(range.location + range.length, length - (range.location + range.length));
count++;
}
}
return count;
}
//计算单⾏⽂本宽度和⾼度,返回值与`UIFont.lineHeight`⼀致 [⼿动滑稽]⽅块字
- (CGSize)singleLineSizeWithText:(UIFont *)font{
return [self sizeWithAttributes:@{NSFontAttributeName:font}];
}
护士资格证分数线2013@end
项⽬中展⽰控件使⽤的是UITextView ⽂本中包含\r\n来换⾏ 同⼀个PHP后端这种既定的规则应该不会经常变。
所以:
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
[paragraphStyle setLineBreakMode:NSLineBreakByCharWrapping];
paragraphStyle.lineSpacing = 5;// 字体的⾏间距
paragraphStyle.alignment = NSTextAlignmentLeft;
NSDictionary *attributes = @{
NSForegroundColorAttributeName : [UIColor whiteColor],
NSParagraphStyleAttributeName : paragraphStyle,
NSFontAttributeName : KFontSize(13)
};
//出现`\r` `\n` 关于计算⾼度不准确的问题 www.jianshu/p/c615a76dace2
CGFloat textX = 35;
你一直在路上CGFloat textW = KWIDTH - textX*2;
NSString *realText = shareModel.tips ;
NSInteger warpRowCount = [realText searchSubStringCountOccurencesOfString:@"\r\n"];万圣节2022年是几月几日
CGFloat singleLineHeight = [@"哈哈哈哈哈哈哈哈哈" singleLineSizeWithText:KFontSize(13)].height + 5;
CGFloat addHeight = warpRowCount *singleLineHeight;
CGFloat textH = [realText boundingRectWithSize:CGSizeMake(textW, MAXFLOAT) options:
NSStringDrawingUsesLineFragmentOrigin |
NSStringDrawingUsesFontLeading
attributes: attributes context:nil].size.height + 0.5 + addHeight;
NSMutableAttributedString * attributeStr = [[NSMutableAttributedString alloc] initWithString: realText attributes:attributes]; View.attributedText = attributeStr;
经过这么⼀番折腾之后,⽂本正常显⽰了
终极解决⽅案
污污的段子让女生起反应的文字2020年6⽉24⽇ 其实根本不⽤这么⿇烦,系统⾃适应⽅法即可计算准确,评论区已给出答案
参考博客:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论