【问题标题】:NSString sizeWithFont: for multiple lines?NSString sizeWithFont:多行?
【发布时间】:2011-06-22 00:03:37
【问题描述】:

是否有等效于 NSString 的 sizeWithFont: 方法,可用于计算给定宽度的 UITectView 中文本的高度?据我所知,NSString 中的所有方法都只在一行上运行。

【问题讨论】:

    标签: iphone objective-c text height


    【解决方案1】:

    对于这些 NSString 方法,从 Apple's reference 开始,您可以将 -sizeWithFont:constrainedToSize:-sizeWithFont:constrainedToSize:lineBreakMode: 用于“计算多行文本的指标”。

    CGSize size = [theString sizeWithFont:font
                        constrainedToSize:CGSizeMake(width, 100000)];
    return size.height;
    

    【讨论】:

    • 这正是我用来确定多行高度的方法。基本上,您只需将可能的高度设置为某个非常大的值,然后取回适合多行文本的实际大小。
    • 这似乎返回的值太小了 1-2 行。知道为什么吗?
    • @Jumhyn:尝试使用-drawInRect: 方法将字符串拉出以检查它是否在正确的位置回绕。
    • -drawInRect:绘制的文本与sizeWithFont: 的结果不匹配。
    • @Jumhyn 你有没有发现为什么高度很小?我遇到了同样的问题。
    【解决方案2】:

    对于UITextView,您所要做的就是在视图上调用-sizeToFit,它会自动调整其高度,直到它可以容纳所有可用的文本。您需要做的就是设置文本视图的宽度,设置文本,然后调用-sizeToFit。文本视图将调整其高度以适合所有文本。

    更新:

    显然,文本视图仅在高度过高时才会缩小,但如果高度不足以显示所有文本,它们就不会增长。此外,一旦调用-sizeToFit,文本视图的y 坐标将重置回0.0f。所以这就是你要做的:

    CGFloat textViewWidth = 300.0f;
    CGFloat textViewPadding = 10.0f;
    
    UITextView * textView = [[[UITextView alloc] init] autorelease];
    textView.text = ...;    // Really long string
    textView.frame = CGRectMake(0.0f, 0.0f, textViewWidth, CGFLOAT_MAX);
    
    [textView sizeToFit];   // Shrinks the height to fit all the text
    
    textView.frame = CGRectMake(textViewPadding, textViewPadding, 
        textViewWidth, textView.frame.size.height);
    
    [self.view addSubview:textView];
    

    首先,您设置框架,以便您可以根据需要设置宽度。您使用CGFLOAT_MAX 几乎表示无限高度。接下来,调用-sizeToFit 会缩小高度,直到它刚好适合所有文本。但是,它也会重置y 坐标,因此我们继续设置框架以配置xy 坐标——在本例中,10.0f 用于xy——,不考虑宽度并将高度设置为 -sizeToFit 计算的任何值。

    【讨论】:

    • 似乎没有任何改变。
    • 我澄清了UITextView 是如何真正起作用的。执行类似于我添加的示例代码的操作应该会产生一个足够高以容纳所有文本的文本视图。
    • CGFLOAT_MAX 当 UITextView 退出第一响应者并且 UITableView 滚动回顶部时,在 iPhone 5.1 上造成了一些时髦的拖尾/撕裂。像 1024.0f(iPad 的长边)这样的较小数字为我修复了它。
    【解决方案3】:

    实际上,您可以使用属性 contentSize。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多