在drawrect方法中翻转CGContext会导致错误的posotion

时间:2017-01-30 07:22:14

标签: ios macos core-graphics

我试图在其中心垂直翻转一个圆圈。 (按中心翻转圆圈看起来相同,以便我可以直观地检查)。但所取得的立场是完全错误的。我希望填充必须完全发生在描边区域内 enter image description here

circleRect = CGRect(x:100, y:100, width:100, height: 100)

override func draw(_ dirtyRect: CGRect) {
    let ctx = NSGraphicsContext.current()!.cgContext
    if(drawCircle) {
        let path = getOvalPath(circleRect) //returns a oval cgpath for the rect, here the rect is a square so it gives a circle

        //stroked without flipping
        ctx.addPath(path)
        ctx.setStrokeColor(CGColor.black)
        ctx.strokePath()

        //filled with flipping
        ctx.saveGState
        ctx.translateBy(x: 0, y: circleRect.size.height)
        ctx.scaleBy(x: 1, y: -1)

        ctx.addPath(path)
        ctx.setFillColor(fillColor)
        ctx.fillPath()
        ctx.restoreGState()
}

drawCircle = true
setNeedsDisplay(circleRect)

1 个答案:

答案 0 :(得分:1)

你的圈子中心位于(100,100)。考虑转换对这一点的影响:

var point = CGPoint(x: 100, y: 100)
// point = (100, 100)

point = point.applying(CGAffineTransform(scaleX: 1, y: -1))
// point = (100, -100)

point = point.applying(CGAffineTransform(translationX: 0, y: 100))
// point = (100, 0)

所以你的变形会移动圆圈的中心。

你正在考虑“翻转”y轴,将它从一些“画布”的左下角移动到左上角。如果它在画布上垂直居中,那么它将保持不变。你的画布高度由你应用的y平移隐含定义,即100。所以你的画布高度为100,这意味着圆圈的中心需要在y = 100/2 = 50才能保持不变。

由于你的圆圈的中心位于y = 100,你需要使用2 * 100 = 200的画布高度来保持圆形。