根据 Apple 文档计算文本高度
Calculating Text Height as per Apple Documentation
我按照 this 尝试确定在将文本放入 CATextLayer 之前我需要的容器高度。但是,我没有得到预期的结果。返回的 NSRect 是 (0.0, 0.0, 0.0, 0.0)。我做错了什么?
func heightForStringDrawing(myString: NSString, myFont: NSFont, myWidth: CGFloat) -> NSRect {
let textStorage:NSTextStorage = NSTextStorage.init(string: myString as String)
let textContainer:NSTextContainer = NSTextContainer.init(containerSize: NSMakeSize(myWidth, CGFloat.infinity))
let layoutManager:NSLayoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
layoutManager.glyphRange(for: textContainer)
textStorage.addLayoutManager(layoutManager)
textStorage.addAttributes([NSAttributedString.Key.font : myFont], range: NSMakeRange(0, textStorage.length))
textContainer.lineFragmentPadding = 0.0
return layoutManager.usedRect(for: textContainer)
}
我这样称呼它:
print(myLayers.heightForStringDrawing(myString: "Some really, really, really, very long text.", myFont: NSFont.systemFont(ofSize: 14), myWidth: 66))
这导致返回的 NSRect 为 (0.0, 0.0, 0.0, 0.0),但我期望 (0.0, 0.0, 66.0,(大于 0.0 或 14.0 的数字))。它甚至不返回宽度。
如果我发送一个空的 myString = ""
,我会得到一个返回的 NSRect (0.0, 0.0, 0.0, 14.0)。但仍然没有宽度,如调用中提供的那样。
看来您只是没有将他们给您的代码正确翻译成 Swift。翻译他们给你的代码按照他们给你的顺序,像这样:
func heightForStringDrawing(myString:String, myFont:NSFont, myWidth: GFloat) -> NSRect {
let textStorage = NSTextStorage(string: myString)
let textContainer = NSTextContainer(containerSize: NSMakeSize(myWidth, .greatestFiniteMagnitude))
let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
textStorage.addAttributes([.font : myFont], range: NSMakeRange(0, textStorage.length))
textContainer.lineFragmentPadding = 0.0
layoutManager.glyphRange(for: textContainer) // <- here
return layoutManager.usedRect(for: textContainer)
}
我按照 this 尝试确定在将文本放入 CATextLayer 之前我需要的容器高度。但是,我没有得到预期的结果。返回的 NSRect 是 (0.0, 0.0, 0.0, 0.0)。我做错了什么?
func heightForStringDrawing(myString: NSString, myFont: NSFont, myWidth: CGFloat) -> NSRect {
let textStorage:NSTextStorage = NSTextStorage.init(string: myString as String)
let textContainer:NSTextContainer = NSTextContainer.init(containerSize: NSMakeSize(myWidth, CGFloat.infinity))
let layoutManager:NSLayoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
layoutManager.glyphRange(for: textContainer)
textStorage.addLayoutManager(layoutManager)
textStorage.addAttributes([NSAttributedString.Key.font : myFont], range: NSMakeRange(0, textStorage.length))
textContainer.lineFragmentPadding = 0.0
return layoutManager.usedRect(for: textContainer)
}
我这样称呼它:
print(myLayers.heightForStringDrawing(myString: "Some really, really, really, very long text.", myFont: NSFont.systemFont(ofSize: 14), myWidth: 66))
这导致返回的 NSRect 为 (0.0, 0.0, 0.0, 0.0),但我期望 (0.0, 0.0, 66.0,(大于 0.0 或 14.0 的数字))。它甚至不返回宽度。
如果我发送一个空的 myString = ""
,我会得到一个返回的 NSRect (0.0, 0.0, 0.0, 14.0)。但仍然没有宽度,如调用中提供的那样。
看来您只是没有将他们给您的代码正确翻译成 Swift。翻译他们给你的代码按照他们给你的顺序,像这样:
func heightForStringDrawing(myString:String, myFont:NSFont, myWidth: GFloat) -> NSRect {
let textStorage = NSTextStorage(string: myString)
let textContainer = NSTextContainer(containerSize: NSMakeSize(myWidth, .greatestFiniteMagnitude))
let layoutManager = NSLayoutManager()
layoutManager.addTextContainer(textContainer)
textStorage.addLayoutManager(layoutManager)
textStorage.addAttributes([.font : myFont], range: NSMakeRange(0, textStorage.length))
textContainer.lineFragmentPadding = 0.0
layoutManager.glyphRange(for: textContainer) // <- here
return layoutManager.usedRect(for: textContainer)
}