• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在不使用 TextView 的情况下获取属性字符串的估计高度

[复制链接]
菜鸟教程小白 发表于 2022-12-12 20:52:00 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

这个问题偶尔会出现,但我还没有找到可靠的解决方案。

我想准确估计 NSAttributedString 的高度,而不必将文本放入不可见的 TextView 中以获得真实高度。 ( TextView 方法需要更多的处理时间)。但我无法通过使用 boundingRectWithSize 获得始终如一的可靠值。对于我的目的而言,它已经足够接近 10 的 9 倍,但这还不够好,因为它偶尔会导致 View 被截断,其中一行文本不可见。

我的示例代码如下。输出是:

2016-06-27 08:54:17.106 TextHeightTest[14045:7574151] estimated1  225.000000
2016-06-27 08:54:17.108 TextHeightTest[14045:7574151] estimated2  209.000000

第一个值是正确的。

在.h文件中:

@interface ViewController : UIViewController {
    NSMutableDictionary *attributes;
    UIFont *font;
    UITextView *sizingTextView;
    CGFloat width;
}

.m 文件中:

- (void)viewDidLoad {
    [super viewDidLoad];

    sizingTextView = [[UITextView alloc] init];
    font = [UIFont fontWithName"Helvetica" size:20];
    width = 300;

    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.alignment = NSTextAlignmentLeft;
    paragraphStyle.lineSpacing = 7;
    paragraphStyle.maximumLineHeight = 20;
    paragraphStyle.minimumLineHeight = 20;

    attributes = [[NSMutableDictionary alloc] init];
    [attributes setObject:paragraphStyle forKey:NSParagraphStyleAttributeName];
    [attributes setObject:font forKey:NSFontAttributeName];

    NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.";
    NSAttributedString *attribStr = [[NSAttributedString alloc] initWithString:text attributes:attributes];

    CGFloat estimated1 = [self estimateInTextView:attribStr];
    NSLog(@"estimated1  %f", estimated1);

    CGFloat estimated2 = [self estimateInSpace:text];
    NSLog(@"estimated2  %f", estimated2);
}

- (CGFloat)estimateInTextViewNSAttributedString *)text {
    sizingTextView.attributedText = text;
    return [sizingTextView sizeThatFits:CGSizeMake(width, CGFLOAT_MAX)].height;
}

- (CGFloat)estimateInSpaceNSString *)text {
    CGRect rect = [text boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil];
    return CGRectGetHeight(rect);

}

感谢您的帮助。谢谢。



Best Answer-推荐答案


TextView 将文本放入文本容器中。默认情况下,文本容器在顶部和底部插入 8 个点。请参阅 textContainerInset 的文档.因此, TextView 将比文本本身所需的空间高 16 磅。

由于文本容器的 lineFragmentPadding(默认为左右 5 点),也可能存在基于宽度的换行差异。不过,我不确定。

对于测试,您实际上可以在给定大小的矩形中绘制字符串,并将其与在相同大小的 TextView 中呈现的字符串进行比较。查看线条是否在不同的点断开。在两者周围画一个框架,看看文本在哪里插入不同。

关于ios - 在不使用 TextView 的情况下获取属性字符串的估计高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38056060/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap