将 NSString 分成几行(以适应所需的宽度)

Posted

技术标签:

【中文标题】将 NSString 分成几行(以适应所需的宽度)【英文标题】:Breaking NSString into lines (to fit desired width) 【发布时间】:2009-12-27 22:36:25 【问题描述】:

我正在尝试将 NSString 分成几行以适合所需的宽度(因为它会在 sizeWithFont:constrainedToSize: 内部发生)。有没有比猜测sizeWithFont 中的中断发生位置更好的方法?

【问题讨论】:

您能否详细说明为什么需要分隔线?如果您只想在给定的空间中绘制字符串,那么这很简单。 我正在为标签创建一个背景 - 就像您在选择文本时得到的那样。每条线的宽度都不同(长度不同),所以我需要单独使用它们。 【参考方案1】:

如果NSLayoutManager 确实不可用,您可能会遇到一个效率较低的解决方案:从字符串的第一个单词开始,附加每个后续单词并在结果字符串上使用sizeWithFont:(etc.) 方法。当返回的CGSize 的高度发生变化时,最近添加的单词是导致换行的单词,因此您可以在那里拆分字符串。

【讨论】:

【参考方案2】:

更新:这显然只适用于 Mac 平台。尽管 NSLayoutManager 在 iPhone 的字符串绘制指南(截至 2009 年 12 月)中被特别引用,但它和 NSAttributedString 在 iPhone 平台上均不可用。抱歉打扰了。

原始回复

NSLayoutManager 是您的朋友,如果您希望将字符串本身分成一定宽度的行,并具有一组给定的属性(即,您需要知道字符串被包裹的实际位置)。

如果您只是想在绘图时换行并且不在乎在哪里,NSAttributedString 的(AppKit Additions)方法-drawInRect: 或-drawWithRect:options: 就可以了。

【讨论】:

NSLayoutManager 和 NSAttributedString 在 iPhone 上都不可用。 我不打算(立即)画线,所以 NSAttributedString 和 NSString + UIKit 添加都没有帮助。 奥莱:令人困惑。 NSLayoutManager 在 iPhone Dev Center 的库中的 String Programming Guide 中有专门引用:developer.apple.com/iphone/library/documentation/Cocoa/…【参考方案3】:

更新:根据下面的评论(您可以绘制字符串,但不能绘制背景来覆盖字符串),我认为您最好的选择是使用 UIWebView 并使用CSS 来绘制你的背景。


NSString UIKit Additions 可能适合您的需求,尤其是

- (CGSize)drawInRect:(CGRect)rect withFont:(UIFont *)font 
       lineBreakMode:(UILineBreakMode)lineBreakMode;

和/或

- (CGSize)drawInRect:(CGRect)rect withFont:(UIFont *)font 
       lineBreakMode:(UILineBreakMode)lineBreakMode
           alignment:(UITextAlignment)alignment;

【讨论】:

查看问题上的 cmets 和下面 Joshua 的回答——画线不是问题。他实际上确实需要知道换行符在哪里,以便绘制仅延伸到每行末尾的背景。【参考方案4】:

NSLayoutManagerios 7 开始可用。文档为 here。

【讨论】:

以上是关于将 NSString 分成几行(以适应所需的宽度)的主要内容,如果未能解决你的问题,请参考以下文章

拉伸图像以适应

UILabel自适应

Swift 3 - 调整字体大小以适应宽度,多行

Python:多对多比较以找到所需的数据集

如何计算矩形所需的比例以适合屏幕

在 Android 中裁剪以适应图像