RoughSwift

RoughSwift

SwiftUI库实现手绘风格图形渲染

RoughSwift是一个SwiftUI库,用于创建手绘、素描和漫画风格的图形。支持线条、矩形、圆形等多种形状,提供丰富的自定义选项。该库具有简洁的API、良好的平台兼容性和完整的测试覆盖。适用于iOS和tvOS应用开发,可添加独特的视觉效果。

RoughSwiftSwiftUI手绘风格图形绘制自定义图形Github开源项目

前往 https://indiegoodies.com/ 查看

描述

RoughSwift 允许我们在 SwiftUI 中轻松创建手绘、素描、漫画风格的图形。

  • 支持 iOS、tvOS
  • 支持所有形状:线条、矩形、圆形、椭圆、线性路径、弧形、曲线、多边形、SVG 路径
  • CAShapeLayer 生成 UIBezierPath
  • 通过选项轻松自定义
  • 简单可组合的 API
  • 便捷的绘制函数
  • 平台无关的 API,可轻松支持新平台
  • 测试覆盖
  • 不可变和类型安全的数据结构
  • SVG 椭圆弧

有一个 示例 项目,您可以进一步探索。

基础

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 用于自定义形状。它是不可变的结构体,每次应用于一个形状。以下属性可配置:

  • maxRandomnessOffset
  • toughness
  • bowing
  • fill
  • stroke
  • strokeWidth
  • curveTightness
  • curveStepCount
  • fillStyle
  • fillWeight
  • hachureAngle
  • hachureGap
  • dashOffset
  • dashGap
  • zigzagOffset

形状

RoughSwift 支持所有基本形状,包括 SVG 路径:

  • line(线条)
  • rectangle(矩形)
  • ellipse(椭圆)
  • circle(圆形)
  • linearPath(线性路径)
  • arc(弧形)
  • curve(曲线)
  • polygon(多边形)
  • path(路径)

填充样式

大多数情况下,我们使用 fill 作为形状内部的纯色填充,stroke 作为形状边框,fillStyle 作为素描填充样式。

可用的填充样式:

  • crossHatch(交叉阴影)
  • dashed(虚线)
  • dots(点)
  • hachure(平行线阴影)
  • solid(实心)
  • starBurst(星爆)
  • zigzag(锯齿)
  • zigzagLine(锯齿线)

以下是如何以不同填充样式绘制圆形。默认填充样式是 hachure:

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

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) } }

高级:Drawable、Generator 和 Renderer

在幕后,我们组合了 GeneratorRenderer

我们可以实例化 Engine 或使用共享的 Engine 以提高内存效率,来创建 Generator。每次我们指示 Generator 绘制一个形状时,引擎都会努力计算出 Drawable 中素描形状的信息。

这些概念的命名遵循 rough.js,以便更好地理解代码。

对于 iOS,有一个 Renderer 可以处理 Drawable 并将其转换为 UIBezierPathCALayer。将来会有更多 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 文件的依赖项中添加以下行:

.package(url: "https://github.com/onmyway133/RoughSwift"),

作者

Khoa Pham, onmyway133@gmail.com

鸣谢

  • rough 为 RoughSwift 提供生成器支持。所有艰苦的工作都是通过 JavascriptCore 中的 rough 完成的。
  • SVGPath 用于从 SVG 路径构造 UIBezierPath

贡献

我们非常欢迎您为 RoughSwift 做出贡献,请查看 CONTRIBUTING 文件了解更多信息。

许可证

RoughSwift 基于 MIT 许可证提供。有关更多信息,请参阅 LICENSE 文件。

编辑推荐精选

Pixmax

Pixmax

一站式AI短剧创作平台

Pixmax专注打造下一代“ AI 视觉创作引擎”,整合行业顶尖 AI 大模型、工工业级精准控制及企业级协同管理功能,是全方位的 AI 内容创作平台。

豆包

豆包

字节跳动旗下 AI 智能助手

字节跳动旗下 AI 智能助手

GPT Plus|Pro充值

GPT Plus|Pro充值

GPT充值

支持 ChatGPT Plus / Pro 充值服务,支付便捷,自动发货,售后可查。

GPT Image 2中文站

GPT Image 2中文站

AI 图片生成平台

GPT Image 2 是面向用户的 AI 图片生成平台,支持文生图、图生图及多模型创意工作流。

Vecbase

Vecbase

你的AI Agent团队

Vecbase 是专为 AI 团队打造的智能工作空间,将数据管理、模型协作与知识沉淀整合于一处。算法、产品与业务在同一平台无缝协同,让从数据到 AI 应用的落地更快一步。

音述AI

音述AI

全球首个AI音乐社区

音述AI是全球首个AI音乐社区,致力让每个人都能用音乐表达自我。音述AI提供零门槛AI创作工具,独创GETI法则帮助用户精准定义音乐风格,AI润色功能支持自动优化作品质感。音述AI支持交流讨论、二次创作与价值变现。针对中文用户的语言习惯与文化背景进行专门优化,支持国风融合、C-pop等本土音乐标签,让技术更好地承载人文表达。

QoderWork

QoderWork

阿里Qoder团队推出的桌面端AI智能体

QoderWork 是阿里推出的本地优先桌面 AI 智能体,适配 macOS14+/Windows10+,以自然语言交互实现文件管理、数据分析、AI 视觉生成、浏览器自动化等办公任务,自主拆解执行复杂工作流,数据本地运行零上传,技能市场可无限扩展,是高效的 Agentic 生产力办公助手。

lynote.ai

lynote.ai

一站式搞定所有学习需求

不再被海量信息淹没,开始真正理解知识。Lynote 可摘要 YouTube 视频、PDF、文章等内容。即时创建笔记,检测 AI 内容并下载资料,将您的学习效率提升 10 倍。

AniShort

AniShort

为AI短剧协作而生

专为AI短剧协作而生的AniShort正式发布,深度重构AI短剧全流程生产模式,整合创意策划、制作执行、实时协作、在线审片、资产复用等全链路功能,独创无限画布、双轨并行工业化工作流与Ani智能体助手,集成多款主流AI大模型,破解素材零散、版本混乱、沟通低效等行业痛点,助力3人团队效率提升800%,打造标准化、可追溯的AI短剧量产体系,是AI短剧团队协同创作、提升制作效率的核心工具。

seedancetwo2.0

seedancetwo2.0

能听懂你表达的视频模型

Seedance two是基于seedance2.0的中国大模型,支持图像、视频、音频、文本四种模态输入,表达方式更丰富,生成也更可控。

下拉加载更多