马亮 是一个基于 Metal 的绘画框架。它支持使用自定义纹理进行绘制和手写。马亮这个名字来源于中国古老神话故事中一个拥有神奇画笔的男孩。
功能
- 贝塞尔曲线线段
- 纹理 旋转
- 发光 线段
- 图表元素(用于图片和从UIView快照中获取的任何其他内容)
- 基于力的笔画大小调整
- 支持 铅笔
- 支持 3D Touch
- 撤销 & 重做
- 缩放 & 区分
- 导出到图片
- 将矢量内容保存到磁盘
- 支持macOS Catalyst
要求
iOS 9.0, Swift 5
核心绘画模块基于Metal
你可以通过仅更改几行代码,使其与较低的iOS和Swift版本兼容。
安装
CocoaPods
MaLiang 可通过 CocoaPods 获取。要安装它,只需在您的 Podfile
中添加以下行
pod 'MaLiang'
为了使用旧的 OpenGL ES 版本
pod 'MaLiang', '~> 1.1'
Carthage
使用 Carthage 将 MaLiang 集成到您的 Xcode 项目中,在您的 Cartfile
中指定它
github "Harley-xk/MaLiang"
运行 carthage update
来构建框架,并将构建的 MaLiang.framework
拖到您的 Xcode 项目中。
请确保将 MaLiang.framework
添加到目标的 嵌入的二进制文件
使用方法
MaLiang 使用简单。
- import MaLiang
- 享受绘画吧!
画布
open class Canvas: MetalView
Canvas
是 MaLiang
的基本组件。您将在此画布上绘制所有内容。 Canvas
从 MetalView
扩展而来,而 MetalView
又从 MTKView
扩展而来。 MetalView
处理与 MetalKit 相关的所有逻辑,并隐藏它们。
Canvas
可以用 xib 或代码轻松创建。
- 使用 xib 或 storyboard,只需将一个
UIView
对象拖放到您的视图控制器中,并将其类更改为Canvas
,模块更改为MaLiang
- 使用代码,只需像之前创建任何
UIView
那样使用init(frame:)
。
现在,所有必要的步骤都已完成!
快照
现在您可以在画布上截图。只需在Canvas
上调用snapshot
函数,您将获得一个可选的UIImage
对象。
笔刷
所有工作完成后,您可以使用笔刷
做更多事情!
笔刷
是MaLiang
的核心特性,它可以存储纹理和颜色,使得您可以创作出令人惊叹的作品。
将具有图像数据或文件的笔刷
注册到画布上并使用它进行绘画
let path = Bundle.main.path(forResource: "pencil", ofType: "png")!
let pencil = try? canvas.registerBrush(with: URL(fileURLWithPath: path))
pencil?.use()
笔刷
拥有多个属性供您自定义
// opacity of texture, affects the darkness of stroke
// set opacity to 1 may cause heavy aliasing
open var opacity: CGFloat = 0.3
// width of stroke line in points
open var pointSize: CGFloat = 4
// this property defines the minimum distance (measureed in points) of nearest two textures
// defaults to 1, this means erery texture calculated will be rendered, dictance calculation will be skiped
open var pointStep: CGFloat = 1
// sensitive of pointsize changed from force, from 0 - 1
open var forceSensitive: CGFloat = 0
/// color of stroke
open var color: UIColor = .black
// indicate if the stroke size in visual will be scaled along with the Canvas
// defaults to false, the stroke size in visual will stay with the original value
open var scaleWithCanvas = false
有了这些属性,您可以按照自己的想象创作出独特的笔刷。
力量与3D触摸
MaLiang支持绘画力度自动调整笔触大小。默认情况下支持3D触摸,对不支持此功能的设备将设置模拟力度。
forceSensitive
属性决定了力度是否影响笔触大小。它的值应在0
到1
之间。值越小,灵敏度越低。如果设置为0
,则力度将不影响笔触大小。
小图表
从2.1.0版本开始支持小图表元素。小图表必须使用其纹理数据注册到画布。您可以从其pngData()
方法简单地获取图像数据。
let data = UIImage(named: "chartlet").pngData()
let texture = try canvas.makeTexture(with: data)
您可以通过向画布添加时传入逆时针角度的方式来对小图表应用旋转。
canvas.renderChartlet(at: location, size: chartletSize, textureID: texture.id, rotation: angle)
文本
文本元素可以通过小图表功能渲染到画布上。MaLiang将文本布局和样式的工作留给了您。
- 首先,将文本内容放入一个标签、文本视图或任何其他自定义视图
- 其次,进行适当的样式设计和布局
- 然后,从该视图中进行截图。
- 最后,现在您应该有了文本内容的图像,使用小图表API将此图像渲染到画布上。
请参阅示例以获取更多详情。
CanvasData
CanvasData
现已默认配置。它包含 Canvas
上的所有数据,并使得 撤销 和 重做 操作成为可能。
您可以使用 CanvasData
保存的数据实现自己的 保存逻辑。
保存
// 1. create an instance of `DataExporter` with your canvas:
let exporter = DataExporter(canvas: canvas)
// 2. save to empty folders on disk:
exporter.save(to: localPath, progress: progressHandler, result: resultHandler)
// also you can use another synchronous method to do this work Synchronously
exporter.saveSynchronously(to: locakPath, progress: progressHandler)
然后,画布内容和一些文档信息将被保存在您提供的目录中的文件中。
MaLiang
不压缩文件夹,您可以参考示例项目实现自己的存档逻辑。
读取
使用 DataImporter
读取 MaLiang
保存到您画布中的数据
DataImporter.importData(from: localPath, to: canvas, progress: progressHandler, result: resultHandler)
此外,传递给 DataImporter 的 localPath 必须是放置内容文件所在的文件夹。如果您使用自己的存档逻辑,则先由自己解压内容。
许可证
MaLiang 受 MIT 许可证许可。有关更多信息,请参阅 LICENSE 文件。