用户使用自定义笔尖或笔划图像绘制线条/路径?[Swift |目标C | iOS]

用户使用自定义笔尖或笔划图像绘制线条/路径?[Swift |目标C | iOS],ios,objective-c,swift,drawing,paint,Ios,Objective C,Swift,Drawing,Paint,用户画一条线和点/虚线是非常直接的。我可以通过以下方式做到这一点: context.addPath(path) context.setLineCap(.round) context.setLineWidth(action.strokeWidth) context.setLineDash(phase: 0, lengths: [6, 9]) context.setStrokeCo

用户画一条线和点/虚线是非常直接的。我可以通过以下方式做到这一点:

            context.addPath(path)
            context.setLineCap(.round)
            context.setLineWidth(action.strokeWidth)
            context.setLineDash(phase: 0, lengths: [6, 9])
            context.setStrokeColor(action.color.cgColor)
            context.setBlendMode(.normal)
我试图实现的是使用自定义画笔尖或图案绘制用户生成的线条/曲线。我试着做一些类似于colorWithPatternImage的事情,但这并不能解决我的问题,因为它只是用纹理图像填充视图的背景,而不是线条本身。比如:

            context.addPath(path)
            context.setLineCap(.round)
            context.setLineWidth(action.strokeWidth)
            context.setLineDash(phase: 0, lengths: [6, 9])
            context.setStrokeColor(action.color.cgColor)
            context.setBlendMode(.normal)
我想完成的笔刷笔划示例图像:


你对我如何做到这一点有什么建议吗?非常感谢你

我强烈推荐阅读,因为有几种解决方案。有些涉及着色器,有些则使用
cgpatterDrawPatternCallback
函数,其中存在堆栈溢出问题。在swift中如何实现这一点,我强烈建议阅读,因为有几种解决方案。一些涉及着色器,一些会使用
CGPatternDrawPatternCallback
函数,这里有一个stackoverflow如何在swift中实现这一点我在一个包含徒手绘制功能的项目中工作,我发现没有任何源代码或示例可以学习如何使用自定义笔刷,然后,在研究了很多关于核心图形的主题并花了几天时间进行测试之后,我找到了一个解决方案,可以创建自定义笔刷,如spray或任何您想要的图案

所有这些画笔都可以用画笔画。这个操作的逻辑是,不用做硬数学和计算像素,只需在这种类型的图层上绘制图案图像,然后将这个家伙传递给你,你就会看到你想要的。在给出示例代码让您更好地理解之前,让我与您共享此信息

苹果说:

不再推荐CGLayer(因为它不稳定)

这就是为什么在商业项目中使用它之前要三思而后行

仅供参考:此代码未经测试,因此如果有问题,请在您身边更正,因为我的目的只是分享我在该主题上的知识。

奖金:-

为了消除不同颜色的图案的不必要副本,请使用此UIImage扩展功能重新为图案上色

func maskWithColor(color: UIColor) -> UIImage? {
    let maskImage = cgImage!
    
    let width = size.width
    let height = size.height
    let bounds = CGRect(x: 0, y: 0, width: width, height: height)
    
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
    let context = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!
    
    context.clip(to: bounds, mask: maskImage)
    context.setFillColor(color.cgColor)
    context.fill(bounds)
    
    if let cgImage = context.makeImage() {
        let coloredImage = UIImage(cgImage: cgImage)
        return coloredImage
    } else {
        return nil
    }
}
正如您所看到的,使用CGLayer是多么容易。现在,您可以创建自定义画笔,只要传递一个UIImage[应该是png]


快乐编码…

我在做一个包含徒手画功能的项目,我发现没有任何源代码或示例可以学习如何制作自定义画笔,然后,在研究了很多关于核心图形的主题并花了几天时间进行测试之后,我找到了一个解决方案,可以创建自定义笔刷,如spray或任何您想要的图案

所有这些画笔都可以用画笔画。这个操作的逻辑是,不用做硬数学和计算像素,只需在这种类型的图层上绘制图案图像,然后将这个家伙传递给你,你就会看到你想要的。在给出示例代码让您更好地理解之前,让我与您共享此信息

苹果说:

不再推荐CGLayer(因为它不稳定)

这就是为什么在商业项目中使用它之前要三思而后行

仅供参考:此代码未经测试,因此如果有问题,请在您身边更正,因为我的目的只是分享我在该主题上的知识。

奖金:-

为了消除不同颜色的图案的不必要副本,请使用此UIImage扩展功能重新为图案上色

func maskWithColor(color: UIColor) -> UIImage? {
    let maskImage = cgImage!
    
    let width = size.width
    let height = size.height
    let bounds = CGRect(x: 0, y: 0, width: width, height: height)
    
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
    let context = CGContext(data: nil, width: Int(width), height: Int(height), bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue)!
    
    context.clip(to: bounds, mask: maskImage)
    context.setFillColor(color.cgColor)
    context.fill(bounds)
    
    if let cgImage = context.makeImage() {
        let coloredImage = UIImage(cgImage: cgImage)
        return coloredImage
    } else {
        return nil
    }
}
正如您所看到的,使用CGLayer是多么容易。现在,您可以创建自定义画笔,只要传递一个UIImage[应该是png]

快乐编码…