带有变换的 CGPathCreateWithEllipseInRect

CGPathCreateWithEllipseInRect with a transform

在 Swift 中尝试使用 CGPathCreateWithEllipseInRect 函数,我遇到了这个问题:

这段代码如我所料地工作,我得到了一个路径并可以使用它:

CGPathCreateWithEllipseInRect(CGRect(x: xCoord, y: yCoord,
                width: theWidth, height: theHeight), nil)

但是这个不行:

var affineTransform = CGAffineTransformMakeRotation(1.0)

CGPathCreateWithEllipseInRect(CGRect(x: xCoord, y: yCoord,
                width: theWidth, height: theHeight), &affineTransform)

好像我根本找不到路径(或一条空路径)。我做错了什么?

你的第二个密码

var affineTransform = CGAffineTransformMakeRotation(1.0)

let path = CGPathCreateWithEllipseInRect(CGRect(x: xCoord, y: yCoord,
                width: theWidth, height: theHeight), &affineTransform)

是正确的并且确实有效。但是请注意,您创建了一个旋转 围绕视图原点的角度为 1.0 * 180/π ≈ 57 度 (默认情况下是 top-left 角)。 这可能会将椭圆移出视图的可见边界。

相当于传递一个 nil 变换将是一个旋转 关于零角度

var affineTransform = CGAffineTransformMakeRotation(0.0)

如果您打算旋转大约 1 度,则使用

var affineTransform = CGAffineTransformMakeRotation(CGFloat(1.0 * M_PI/180.0))

如果您打算围绕其中心旋转椭圆, 那么你必须将旋转与翻译结合起来 使椭圆的中心成为坐标系的原点:

var affineTransform = CGAffineTransformMakeTranslation(xCoord + theWidth/2.0, yCoord + theHeight/2.0)
affineTransform = CGAffineTransformRotate(affineTransform, angle)
let path = CGPathCreateWithEllipseInRect(CGRect(x: -theWidth/2.0, y: -theHeight/2.0,
    width: theWidth, height: theHeight), &affineTransform)