问题描述
我跟随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,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。按照他们给您的顺序翻译他们给您的 code ,就像这样:
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)
}