区块链技术博客
www.b2bchain.cn

WWDC20 10148 – Inspect, Modify, and Construct PencilKit Drawings求职学习资料

本文介绍了WWDC20 10148 – Inspect, Modify, and Construct PencilKit Drawings求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

前言

自 Apple Pencil 发布以来,Apple Pencil 已经成为了在 App 内绘图或者书写的有力工具。现在,为了让 Apple Pencil 更加实用,开发者可以利用 PencilKit 深入研究构成图形的笔触、墨水、路径和点,借助这些信息,你可以进行手写体的识别、根据绘图的形状自动转成规则的图形。了解如何动态生成形状或者是图形,并进一步了解 PKDrawings 以及 PKStrokes 的相关 API。

Data Model Access

  • 看到 PKDrawing 内部模型
  • 从头开始生成新的绘图
  • 检查用户绘制内容
    PencilKit 能提供漂亮且逼真的墨水,并用这些墨水进行低延迟绘画。现在,在 iOS 14 中通过对 PencilKit 数据模型内部的绘图、笔画、墨迹、路径和点的访问,开发者可以检查用户所绘制的内容,并根据这些内容作出一些反应。这将使开发者可以使用 PencilKit 在自己的 App 中构建一些出色的新功能。下面用一个 Demo 来进行演示:

练字 Demo

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

  • 在输入框中输入的内容,PencilKit 会在下方进行合成,展示出需要练字的内容
  • 可以用键盘改变文字内容,也可以利用涂文字来进行内容的修改
  • 右上角的设置中,可以设置练习的字体大小和难度
  • 根据每个文字上的动画进行临摹,临摹笔画和文字匹配度高,临摹的笔迹成绿色可以继续临摹下个文字,否则笔迹会消失,你得重新临摹
  • 在右上方同时会展示当前临摹的分数
    这个 Demo 可以识别用户的输入,然后进行匹配判断,最终达到练字的目的。

Inside PKDrawing

下图展示的是一朵花以及这朵花的一个绘制过程的展开图

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings => WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

可以看到,这朵花实际上是由很多的 PencilKit 笔画构成的,每一个笔画都代表了用户所绘制的一条单独的线,这些笔画是按照用户绘制的顺序展开的:用户首先绘制来花的轮廓,然后绘制来花的茎和叶子,最后再使用马克笔进行上色。

接下来我们来看下练字 Demo 中的字体模板是怎么生成的:
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings
这里是一些字母的数据资源,它包含了 26 个演示中所要用到的小写字母,为了能够生成文本,需要把这张字母资源分割成一个个单独的字母,然后将这些字母进行组合,生成我们需要用来练习的模板,下方是如何将这张字母图分割开来的代码:

lowercaseDrawings = lowercaseLetterStrokeRanges.map { letterRange in      let letterStrokes = lowercaseABC.strokes[letterRange]     let letterDrawing = PKDrawing(strokes: letterStrokes)     return letterDrawing }

首先把小写字母绘制出来,得到它的笔画,对整个笔画数组进行切分,得到每个字母的笔画,然后用它为每个字母创建新的绘图,最后,对字母表中的每个字母都重复做这样的操作即可。如果你想检查或者修改一个绘图,你就可以通过访问绘图的笔画数组然后进行相关操作即可。当然,你也可以使用笔画,从头开始创建一个新的绘图。

PKStroke

笔画是怎么一回事? PencilKit 笔画是由什么构成的呢?下面,我们就来聊聊 PKStroke
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings
一个完整的 PKStroke 由以下内容组成:

  • path:路径,描述了笔画的形状
  • ink:墨水,描述了笔画的外观以及笔画的颜色和类型
  • transform:转换,给予笔画的方向和位置的一种转换
  • masks:蒙板
  • renderBounds:渲染界限,这是一个包含整个笔画的边界框,解释了所有笔画属性的效果

值得注意的是,墨水没有宽度,笔画的宽度是沿着笔画路径变化的,笔画的路径描述了笔画的形状,以及该形状沿着路径变化时的外观。PencilKit 笔画路径是 PencilKit 笔画点的统一立方体 B 样条,也就是说:一个路径的内容其实就是 B 样条的控制点,所以我们迭代路径上的点,依次绘制出每一个点,这样绘制出的点实际并不是沿着笔画的,这些 B 样条控制点可能并不是你想绘制的(如下图所示)

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

为了得到实际路径上的点,需要对 B 样条进行插值,我们可以用 interpolatedPoint strideBy 来访问这些点

for point in path.interpolatedPoints(strideBy: .distance(50)) {     draw(point) }

