我试图沿着一条线创建一个图像模式。最后,我想把它变成一个绘图应用程序的铅笔纹理,但是现在我只是沿着一条简单的线测试模式。当我运行它时,我得到一个坚实的黑线,控制台打印出这条消息:
错误: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中不存在。
答案 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
}