如何绘制围绕特定点旋转的 NSAttributedString?

Posted

技术标签:

【中文标题】如何绘制围绕特定点旋转的 NSAttributedString?【英文标题】:How do I draw an NSAttributedString rotated around a specific point? 【发布时间】:2018-05-30 12:13:37 【问题描述】:

我正在做一个项目,我必须在 UIView 中绘制文本字符串。问题不是绘制字符串,而是旋转它们。我希望将文本绘制在与红线相同的角度上方。查看下图:

插图示例:

这是代码...(PS。所有不相关的代码都被删除)

class DrawView: UIView 

    override func draw(_ rect: CGRect) 

        let context = UIGraphicsGetCurrentContext()!

        // Adding a line here.
        context.move(to: CGPoint(x: 290, y: 650))
        context.addLine(to: CGPoint(x: 530, y: 530))
        context.strokePath()

        // Flipping the coordinate system
        context.textMatrix = .identity
        context.translateBy(x: 0, y: bounds.size.height)
        context.scaleBy(x: 1.0, y: -1.0)

        // Creating the text path.
        let path = CGMutablePath()
        // "x" and "y" equals the staring point of the line. "width" equals the length of the line.
        path.addRect(CGRect(x: 290, y: 650, width: 268, height: 30))

        // I have tried rotating with the method below, but it rotates with the anchor point at (0, 0) in the UIView.
        //context.rotate(by: 0.4636) //   0.4636 equals the angle of the red line in radians.

        // Setting the text justification to center.
        let justification = NSMutableParagraphStyle()
        justification.alignment = NSTextAlignment.center

        // Creating the attribute.
        let attribute = [NSAttributedStringKey.font:  UIFont(name: "Arial", size: 22.0)!,
                         NSAttributedStringKey.foregroundColor: UIColor.black,
                         NSAttributedStringKey.paragraphStyle: justification] as [NSAttributedStringKey : Any]?

        // Creating the string and setting up the frame.
        let attrString = NSAttributedString(string: "12032.00", attributes: attribute)
        let framesetter = CTFramesetterCreateWithAttributedString(attrString as CFAttributedString)
        let frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attrString.length), path, nil)

        CTFrameDraw(frame, context)
    

【问题讨论】:

你试过CGAffineTransform(rotationAngle: -CGFloat.pi / 2)吗? 您问题的标题措辞不当。字符串和属性字符串没有轮换。它们是文本的表示。最好问“” 感谢@DuncanC 的建设性反馈,你是对的。 嗨@ArnabHore。感谢您的答复。我已经尝试过了,但它会围绕每个角色各自的锚点旋转。我想将字符串作为一个整体旋转。 另见***.com/questions/32771864/… 【参考方案1】:

感谢大家,我终于弄明白了,非常感谢@Grimxn。我就是这样解决的:

// Set attributes.
let attribute = [NSAttributedStringKey.font:  UIFont(name: "Courier", size: 22.0)!] as [NSAttributedStringKey : Any]?
// Save current context.
context.saveGState()
// Move orgin.
context.translateBy(x: 290, y: 650)
// Rotate the coordinate system.
context.rotate(by: -0.4636)
// Create a string.
let str = "12300.10"
// Draw string.
str.draw(at: CGPoint(x: 0, y: 0), withAttributes: attribute)
// Restore to saved context.
context.restoreGState()

【讨论】:

【参考方案2】:

旋转总是在当前的 0,0 点完成。如果您想围绕不同的中心旋转,则必须移动矩阵以将所需的旋转点放在原点上,然后旋转并返回。

【讨论】:

感谢您的回复!关于如何完成这项工作的任何想法? 我告诉过你该怎么做。画出你在做什么,以及你想要的文本旋转点。您需要使用您已经在使用的电话context.translateBy()。我不知道你想要的输出,所以我不能告诉你怎么做。 再次感谢邓肯。我明天试着解决这个问题。最好的问候 w1k 操纵变换矩阵真的令人困惑。请记住,将变换应用于矩阵的顺序很重要。我建议你阅读这个主题。有时我必须绘制出将变换应用于矩阵的每个步骤,以找出应用它们的正确顺序,这对我来说绝非易事。

以上是关于如何绘制围绕特定点旋转的 NSAttributedString?的主要内容,如果未能解决你的问题,请参考以下文章

围绕特定轴旋转 gluCylinder()?

在OpenGL中围绕特定点旋转对象

如何围绕组内的一个点旋转 Three.js 组?

颤动 - 如何使用画布围绕中心旋转图像

OpenCV Python围绕特定点旋转图像X度

如何绘制围绕中心坐标相对于设备旋转的真实世界坐标?