这提供来一个点的序列,我们可以像之前一样进行遍历,绘制这些,我们便有了路径上的一系列的点,这里有一点需要注意:这些点在路径上,数量比较多,并且它们的间距是统一的(上述代码中,间距是50)这就是传递给方法的步幅参数。你可能会注意到,最后一点的间距是不均匀的,这是因为无论步幅如何,笔画上的最后一点总是生成的,正如本例中所展示的一样,你可以通过距离、时间或者参数值来进行跨步

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

距离: 绘图坐标空间中的点
时间: 持续的一段时间,单位是 ,这个取决于用户绘图的速度
参数值: 与 B 样条的参数插值有关

for parametricValue in path.indicies {     draw(path.interpolatedPoint(at: CGFloat(parametricValue))) }

如果不绘制控制点,而是迭代路径的指数,从零开始到控制点数,每一次遍历,我们都得用到 interpolatedPoint at 得到参数值 0、1、2、3 等等的点,于是能得到和控制点相等的点,这些点实际上是在路径上的

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings => WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

这就很有用,我们为这些点标上数字再看:参数值很有用,因为它是一个浮点值,这意味着你可以要求任何值的插值点,包括非整数值(比如 2.4 或者 5.4 等等)这让你可以灵活地以任何你想要的方式对笔画路径进行插值
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

目前为止,所有的插值都是用统一步长来对路径进行插值,PencilKit 还提供了 使用参数值 以及 偏移值 沿路径任意距离步进的功能:parametricValue(parametricValue, offsetBy:) 这个函数可以让你在时间或者距离上偏移路径上的一个参数值,向前或者向后移动。

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

前言

自 Apple Pencil 发布以来,Apple Pencil 已经成为了在 App 内绘图或者书写的有力工具。现在,为了让 Apple Pencil 更加实用,开发者可以利用 PencilKit 深入研究构成图形的笔触、墨水、路径和点,借助这些信息,你可以进行手写体的识别、根据绘图的形状自动转成规则的图形。了解如何动态生成形状或者是图形,并进一步了解 PKDrawings 以及 PKStrokes 的相关 API。

Data Model Access

  • 看到 PKDrawing 内部模型
  • 从头开始生成新的绘图
  • 检查用户绘制内容
    PencilKit 能提供漂亮且逼真的墨水,并用这些墨水进行低延迟绘画。现在,在 iOS 14 中通过对 PencilKit 数据模型内部的绘图、笔画、墨迹、路径和点的访问,开发者可以检查用户所绘制的内容,并根据这些内容作出一些反应。这将使开发者可以使用 PencilKit 在自己的 App 中构建一些出色的新功能。下面用一个 Demo 来进行演示:

练字 Demo

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

  • 在输入框中输入的内容,PencilKit 会在下方进行合成,展示出需要练字的内容
  • 可以用键盘改变文字内容,也可以利用涂文字来进行内容的修改
  • 右上角的设置中,可以设置练习的字体大小和难度
  • 根据每个文字上的动画进行临摹,临摹笔画和文字匹配度高,临摹的笔迹成绿色可以继续临摹下个文字,否则笔迹会消失,你得重新临摹
  • 在右上方同时会展示当前临摹的分数
    这个 Demo 可以识别用户的输入,然后进行匹配判断,最终达到练字的目的。

Inside PKDrawing

下图展示的是一朵花以及这朵花的一个绘制过程的展开图

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings => WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

可以看到,这朵花实际上是由很多的 PencilKit 笔画构成的,每一个笔画都代表了用户所绘制的一条单独的线,这些笔画是按照用户绘制的顺序展开的:用户首先绘制来花的轮廓,然后绘制来花的茎和叶子,最后再使用马克笔进行上色。

接下来我们来看下练字 Demo 中的字体模板是怎么生成的:
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings
这里是一些字母的数据资源,它包含了 26 个演示中所要用到的小写字母,为了能够生成文本,需要把这张字母资源分割成一个个单独的字母,然后将这些字母进行组合,生成我们需要用来练习的模板,下方是如何将这张字母图分割开来的代码:

lowercaseDrawings = lowercaseLetterStrokeRanges.map { letterRange in      let letterStrokes = lowercaseABC.strokes[letterRange]     let letterDrawing = PKDrawing(strokes: letterStrokes)     return letterDrawing }

首先把小写字母绘制出来,得到它的笔画,对整个笔画数组进行切分,得到每个字母的笔画,然后用它为每个字母创建新的绘图,最后,对字母表中的每个字母都重复做这样的操作即可。如果你想检查或者修改一个绘图,你就可以通过访问绘图的笔画数组然后进行相关操作即可。当然,你也可以使用笔画,从头开始创建一个新的绘图。

