OGeek|极客世界-中国程序员成长平台

标题: ios - 在不使用 TextView 的情况下获取属性字符串的估计高度 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 20:52
标题: ios - 在不使用 TextView 的情况下获取属性字符串的估计高度

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

我想准确估计 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/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) Powered by Discuz! X3.4