Swift - 错误:CGContextSetStrokePattern:使用非图案颜色空间指定的图案

时间:2016-02-03 17:58:00

标签: ios swift core-graphics

我试图沿着一条线创建一个图像模式。最后,我想把它变成一个绘图应用程序的铅笔纹理,但是现在我只是沿着一条简单的线测试模式。当我运行它时,我得到一个坚实的黑线,控制台打印出这条消息:

错误:CGContextSetStrokePattern:使用非图案颜色空间指定的图案。

func drawStroke(view: UIView, context: CGContext?) {

    let lineWidth: CGFloat = 5.0


    let callbacks:CGPatternCallbacks = CGPatternCallbacks(
        version: 0,
        drawPattern:  { (pointer, context) -> Void in
            //let PENCIL = UIColor(patternImage: UIImage(named: "Pencil_Texture.png")!)

            CGContextSetFillColorWithColor(context, patternImage.CGColor)

            CGContextAddArc(context, 3, 3, 4, 0, radians(360), 0)
            CGContextFillPath(context)

        },releaseInfo: nil)

    CGContextSaveGState(context)



    let space = CGColorSpaceCreateDeviceRGB()
    let patternSpace:CGColorSpaceRef = CGColorSpaceCreatePattern(space)!
    CGContextSetFillColorSpace(context, patternSpace)

    let pattern:CGPatternRef = CGPatternCreate(nil, view.frame, CGAffineTransformIdentity, 24, 24, .ConstantSpacing, true,[ callbacks ])!

    let alpha:CGFloat = 1.0


    //line
    CGContextSetLineWidth(context, lineWidth)
    CGContextSetLineCap(context, .Round)
    //points
    CGContextMoveToPoint(context, view.center.x, view.center.y)
    CGContextAddQuadCurveToPoint(context, view.center.x, view.center.y, view.center.x, view.center.y + 200)

    // Draw the stroke
    CGContextSetStrokePattern(context, pattern, [alpha])
    CGContextStrokePath(context)

    CGContextRestoreGState(context)
}

我查看了Apple的文档,但它没什么帮助。我在Objective-C中看过一些教程,但我认为某些Obj-C方法在Swift中不存在。

2 个答案:

答案 0 :(得分:0)

因为您使用Stencil(未着色)模式

您需要在代码中更改2个错误

1 / CGPatternCreate函数:设置 isColored 参数传递 False ,因为你使用的是未着色的

let pattern:CGPatternRef = CGPatternCreate(nil, view.frame, CGAffineTransformIdentity, 24, 24, .ConstantSpacing, false,[callbacks])!

2 /很重要的是,你绘制一个笔划路径,这样你就需要在Stroke中设置ColorSpace和StrokePattern。

let color1: [CGFloat] = [1.0, 0.0, 0.0, 1.0]
CGContextSetStrokeColorSpace(context, patternSpace)
CGContextSetStrokePattern(context, pattern, color1)

答案 1 :(得分:0)

Swift 3.1 在Swift 3中已经更改了api,所以这里是Swift 3.1的代码

此代码用于 uncoloured 模式(当您在CGPattern(...,isColored:false,...)中为参数'isColored'指定'false'时)

    let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB()
    if let patternSpace:CGColorSpace = CGColorSpace(patternBaseSpace: colorSpace) {
            ctx.setFillColorSpace(patternSpace)
         // ... rest of the code
    }

此代码适用于彩色模式(当您在CGPattern(...,isColored:false,...)中为参数'isColored'指定'true'时)

        if let patternSpace:CGColorSpace = CGColorSpace(patternBaseSpace: nil) {
                ctx.setFillColorSpace(patternSpace)
             // ... rest of the code
        }