PKStroke

笔画是怎么一回事? PencilKit 笔画是由什么构成的呢?下面,我们就来聊聊 PKStroke
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings
一个完整的 PKStroke 由以下内容组成:

  • path:路径,描述了笔画的形状
  • ink:墨水,描述了笔画的外观以及笔画的颜色和类型
  • transform:转换,给予笔画的方向和位置的一种转换
  • masks:蒙板
  • renderBounds:渲染界限,这是一个包含整个笔画的边界框,解释了所有笔画属性的效果

值得注意的是,墨水没有宽度,笔画的宽度是沿着笔画路径变化的,笔画的路径描述了笔画的形状,以及该形状沿着路径变化时的外观。PencilKit 笔画路径是 PencilKit 笔画点的统一立方体 B 样条,也就是说:一个路径的内容其实就是 B 样条的控制点,所以我们迭代路径上的点,依次绘制出每一个点,这样绘制出的点实际并不是沿着笔画的,这些 B 样条控制点可能并不是你想绘制的(如下图所示)

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

为了得到实际路径上的点,需要对 B 样条进行插值,我们可以用 interpolatedPoint strideBy 来访问这些点

for point in path.interpolatedPoints(strideBy: .distance(50)) {     draw(point) }

这提供来一个点的序列,我们可以像之前一样进行遍历,绘制这些,我们便有了路径上的一系列的点,这里有一点需要注意:这些点在路径上,数量比较多,并且它们的间距是统一的(上述代码中,间距是50)这就是传递给方法的步幅参数。你可能会注意到,最后一点的间距是不均匀的,这是因为无论步幅如何,笔画上的最后一点总是生成的,正如本例中所展示的一样,你可以通过距离、时间或者参数值来进行跨步

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

距离: 绘图坐标空间中的点
时间: 持续的一段时间,单位是 ,这个取决于用户绘图的速度
参数值: 与 B 样条的参数插值有关

for parametricValue in path.indicies {     draw(path.interpolatedPoint(at: CGFloat(parametricValue))) }

如果不绘制控制点,而是迭代路径的指数,从零开始到控制点数,每一次遍历,我们都得用到 interpolatedPoint at 得到参数值 0、1、2、3 等等的点,于是能得到和控制点相等的点,这些点实际上是在路径上的

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings => WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

这就很有用,我们为这些点标上数字再看:参数值很有用,因为它是一个浮点值,这意味着你可以要求任何值的插值点,包括非整数值(比如 2.4 或者 5.4 等等)这让你可以灵活地以任何你想要的方式对笔画路径进行插值
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

目前为止,所有的插值都是用统一步长来对路径进行插值,PencilKit 还提供了 使用参数值 以及 偏移值 沿路径任意距离步进的功能:parametricValue(parametricValue, offsetBy:) 这个函数可以让你在时间或者距离上偏移路径上的一个参数值,向前或者向后移动。

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

前言

自 Apple Pencil 发布以来,Apple Pencil 已经成为了在 App 内绘图或者书写的有力工具。现在,为了让 Apple Pencil 更加实用,开发者可以利用 PencilKit 深入研究构成图形的笔触、墨水、路径和点,借助这些信息,你可以进行手写体的识别、根据绘图的形状自动转成规则的图形。了解如何动态生成形状或者是图形,并进一步了解 PKDrawings 以及 PKStrokes 的相关 API。

Data Model Access

  • 看到 PKDrawing 内部模型
  • 从头开始生成新的绘图
  • 检查用户绘制内容
    PencilKit 能提供漂亮且逼真的墨水,并用这些墨水进行低延迟绘画。现在,在 iOS 14 中通过对 PencilKit 数据模型内部的绘图、笔画、墨迹、路径和点的访问,开发者可以检查用户所绘制的内容,并根据这些内容作出一些反应。这将使开发者可以使用 PencilKit 在自己的 App 中构建一些出色的新功能。下面用一个 Demo 来进行演示:

练字 Demo

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

  • 在输入框中输入的内容,PencilKit 会在下方进行合成,展示出需要练字的内容
  • 可以用键盘改变文字内容,也可以利用涂文字来进行内容的修改
  • 右上角的设置中,可以设置练习的字体大小和难度
  • 根据每个文字上的动画进行临摹,临摹笔画和文字匹配度高,临摹的笔迹成绿色可以继续临摹下个文字,否则笔迹会消失,你得重新临摹
  • 在右上方同时会展示当前临摹的分数
    这个 Demo 可以识别用户的输入,然后进行匹配判断,最终达到练字的目的。

