将 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】:NSLayoutManager 从 ios 7 开始可用。文档为 here。
【讨论】:
以上是关于将 NSString 分成几行(以适应所需的宽度)的主要内容,如果未能解决你的问题,请参考以下文章