我是否需要调用CGContextSaveGState和CGContextRestoreGState?

时间:2015-04-25 15:24:13

标签: ios quartz-graphics

即使在创建新的imageContext时,也要仔细检查是否需要调用CGContextSaveGState和CGContextRestoreGState。

根据我在“石英编程指南”中所读到的内容,我不需要在下面的示例中,因为我正在创建一个全新的图像上下文。

我搜索了github的UIGraphicsBeginImageContextWithOptions,有些人保存并恢复上下文,而其他人则没有。

// Uses a circularMask on an image
class func circularImage(image: UIImage, diameter: Int) -> UIImage {
    assert(diameter > 0, "Diameter > 0 Failed \(__FUNCTION__)")

    let frame = CGRect(x: 0.0, y: 0.0, width: Double(diameter), height: Double(diameter))
    var newImage: UIImage?

    UIGraphicsBeginImageContextWithOptions(frame.size, false, UIScreen.mainScreen().scale)

    var context: CGContextRef = UIGraphicsGetCurrentContext()
    CGContextSaveGState(context)

    let imagePath: UIBezierPath = UIBezierPath(ovalInRect: frame)
    imagePath.addClip()

    image.drawInRect(frame)

    newImage = UIGraphicsGetImageFromCurrentImageContext()

    CGContextRestoreGState(context);

    UIGraphicsEndImageContext()

    return newImage!
}

1 个答案:

答案 0 :(得分:1)

不,你是对的,你不需要为你在那里做的事情保存上下文状态(你可以安全地评论你所拥有的)。但如果你想撤消'你做的剪辑(例如)然后它是一种方法。小心始终将这些(保存/恢复)gstate保存在匹配的对中,它是一个堆栈,所以你必须跟踪你放在那里的任何东西。