Inside PKDrawing

下图展示的是一朵花以及这朵花的一个绘制过程的展开图

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings => WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

可以看到,这朵花实际上是由很多的 PencilKit 笔画构成的,每一个笔画都代表了用户所绘制的一条单独的线,这些笔画是按照用户绘制的顺序展开的:用户首先绘制来花的轮廓,然后绘制来花的茎和叶子,最后再使用马克笔进行上色。

接下来我们来看下练字 Demo 中的字体模板是怎么生成的:
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings
这里是一些字母的数据资源,它包含了 26 个演示中所要用到的小写字母,为了能够生成文本,需要把这张字母资源分割成一个个单独的字母,然后将这些字母进行组合,生成我们需要用来练习的模板,下方是如何将这张字母图分割开来的代码:

lowercaseDrawings = lowercaseLetterStrokeRanges.map { letterRange in      let letterStrokes = lowercaseABC.strokes[letterRange]     let letterDrawing = PKDrawing(strokes: letterStrokes)     return letterDrawing }

首先把小写字母绘制出来,得到它的笔画,对整个笔画数组进行切分,得到每个字母的笔画,然后用它为每个字母创建新的绘图,最后,对字母表中的每个字母都重复做这样的操作即可。如果你想检查或者修改一个绘图,你就可以通过访问绘图的笔画数组然后进行相关操作即可。当然,你也可以使用笔画,从头开始创建一个新的绘图。

PKStroke

笔画是怎么一回事? PencilKit 笔画是由什么构成的呢?下面,我们就来聊聊 PKStroke
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings
一个完整的 PKStroke 由以下内容组成:

  • path:路径,描述了笔画的形状
  • ink:墨水,描述了笔画的外观以及笔画的颜色和类型
  • transform:转换,给予笔画的方向和位置的一种转换
  • masks:蒙板
  • renderBounds:渲染界限,这是一个包含整个笔画的边界框,解释了所有笔画属性的效果

值得注意的是,墨水没有宽度,笔画的宽度是沿着笔画路径变化的,笔画的路径描述了笔画的形状,以及该形状沿着路径变化时的外观。PencilKit 笔画路径是 PencilKit 笔画点的统一立方体 B 样条,也就是说:一个路径的内容其实就是 B 样条的控制点,所以我们迭代路径上的点,依次绘制出每一个点,这样绘制出的点实际并不是沿着笔画的,这些 B 样条控制点可能并不是你想绘制的(如下图所示)

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

为了得到实际路径上的点,需要对 B 样条进行插值,我们可以用 interpolatedPoint strideBy 来访问这些点

for point in path.interpolatedPoints(strideBy: .distance(50)) {     draw(point) }

这提供来一个点的序列,我们可以像之前一样进行遍历,绘制这些,我们便有了路径上的一系列的点,这里有一点需要注意:这些点在路径上,数量比较多,并且它们的间距是统一的(上述代码中,间距是50)这就是传递给方法的步幅参数。你可能会注意到,最后一点的间距是不均匀的,这是因为无论步幅如何,笔画上的最后一点总是生成的,正如本例中所展示的一样,你可以通过距离、时间或者参数值来进行跨步

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

距离: 绘图坐标空间中的点
时间: 持续的一段时间,单位是 ,这个取决于用户绘图的速度
参数值: 与 B 样条的参数插值有关

for parametricValue in path.indicies {     draw(path.interpolatedPoint(at: CGFloat(parametricValue))) }

如果不绘制控制点,而是迭代路径的指数,从零开始到控制点数,每一次遍历,我们都得用到 interpolatedPoint at 得到参数值 0、1、2、3 等等的点,于是能得到和控制点相等的点,这些点实际上是在路径上的

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings => WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

这就很有用,我们为这些点标上数字再看:参数值很有用,因为它是一个浮点值,这意味着你可以要求任何值的插值点,包括非整数值(比如 2.4 或者 5.4 等等)这让你可以灵活地以任何你想要的方式对笔画路径进行插值
WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

目前为止,所有的插值都是用统一步长来对路径进行插值,PencilKit 还提供了 使用参数值 以及 偏移值 沿路径任意距离步进的功能:parametricValue(parametricValue, offsetBy:) 这个函数可以让你在时间或者距离上偏移路径上的一个参数值,向前或者向后移动。

WWDC20 10148 - Inspect, Modify, and Construct PencilKit Drawings

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WWDC20 10148 – Inspect, Modify, and Construct PencilKit Drawings求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们