PaintCode 教程:矢量图轻松转换成CoreGraphics代码
本文译自Ranwenderlich的这篇:http://www.raywenderlich.com/100281/paintcode-for-designers-getting-started
PaintCode是个非常棒又小而美的mac程序,主要用途是可以将你的矢量图轻松地转换成CoreGraphics代码,可以很轻松的把代码放在你的iOS app里。(好处当然是降低了图片的使用率,app容量大大减小,而且做动效也容易了很多。)
它不单单是把矢量图转换为代码,更重要的是这些代码生成的图像都是动态的,意味着你可以方便的改变他们的颜色,大小,布局。一切能通过代码更改的。
在这个教程,你将会学习如何使用PaintCode制作两个素材,一个时钟和时钟的指针。并且可以导出为StyleKit(你可以简单的理解为代码文件,.h.m什么的),用在你的app里。
StyleKit导出的代码文件可以包含很多东西,例如颜色,渐变色或者阴影等等。如果你更改了素材,你可以随时使用paintcode导出新的StyleKit。
这是我们将要使用paintcode制作的素材。并且还会添加一些动效,让这个时钟转起来。
正式开始
打开我们的PaintCode(最好是正式版而不是试用版),新建一个Document。
现在界面是这样的。
paintcode默认帮我们生成了一个canvas,就类似于画图软件里面的画布,然后查看我们的右侧,有一个面板。
这就是属性面板,看起来有点像我们XIB里面的属性面板,包括size什么的。
ok,在属性面板里给我们的canvas起个名字,就叫“Stopwatch”好了。
然后在我们的Code Export下拉框里,选择StyleKit Drawing & Image Method这个选项。
这个选项的意思就是说,等一会我们生成的代码里,既包含绘画的路径代码(一堆贝塞尔曲线什么的),还会有一个方法是返回一个UIImage类,让你可以直接放在UIImageView里。还是很贴心的。
跟我们的Xcode一样,paintcode里的canvas也是以左上角作为原点的。所以熟练使用Xib的iOS开发应该也能用的很顺手。
创造我们的Stopwatch
下一步,看我们paintcode左上角有一排图标.
选中圆形的那个图标,看图识字应该知道,这个图标就是用来画圆形的。
ok,选中之后,在我们的画布上拖一个圆出来,这时候要按住shift键不放来拖,因为这样可以保证圆形是个正圆,而不是个椭圆。
不用太在意圆形的大小,拖完之后我们可以直接在属性面板里更改。很简单。
ok,现在我们的画布上有一个圆了。然后把它的坐标改为(15,30),长宽都改为220.像这样图一样。
然后,点击Fill(就是圆的填充色),在下拉窗口中选择'Add New Color',创建一个我们自己的颜色。
然后在弹出的窗口里输入颜色的HEX值#118DDA.如图所示
点击弹出窗口的外面,让窗口消失,ok我们有了自己的颜色。以后要使用这个色值的时候软件会直接显示这个颜色。
刚才我们选了画圆的按钮,这时候我们选择画方块的按钮,因为我们现在要画一个方块。
随便在画板上拖一个方块,并且把Rect改为下面的值。
X:114
Y:2
W:22
H:34
改完之后你的画板应该是现在这个样子。
然后我们这时候还需要拖一个方块,随便放在画板的一个角落,然后把大小改为宽30,高20.如图。
然后,我们再拖一个方块,这时候按住shift键不放,这样可以保证方块的长宽比一致(也就是正方形),也是随便放个位置就行了。如图。
可能有人要问了,我们拖的这两个小方块是干嘛的。别着急,继续往下看。
我们选中稍大的那个方块,到右边的属性窗口点开Transforms,然后把Rotation改为-45°。
现在应该是这样的。
然后选中我们的小正方形,把他拖到我们旋转-45°的方块上。如图
注意拖动的时候软件会有提示,你感觉对齐了松手就可以了。
拖动到正确位置后,按住shift不放,同时选中这两个矩形,点击右上角的这个图标.
这个图标叫做Union,意思就是把两个图形合并成为一个。
ok,点完之后再把这个合二为一的图片坐标改为下图的值。
好的,我们现在的画板看起来应该是这样的。
保存一下。起名叫PaintCodeTutorial就行了。
创建我们的Stopwatch指针。
现在我们有了表盘,还缺表针。现在我们就来创建我们的表针。
我们先创建一个新的画板,现有画布的旁边右键点击
创建一个200*200的画布,注意,如果你在右键点击之前,第一个画布处于选中状态的时候,他会出现(250 x 250) Size of Stopwatch 这个选项。还是很贴心的。因为他会估计你新创建的画布会想要和第一个画布大小相同。
ok,创建完成之后把我们的新画布宽改为250,长改为220.并且把我们的StyleKit改为Drawing Method,意思就是等一会只生成画图的代码而不生成返回UIImage的代码 如图。
修改完之后,先不用管他。回到我们的上一个画布。
拖一个圆到我们的第一个画布。如图。
然后把这个圆的颜色改为白色。
把这个圆的宽高都改为30.并且坐标放到我们表盘的中央。放完之后,我们的圆的X和Y应该是110,125:
然后再拖一个矩形到我们的表盘上,宽高分别为8,115.然后拖到如图的位置。大概准就行了。
ok,是不是已经很像表针了。
这时候按住shift选中我们的长条矩形和圆形,打开属性面板的Transforms下拉框,我们会看到这样的东西。
那个绿色的小圆是什么呢?
其实就是类似于我们CALayer的anchorPoint(锚点),如果你旋转一定角度的时候,绿色的小圆就是我们的图形会以此为圆心旋转的敌方。
你可以随意拖动这个绿色的小圆来指定图形的锚点。这时候我们选中小圆,把他的锚点拖到圆的中心。如图
矩形不用管它。
然后我们把两个图形按照上面的方法,Union一下,合并成一个图。然后还是打开属性面板的Transforms下拉框,你会看到这样。
绿色的小圆在我们图形的左上角,说明我们的锚点在图形的左上角,这明显不对啊,真实的指针哪有这么转的,应该转的时候是以小圆的那个圆心为中心啊。
所以我们把绿色的小圆拖到这个位置.
ok,我们的表针弄好了。我们把它复制到第二个画布上。
并且把坐标改为X:125,Y:110.
如图所示。
改好之后,点击这里.
然后在我们的StyleKit Colors里。
选择我们之前创建的一个颜色。
行了,其他的不用管了。不过确保你的StyleKit Drawing Methods看起来是这样的。
然后右边的属性栏修改一下name什么的。
点击Export按钮。
会有一个弹窗。
点击Export然后save。你就会看到paintcode帮你导出了这两个文件。
我们让上面生成的代码动起来。
首先,先下载一个初始的Xcode文件。
打开之后,新建两个View,如下。
1
2
3
4
5
6
7
|
import UIKit @IBDesignable class Stopwatch: UIView { override func drawRect(rect: CGRect) { PaintCodeTutorial.drawStopwatch() } } |
加@IBDesignable告诉Interface Builder这个类可以实时渲染到界面中.
另一个类如下。
1
2
3
4
5
6
7
|
import UIKit @IBDesignable class StopwatchHand: UIView { override func drawRect(rect: CGRect) { PaintCodeTutorial.drawStopwatch_Hand() } } |
然后拖一个View到我们的storyboard中的AssetViewcontroller里.然后把Class改为我们刚才新建两个类中的Stopwatch,storyboard检测到我们的view中有IBDesignable,所以就会自动渲染了。如图
加四个约束。
定宽250
定高250
Align Center X to(就是X轴居中)
与父View的TopLayout间距0
表盘有了,现在再拖一个view到我们的表盘View中。class改为StopwatchHand。
增加四个约束。
Width Equals: 250(定宽250)
Height Equals: 222 (定高222)
Align Center-X to: Stopwatch(x轴居中)
Align Bottom to: Stopwatch(下边距父view的bottom间距0)
添加完约束如图。
让表针动起来
先把我们的表针view拉到我们的AssetViewController中。
1
|
@IBOutlet weak var stopWatchHandView: UIView? |
然后更改AssetViewController代码如下。
1
2
3
4
5
6
7
8
9
10
11
|
override func viewWillAppear(animated: Bool) { rotateStopWatchHand() } func rotateStopWatchHand() { UIView.animateWithDuration(2.0, delay: 0, options: .CurveLinear, animations: { self.stopWatchHandView.transform = CGAffineTransformRotate(self.stopWatchHandView.transform, CGFloat(M_PI_2)) }, completion: { finished in self.rotateStopWatchHand() }) } |
运行程序。
你可以从这里下载完整程序。
译文已经完结了。
不过我还会写一篇,介绍paintcode的另一个特性,Dynamic Shapes。
PaintCode 教程:矢量图轻松转换成CoreGraphics代码的更多相关文章
- Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表
前面几篇博文介绍了从项目搭建到获取网络字符串,对一个项目的前期整体工作进行了详细的介绍,本篇接着上篇介绍一下怎么样优雅将网络返回的json字符串轻松转换成listview列表. 先上图,看一下效果. ...
- 基于jQuery实现汉字转换成拼音代码
基于jQuery实现汉字转换成拼音代码.这是一款基于jQuery.Hz2Py.js插件实现的汉字转拼音特效.效果图如下: 在线预览 源码下载 实现的代码. html代码: <br /> ...
- [UE4]蓝图转换成C++代码
版本:4.12 1.进行如下设置 2.将项目打包出来(任意一平台都行,本文以Windows为例) 3.打包完成后才会在原项目工程中生成蓝图转换成c++的代码 4.如图路径(转换后的代码路径较深所以一步 ...
- [置顶] oracle 数据库表中转换成java代码
--数据库中字段java代码 select col.TABLE_NAME,replace(initcap(col.TABLE_NAME),'_', '') , 'private '||decode ...
- 利用 Aspose.Words 组件,在不依赖与 Office 组件的情况下把 Word 文件转换成 HTML 代码。
首先利用 Nuget 获取 Aspose.Words.dll public ActionResult AsposeWordsDemo() { string srcFileName = Server.M ...
- Python matplotlib图片转化成矢量图并裁剪
Python目前可以生成的图的格式是:eps, jpeg, jpg, pdf, pgf, png, ps, raw, rgba, svg, svgz, tif, tiff 在写论文时候我一般生成png ...
- Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
VectorDrawable 矢量图 三部曲: Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图 Android 开发 VectorDrawabl ...
- 教你一招:Word中的文字转换成表格,把表格转换成文字
在使用office软件时,常常会在Word中加入表格,这时候我们一般想到的是,建立表格,然后一格一格的填写;或者用Excel表格制作在复制到Word文档中.其实在Word中就可以将文本文档转换成电子表 ...
- 怎样把php数组转换成字符串,php implode()
实例代码 一维数组转换成字符串代码! <?php $arr1=array("shu","zhu","1"); $c=implode(& ...
随机推荐
- navicate的使用及用Python操作数据额库
Navicat使用 下载地址:<https://pan.baidu.com/s/1bpo5mqj> Navicat是基于mysql操作的,所以能否自主完成一些练习,就能够运用Navicat ...
- vue进入页面时不在顶部,检测滚动返回顶部按钮
这里是本小白使用时遇到的问题及个人使用的方法可能并不完美. 1.监测浏览器滚动条滚动事件及滚动距离 dmounted() { window.addEventListener("scroll& ...
- FreeRTOS 任务挂起和恢复
在使用RTOS的时候一个实时应用可以作为一个独立的任务.每个任务都有自己的运行环境, 不依赖于系统中其他的任务或者RTOS调度器. 任何一个时间点只能有一个任务运行,具体运行哪个任务是由RTOS调度器 ...
- Apache常见interview
Apache在Linux系统下的工作模式及特点?如何使Apache使用worker模式? prefork 是一种非线程.与派生的工作模式,用的是进程去处理请求,所以比较容易消耗内存,但是稳定性好,某个 ...
- Linux 命令之 alias
alias 的作用是为命令设置别名,用于提高输入效率 alias 的临时设置 临时设置很简单,直接举例说明 [r@1lin24 ~]$ alias cdlog='cd /var/log' [r@1li ...
- 18计科学期总成绩明细 && 小黄衫团队预选
1.个人所有作业+团队作业总得分排名 2.千帆竞发图 3.各团队每次作业得分汇总 根据团队成绩排名,众志陈成队得分最高,预选为小黄衫团队. 对团队成绩有异议的团队,请在成绩预选发布后的两天内私信助教解 ...
- Redis未授权访问漏洞复现及修复方案
首先,第一个复现Redis未授权访问这个漏洞是有原因的,在 2019-07-24 的某一天,我同学的服务器突然特别卡,卡到连不上的那种,通过 top,free,netstat 等命令查看后发现,CPU ...
- linux网络编程之socket编程(十三)
今天继续学习socket编程,从今天起开始学习UDP,具体内容如下: ①.无连接 UDP协议它内部并没有维护端到端的一些连接状态,这跟TCP是不同的,TCP是基于连接的,而在连接的时候是需要进行三次握 ...
- 【经典/基础BFS+略微复杂的题意】PAT-L3-004. 肿瘤诊断
L3-004. 肿瘤诊断 在诊断肿瘤疾病时,计算肿瘤体积是很重要的一环.给定病灶扫描切片中标注出的疑似肿瘤区域,请你计算肿瘤的体积. 输入格式: 输入第一行给出4个正整数:M.N.L.T,其中M和N是 ...
- java UDP 通信:服务端与客服端
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import j ...