如何修改NSString字体大小并加载到TextView?HTML文本字体不生效问题
解决UITextView加载HTML文本后字体大小不生效的问题
嘿,这个问题我之前也碰到过!核心原因是服务器返回的HTML内容里大概率自带了字体样式定义(比如<font>标签或者style属性里的font-size),这些内嵌样式会直接覆盖你在UITextView上设置的font属性。再加上你是先计算高度再处理文本,顺序不对的话也会导致样式不生效。下面给你具体的解决方案:
1. 把HTML转成富文本时统一应用自定义字体
不要直接把HTML转成普通字符串塞给TextView,而是转成NSAttributedString后,手动覆盖全局字体样式:
// 假设itemDescribtionStr是服务器返回的HTML字符串 NSString *itemDescribtionStr = @"你的服务器HTML文本"; NSData *htmlData = [itemDescribtionStr dataUsingEncoding:NSUTF8StringEncoding]; // 配置HTML转富文本的选项 NSDictionary *htmlOptions = @{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding) }; NSError *error = nil; NSAttributedString *originalAttributedText = [[NSAttributedString alloc] initWithData:htmlData options:htmlOptions documentAttributes:nil error:&error]; // 转成可变富文本,统一设置你想要的字体大小 NSMutableAttributedString *styledAttributedText = [[NSMutableAttributedString alloc] initWithAttributedString:originalAttributedText]; [styledAttributedText addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:16.0] // 替换成你需要的字体大小 range:NSMakeRange(0, styledAttributedText.length)]; // 给TextView设置处理后的富文本 // 注意:不要直接设置text属性,要设置attributedText itemDescribtionView.attributedText = styledAttributedText;
2. 基于处理后的富文本计算TextView高度
之前你可能是用原始HTML字符串计算高度,这会导致高度和最终显示的样式不匹配。必须用处理好的NSAttributedString来计算:
// 先确定TextView的最大宽度(比如你的scrollView宽度减去边距) CGFloat maxWidth = mainPageScrollView.frame.size.width - 20; // 假设左右各10px边距 CGSize maxSize = CGSizeMake(maxWidth, CGFLOAT_MAX); // 计算富文本的实际高度 CGSize textSize = [styledAttributedText boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size; // 设置TextView的frame(记得向上取整避免内容被截断) CGRect descFrame = itemDescribtionView.frame; descFrame.size.width = maxWidth; descFrame.size.height = ceil(textSize.height); itemDescribtionView.frame = descFrame;
3. 额外注意事项
- 如果HTML里有其他你想保留的样式(比如颜色、加粗),只需要保留
NSFontAttributeName这一个属性即可,不要添加其他属性覆盖; - 不要在设置
attributedText后再设置TextView的font属性,会被富文本里的样式覆盖; - 如果HTML里有图片或复杂布局,可能需要调整计算高度的逻辑,或者考虑用
UITextView的sizeThatFits:方法辅助计算。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

