boundingRectWithSize:options:context:计算大小不考虑NSParagraphStyle.firstLineHeadIndent

时间:2014-09-27 03:07:03

标签: ios nsattributedstring nsparagraphstyle

例如:

import Foundation
import UIKit

var str = NSString(string: "saldkjaskldjhf")

var font = UIFont.systemFontOfSize(14.0)
var attributes:[String:AnyObject]   = [NSFontAttributeName: font]
var attriStrWithoutParagraph = NSAttributedString(string: str, attributes: attributes)

var size = attriStrWithoutParagraph.boundingRectWithSize(CGSize(width: CGFloat.max, height: CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)

var paragraphstyle = NSMutableParagraphStyle()
paragraphstyle.firstLineHeadIndent = CGFloat(20)
attributes[NSParagraphStyleAttributeName] = paragraphstyle
attriStrWithoutParagraph = NSAttributedString(string: str, attributes: attributes)
size = attriStrWithoutParagraph.boundingRectWithSize(CGSize(width: CGFloat.max, height: CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)

这是输出:

(0.0,0.0,87.276,16.702)
(0.0,0.0,87.276,16.702)

我们可以看到结果是一样的,所以第一线不被认为是为什么它的工作方式如此???

1 个答案:

答案 0 :(得分:3)

您要为您传递给CGFloat.max的尺寸指定非常大(实际上是无限的)值(-boundingRectWithSize:options:)。所以,文本永远不会包装。它将始终排成一行。

此外,-boundingRectWithSize:options:的文档说:

  

从此方法返回的矩形的原点是第一个字形原点。

因此,结果总是相对于放置第一个字形的位置。你基本上测量了线的大小。缩进不会改变行的大小。它会改变放置第一个字形的位置,但结果是相对于第一个字形,因此它不会改变结果。

如果您提供宽度的实际限制并使段落换行,则会更改结果。在这种情况下,第二行将是"缩进"相对于第一行(和第一个字形),因此当您更改firstLineHeadIndent时,边界矩形会发生变化。

您可以自己简单地应用所需的缩进。也就是说,在获得边界矩形后,将缩进距离添加到原点的X坐标(编辑:或宽度,如果您想要包含缩进的矩形而不仅仅是文本位置通过缩进)。 (虽然我不清楚在"无限空间中缩进文本是什么意思。)

您还可以为文本的所需目的地提供实际的边界大小。

相关问题