在 MacOS 中使用 NSString.draw(in rect: withAttributes: ) 右对齐绘制 NSString?

问题描述

无法在 NSView ( MacOs ) 中绘制右对齐的字符串 这是我的代码,它崩溃了:

-[__SwiftValue lineBreakMode]:无法识别的选择器发送到实例 0x600003408750

let attrs = [NSAttributedString.Key.foregroundColor:NSColor.white,NSAttributedString.Key.paragraphStyle:NSTextAlignment.right
                    ] as [NSAttributedString.Key : Any]

            let absolutPoint = NSPoint(x: 0.0,y: 0.0)
            var convertedPt  = convertPoint(dataPoint:se,scaleX:scaleX,scaleY:scaleY)
            convertedPt.x    = absolutPoint.x
            
            let scalaLabel = Nsstring(format:"%3.0f",se.y)

            let place = NSMakeRect(convertedPt.x,convertedPt.y,80.0,12.0)
            scalaLabel.draw(in:place,withAttributes:attrs )

如果我没有在 attrs 中设置 paragraphStyle,文本将被正确绘制。但没有正当理由。 知道我的代码有什么问题吗?

解决方法

NSAttributedString.Key.paragraphStyle:NSTextAlignment.right

这是无效的,这就是它崩溃的原因。
该值应该是 NSParagraphStyle,而不是 documentation 中所述的 NSTextAlignment

该属性的值是一个 NSParagraphStyle 对象。用这个 属性将多个属性应用于一系列文本。如果你这样做 不指定此属性,字符串使用默认段落 属性,由 defaultNSParagraphStyle 方法返回。

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .right

let attrs = [NSAttributedString.Key.foregroundColor:NSColor.white,NSAttributedString.Key.paragraphStyle: paragraphStyle
            ] as [NSAttributedString.Key : Any]

旁注,如果您之前说明类型,则可能会缩短:

let attrs: NSAttributedString.Key: Any] = [foregroundColor: NSColor.white,paragraphStyle: paragraphStyle]