RoughSwift 允许我们在 SwiftUI 中轻松制作手绘、草图、漫画风格的形状。
CAShapeLayer
生成 UIBezierPath
在 示例 项目中,您可以进一步探索。
在 draw
函数中使用 generator
来指定要渲染的形状。返回的 CALayer
包含正确 size
的渲染结果,并在每次指示 generator
时更新。
以下是如何绘制绿色矩形
RoughView()
.fill(.yellow)
.fillStyle(.hachure)
.hachureAngle(-41)
.hachureGap(-1)
.fillWeight(-1)
.stroke(.systemTeal)
.strokeWidth(2)
.curveTightness(0)
.curveStepCount(9)
.dashOffset(-1)
.dashGap(-1)
.zigzagOffset(-9)
CALayer
的美妙之处在于我们可以进一步动画、变换(平移、缩放、旋转)并将它们组合成更强大的形状。
Options
用于自定义形状。它是一个不可变的结构体,一次应用于一个形状。以下属性是可配置的
RoughSwift 支持所有基本形状,包括 SVG 路径
大多数时候,我们使用 fill
用于形状内部的纯色填充,stroke
用于形状边框,fillStyle
用于草图填充样式。
可用的填充样式
以下是如何绘制不同填充样式的圆形。默认填充样式为阴影线
struct StylesView: View {
var body: some View {
LazyVGrid(columns: [.init(), .init(), .init()], spacing: 12) {
RoughView()
.fill(.red)
.fillStyle(.crossHatch)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.green)
.fillStyle(.dashed)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.purple)
.fillStyle(.dots)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.cyan)
.fillStyle(.hachure)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.orange)
.fillStyle(.solid)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.gray)
.fillStyle(.starBurst)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.yellow)
.fillStyle(.zigzag)
.circle()
.frame(width: 100, height: 100)
RoughView()
.fill(.systemTeal)
.fillStyle(.zigzagLine)
.circle()
.frame(width: 100, height: 100)
}
}
}
SVG 形状可能大于或小于指定的图层大小,因此 RoughSwift 会将它们缩放到您请求的 size
。这样我们就可以组合和变换 SVG 形状。
struct SVGView: View {
var apple: String {
"M85 32C115 68 239 170 281 192 311 126 274 43 244 0c97 58 146 167 121 254 28 28 40 89 29 108 -25-45-67-39-93-24C176 409 24 296 0 233c68 56 170 65 226 27C165 217 56 89 36 54c42 38 116 96 161 122C159 137 108 72 85 32z"
}
var body: some View {
VStack {
RoughView()
.stroke(.systemTeal)
.fill(.red)
.draw(Path(d: apple))
.frame(width: 300, height: 300)
}
}
}
有了所有基本形状,我们可以创造更美好的事物。唯一的限制是您的想象力。
以下是如何创建图表
struct Chartview: View {
var heights: [CGFloat] {
Array(0 ..< 10).map { _ in CGFloat.random(in: 0 ..< 150) }
}
var body: some View {
HStack {
ForEach(0 ..< 10) { index in
VStack {
Spacer()
RoughView()
.fill(.yellow)
.rectangle()
.frame(height: heights[index])
}
}
}
.padding(.horizontal)
.padding(.bottom, 100)
}
}
在幕后,我们组合了 Generator
和 Renderer
。
我们可以实例化 Engine
或使用共享的 Engine
以提高内存效率,来创建 Generator
。每次我们指示 Generator
绘制形状时,引擎都会努力计算 Drawable
中草图形状的信息。
这些概念的名称遵循 rough.js
,以便更好地进行代码推理。
对于 iOS,有一个 Renderer
可以处理 Drawable
并将其转换为 UIBezierPath
和 CALayer
。未来会有更多 Renderer
可以渲染到图形上下文、图像以及其他平台,如 macOS 和 watchOS。
let layer = CALayer()
let size = CGSize(width: 200, heigh: 200)
let renderer = Renderer(layer: layer)
let generator = Engine.shared.generator(size: bounds.size)
let drawable: Drawable = Rectangle(x: 10, y: 10, width: 100, height: 50)
let drawing = generate.generate(drawable: drawable)
renderer.render(drawing: drawing)
将以下行添加到您的 Package.swift
文件中的 dependencies 中
.package(url: "https://github.com/onmyway133/RoughSwift"),
Khoa Pham, onmyway133@gmail.com
我们欢迎您为 RoughSwift 做出贡献,请查看 CONTRIBUTING 文件以获取更多信息。
RoughSwift 在 MIT 许可证下可用。请参阅 LICENSE 文件以获取更多信息。