我试图为iOS/iPadOS框架创建一个简单的text()函数,该框架只在一个坐标下在屏幕上显示文本。它授予全局textAlignment状态,可以设置为.center、.left或.right。
我直接绘制图形上下文。
这里的问题是:函数可以工作,但是没有一个NSMutableParagraphStyle属性被授予。
func text(_ string: String, _ x: CGFloat, _ y: CGFloat) {
let attributedString = NSAttributedString(string: string,
attributes: attributes)
attributedString.draw(at: CGPoint(x: x, y: y))
}attributes和paragraphStyle是全局变量:
var paragraphStyle: NSMutableParagraphStyle?
var attributes: [NSAttributedString.Key: Any] = [:]它们由一个函数设置,该函数在任何时候更改设置时都会被调用:
func setTextAttributes() {
paragraphStyle = NSMutableParagraphStyle()
switch settings.textAlign {
case .left:
paragraphStyle?.alignment = .left
case .right:
paragraphStyle?.alignment = .right
case .center:
paragraphStyle?.alignment = .center
}
paragraphStyle?.lineSpacing = CGFloat(settings.textLeading)
attributes = [
.font: UIFont(name: settings.textFont, size: CGFloat(settings.textSize))!,
.foregroundColor: settings.fill,
.strokeWidth: -settings.strokeWeight,
.strokeColor: settings.stroke,
.paragraphStyle: paragraphStyle!
]
}所有的文本设置都存储在一个设置结构中(在这里我将省略此设置),并且我在多个断点处检查了paragraphStyle和attributes的状态,直到绘制文本为止。似乎当它进入NSString绘图方法时,它就被忽略了。
下面是在API中编写的一些示例代码:
line(200, 0, 200, height)
line(0, 120, width, 120)
textAlign(.right)
text("ABCD", 200, 120)
line(0, 200, width, 200)
textAlign(.center)
text("EFGH", 200, 200)
textAlign(.left)
line(0, 280, width, 280)
text("IJKL", 200, 280)我的输出与左对齐的所有东西看起来都是这样的(增加行以表明所有的左对齐):

下面大致是我期望输出的样子(忽略字体更改):

发布于 2021-09-17 05:22:40
您可以使用draw(in:),它允许您指定将在其中进行绘图的CGRect。
在每一种对齐方式中,您都希望在与传递到方法的点不同的x偏移点处绘制字符串。
func text(_ string: String, _ x: CGFloat, _ y: CGFloat) {
let attributedString = NSAttributedString(string: string,
attributes: attributes)
let size = attributedString.size()
let xOffset: CGFloat
switch attributes[.paragraphStyle]?.alignment ?? .left {
case .center:
xOffset = size.width / 2
case .left:
xOffset = 0
case .right:
xOffset = size.width
default:
fatalError("not supported!")
}
let rect = CGRect(origin: CGPoint(x: x - xOffset, y: y). size: size)
attributedString.draw(in: rect)
}https://stackoverflow.com/questions/69216656
复制相似问题