[iPad]PencilKit教程1、PencilKit介绍

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(let_us_code)
➤博主域名:https://www.zengqiang.org
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/14088647.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

PencilKit(Swift)示例代码:点击下载

PencilKit介绍

  满足Apple的功能丰富的绘图和注释框架PencilKit。 仅需几行代码,您就可以为应用程序添加完整的绘图体验-可以访问画布,响应式墨水,丰富的工具调色板和绘图模型。 聆听使Apple Pencil拥有出色体验的技术细节。 了解有关新的屏幕截图编辑器的信息,以及如何使用少量的小型API来捕获完整的内容,而无论使用或不使用应用程序的用户界面,都可以捕获超出屏幕大小的全部内容。


下午好。欢迎使用介绍PencilKit。

我是Will Thimbleby,我想谈谈这个奇妙的小设备。

这是Apple Pencil,它可以真正改变您在iPad上的用户体验。

实际上,这是iPad最独特的方面。

从学龄前儿童到艾萨克·牛顿(Isaac Newton),从您的待办事项清单到美术,铅笔通常是它的起点。

它可在出色的iPad Pro上以及从最小的Mini到最大的Pro的整个iPad系列中使用

实际上,它非常适合照片修饰,注释,涂鸦,您想要做的任何事情都需要精确。

在iOS 13中,我们在延迟方面取得了长足的进步,我们添加了一个很棒的新工具面板。

我们正在引入PencilKit,使您能够更轻松地将Pencil添加到您的应用中。而且,我们还将引入“无处不在”标记,以使用户可以注释和标记应用程序的内容,即使您的应用程序对铅笔没有任何作用。

我们将讨论优质的Pencil体验,PencilKit如何帮助您获得优质的Pencil体验。最后,借助“无处不在的标记” ,您可以如何向用户提供内容,以便他们可以对其进行标记。是什么让铅笔体验很棒好吧,一种很棒的Pencil体验是可以充分利用Apple Pencil提供的所有功能。

这意味着充分利用Apple Pencil所提供精度

它使您可以触摸像素,并以每秒240次的速度为您提供该信息。

它具有独特的表现力,可赋予您力量,方位角和高度,使您能够在应用程序创建真正的表现力标记,使应用程序栩栩如生。

最后,第二代Apple Pencil具有Pencil水龙头,允许用户在不放下Pencil的情况更改应用程序中的模式

现在有三种不同类型的铅笔。

第一代Apple Pencil,第二代和Logitech Crayon。

这些都具有稍微不同的功能。它们都具有相同的高精度。

它们都具有相同的方位角和高度,因此您可以创建自己的表情标记。

第一代铅笔为它增加了力量。

第二代Pencil添加了点击手势。

我将讨论一些很好地支持Apple Pencil的较复杂方面。但是,如果您只是开始并且想要建立自定义的绘图体验,我特别建议您在WWDC 2016中使用“在iOS上利用触摸输入”。了解Pencil的工作方式是了解其功能的关键

因此,我将带您深入了解幕后情况,并告诉您Pencil的功能。

铅笔在屏幕创建了独特精确的触摸位置,并为您提供了240次点击。

如您所知,它为您提供方位角,即围绕iPad垂直线的角度

它会为您提供高度或倾斜度,即您握住铅笔的陡度

您可能不知道的是它是如何做到的。

铅笔在iPad表面产生第二个击中点和接触点。

并使用三角函数来计算方位角和高度。

最终,Pencil具有一个轴向力传感器,可以检测压力,并通过蓝牙发送该数据

这有一些后果。

第一个是方位角,当第二个触摸点(可能是手指或屏幕边缘被遮盖可以估算高度

当Pencil几乎垂直于iPad时,将强调方位角

最后,通过不同机制产生的作用力数据触摸位置数据中延迟出来

处理铅笔的这些更复杂的方面是建立出色的铅笔体验的关键

当我从屏幕边缘绘制时,我正在获得估计的方位角和高度。

当我继续画在屏幕上时,随着第二个接触点出现在屏幕表面,您将获得正确的值。

现在,您应该回填那些正确的值以更正估计的,而不是让它看起来像这样

其次,在绘制时,铅笔后面有一个正在使用估计力的区域。您应该不断聆听强制更新,以便可以绘制正确的值。

即使将铅笔从iPad表面提起,情况仍然如此

笔触的某个区域仍在等待这些最终力值。

即使触摸结束,您也需要继续听

现在,这是一个方面,这意味着用户可以在最后一个笔划获得所有最终值之前开始绘制下一个笔划

我建议使用串行队列一次只处理一个笔划。

时间足够短,用户不会注意到。但是您想正确处理数据

妥善处理Pencil的另一部分是延迟。

使用实体铅笔,铅笔本质上与绘制的线条相关。

在数字设备上,工具在哪里和屏幕上的线条哪里之间通常存在差距

保持尽可能小的尺寸对于维持这种在纸上绘图的感觉至关重要

我们非常关心Apple的延迟,因此我们有机器人不断对其进行测试。

这是我们测试之一的高速捕获

每秒800帧,您可以看到铅笔和线条之间的距离有多小

让我实时向您展示。

你明白了吗?我再给你看

因此,提供最佳延迟的一些技巧

首先,您需要在Metal中进行渲染

每个帧只有几毫秒,您需要一帧又一帧地这样做,以提供良好的延迟。

在iOS 13中,我们在改善预测方面取得了长足的进步。您应该使用预测的触摸来进一步减少延迟

最后,如果要构建绘图应用程序,则要获得绝对最佳的延迟,应避免使用诸如透明金属层之类的东西而且,您应该避免在金属层顶部使用模糊和覆盖的UI效果视图之类的东西

其中一个方面有时会忽略,那就是默认的导航栏,实际上,家庭负担可能会增加渲染成本。

支持Pencil的最后一部分是Pencil Tap手势。

这是让用户无需放下Pencil即可切换模式的好方法

为此,您应该使用UIPencilInteraction,将自己设置代理,然后在用户点击时回叫。

这样做时,您应该尊重用户的首选点击操作。

这是用户将在“设置”中选择的东西

如果可以的话,您应该尊重这一点。

如果对您的应用没有意义,则应使用Pencil Tap进行无损模式切换。

因此,直到今天,建立出色的Pencil体验还是一项艰巨的工作。我们提供了一些出色的API和出色的硬件,您已经创造了一些世界上最好的绘图体验。

我重点介绍了很好地支持Apple Pencil的一些较复杂的方面。

而且,如果您还没有,请考虑将其视为波兰语。

但是对于那些刚刚起步的人,我们希望今天让您的生活变得更加轻松。

因此,我非常高兴介绍PencilKit。

PencilKit是我们在整个操作系统中使用的框架

我们在Notes中使用它来提供低延迟的绘图和笔记

我们在Pages中使用它来标记文档。

我们在“无处不在的标记”中使用它来注释应用内容的屏幕截图和PDF 

我们将其交给了一些开发人员,Pinterest和Canvas在短短的时间内便为其应用程序添加了功能

只需三行代码即可将其添加到您的应用中

在这里,我们创建一个画布,将其添加到您的视图层次结构中,然后选择一种墨水。

这样一来,您将获得与整个操作系统相同的行业领先的低延迟

我们花了数小时来完善的出色表现墨水

以及同样出色的UI和工具面板。

使用几行代码,您可以创建更全面的内容,例如我们的示例应用程序。

现在,我想向您展示。

因此,这里有示例应用程序。这是一个小小的绘图应用程序。它有一些我之前一直在努力的缩略图

为了让您了解PencilKit可以做什么广度,我只向您展示其中一些这是一些笔记,我们可以滚动浏览这些漂亮的笔记。

这是我的朋友安迪画的一朵美丽的花

这给了我机会,也展示了PencilKit对暗模式的反应如果关闭Control Center,则可以切换到“黑暗”,在“光”下看起来很棒花朵在“黑暗”模式下看起来同样令人赞叹

当我出来时,缩略图被重新渲染,您可以看到注释只是清晰易读。

但是幸运的是,我可以做每位工程师梦dream以求的事情,而且正在逐步上演。

因此,我将切换回灯光模式,并继续绘制之前绘制的徽标。

在此处的底部,您可以看到我们很棒的新工具面板UI。而且,我可以用一根手指将其围绕屏幕拖动到舒适的地方。

现在,我将其保留在屏幕底部。为此,我将使用标尺和标记添加一些颜色。

因此,我可以点击标尺以将标尺插入。用两根手指,可以定位标尺。

我可以沿标尺绘制一条直线,但也可以使用标尺进行遮罩。

所以,我会做。

让我添加一些颜色。

我将点击“标尺”将关闭

我将在底部添加一些颜色

现在,PencilKit做的最令人兴奋的事情之一就是开始将位图和矢量,对象和像素的世界融合在一起

橡皮擦是您所看到的区域之一因此,我将使用Apple Pencil上的双击手势来更改橡皮擦。

就像那样,我已经切换了模式。

这是像素橡皮擦,可让我在周围绘制并切出该徽标的一部分。

现在,如果我点击橡皮擦,我将切换到对象橡皮擦。

使用对象橡皮擦,我可以解决这个问题,并且只删除已剪切的位。

就像那样,我使用矢量和位图操作来创建图形。让我再次向您展示。我点击 我将获得像素橡皮擦。

我要剪一个保险开关。这次,我将使用橡皮擦旁边套索工具

我可以将其移动到想要的位置,也可以点击并删除它。

现在,我已经创建了自己的艺术作品,我真的应该签名幸运的是,我们的示例应用程序具有签名功能。

然后在右上角的“签名”上,您会注意到,这样做时,工具面板消失了,我们这里有一个自定义的选择器,使我可以只用黑色或蓝色墨水。

现在,我要坚持使用黑色。

我要添加我的签名。现在我已经完成了,我将点击以签署我的图形。

那里。我认为那是个离开它的好地方我想我可以框架。

这很酷。

因此,让我们谈谈PencilKit体系结构。

您将使用的主要内容是PKCanvasView。这为您的应用程序提供了可绘制区域。

PKDrawing是数据模型。

它捕获了所有这些漂亮的笔触。

PKToolPicker提供了在屏幕上浮动的UI PKTools是提供在画布上发生的墨水和交互作用的工具

PKCanvasView是一个UI滚动视图,可让您平移和缩放。

它使您可以选择用户的方式,即通过设置工具进行用户交互并且它允许您从中获取数据模型并使用drawing属性在其上设置数据模型

PKDrawing是PencilKit的数据模型。这是macOS上可用PencilKit之一

它具有数据格式,可让您将工程图加载和存储到数据中。

您可以使用这些图形生成用于共享的图像或缩略图。

让我们看一下示例应用程序如何生成缩略图。

因为所有这些值都有值类型,所以我们可以在后台队列上安全地执行此工作。

因为我们要根据应用程序所在的位置以浅色或深色模式生成这些缩略图,所以我们可以使用UITraitCollections performAsCurrent。

我们使用绘图生成该图像。

然后,最后,我们可以将该图像重新设置在主线程上。

因此,现在我想交给Jenny,他将更多地介绍出色的工具和工具选择器以及PencilKit可以完成的伟大工作

谢谢,威尔。你好 我是Jenny,我要-继续学习PencilKit为您提供的一些出色工具,继续我们的PencilKit之旅

这些工具位于全新的工具选择器中。它是动态的。它漂浮在一切之上。我可以从一端到另一端拖动它,甚至将其停靠在底部,以真正摆脱它的干扰。

正如Will所提到的,这些工具是PKTool类型。

对于标记工具,它们是PKInkingTool类型。

您可以指定三种类型之一,笔,记号笔或铅笔。

这些工具中的每一个都是超级动态的和富有表现力的。您可以看到即使在单个笔划中,宽度和不透明度如何根据不同的铅笔属性(例如力,方位角,高度或速度)而变化。

您可以在canvasView上设置此工具以设置在画布上设置的墨水如果将canvasView设置为“工具选取器”观察者,则引擎盖下方将为您设置canvasView上的墨水。

但是,如果您具有签名窗格,并且不需要工具选择器,则可以在应用程序中自行设置

对于PKInkingTool,您可以指定类型,笔,记号笔,铅笔,颜色或宽度。

对于宽度值,每种墨水类型都有一个默认宽度。

但是,正如我们之前看到的,该宽度不是固定值,并且会根据不同的铅笔属性变化

因此,该宽度代表基于普通铅笔用户铅笔特性的基值

您还可以查询每种墨水类型的有效宽度范围

当我使用铅笔工具时,您可以在这里看到

当我更垂直地握铅笔时,铅笔笔触变细。但是,当我更水平地握住它时,笔划实际上更厚了。

当我在“工具选择器”中更改厚度时,厚度会相应缩放。

我们还有一个PKEraser工具,您可以其中指定矢量或位图,其中矢量对应于对象,而位图对应于像素。

实际上,我们非常努力地将矢量和位图的两个世界统一在一起,其中矢量是对象,而位图是像素。

我们不仅擦除了屏幕上像素,还对这些笔画进行了切片,以便您可以将它们分开或稍后将对象擦除。

我们还提供PKLasso工具供您选择

使用套索工具,将选择您相交的任何笔触然后,您可以在周围拖动,剪切,复制,粘贴它,甚至将它们拖放到其他应用程序中。

iOS 13的新功能,我们还有一个出色的标尺工具。

需要特别注意的是,标尺不是工具-PKTool。而是在画布上切换以显示或隐藏标尺的属性

您可以靠在它上面画线以绘制直线,也可以像在苹果里浇水和草一样将它遮盖住一样

现在,我们已经了解了一些出色的工具,让我们看一下PKToolPicker以及如何将其显示在屏幕上。

使用“工具选择器”要注意的重要一点是它不是视图。

相反,它是显示或隐藏视图的对象,并且与“画布视图”分开。

还需要注意的是,它浮于一切之上,并且与键盘非常相似,因为其可见性基于第一响应者。

因此,让我们来看一些代码,看看如何做到这一点。首先,我们将为窗口请求共享的“工具选择器”。

我们将添加“画布视图”作为观察者。这样,每当您在“工具选择器”中更改工具时,也将在“画布视图”上更改该工具。

工具选择器还具有响应者列表

如果您的对象成为第一响应者,并且通过将visible设置为true来避免这种情况,则将显示调色板。

如果setVisible为false,则会将其从该列表中删除,然后调色板将隐藏。

因此,当“画布视图”成为第一响应者时,我们希望显示调色板。因此,我们将visible设置为true。最后,我们将使Canvas View成为FirstResponder,以便显示调色板。

您可以在我们的示例应用程序中看到它将画布视图设置为FirstResponder之后,调色板将可见。

但是,在示例应用程序中,我们在签名窗格中也有一个案例,我们只想向您提供蓝色或黑色墨水。

而且我们不希望显示调色板。

因此,为了处理该问题,我们实际上制作了画布-签名的Canvas视图变为FirstResponder,这将使工具选择器消失。

当您关闭该Signature View Controller时,在引擎盖下,您将自动辞职第一响应者,这将使工具面板再次出现。

基于响应者的可见性,您还需要牢记的另一件事是,您的应用程序中可能已经有使用第一响应者的对象。

例如,用于编辑和新控制器。而且,您基本上希望调色板即使在“编辑”菜单打开时也能显示

为此,只需将对象的visible设置为true,以使调色板保持可见。

使用工具选择器还要考虑的另一件事常规和紧凑型类。

您会注意到,在常规尺寸类中,它漂浮在所有物体之上,可以随意移动

但是,在紧凑型类中,它实际上是固定的并停靠在底部。

那么,这在您的应用程序中意味着什么好吧,假设您有一个全尺寸的应用程序。

这张照片大部分跨接。

也许它掩盖了常规尺寸级别的某些照片

但是您可以将工具选择器移开,这样就可以了。

但是,在紧凑尺寸的类中,它实际上掩盖了这张照片中最有趣的部分

因此,在紧凑型类中,您需要做的是确保调整视图的框架或滚动视图插图,以解决“工具选取器”中模糊的框架。

您可以通过使用Observer方法toolPickerFramesObscured DidChange监听工具选择器的框架更改来完成此操作。从浮动状态移到停靠状态时,都会得到此提示

届时,您可以通过要求遮挡视图中的框架来相应地调整内容

使用工具选择器还要考虑的另一件事是您的撤消和重做按钮。

您会注意到在常规尺寸类中,撤消/重做按钮实际上是如何在调色板内部烘焙为您提供的。

但是,在紧凑尺寸类中,它们根本不在调色板中。因此,您需要确保在紧凑尺寸类中显示自己的撤消和重做按钮。

现在,我们已经遍历了如何在屏幕获得基本的Canvas View和Tool Picker的方法,让我们从一些Canvas View委托开始,逐步了解PencilKit中可以具有的更多高级行为

您可能要根据用户的绘图来更新您的应用程序

您可以通过听铅笔或着陆来实现,在这种情况下,您将获得canvasViewDidBeginUsingTool回调。

使用铅笔或修饰笔,您将获得canvasViewDidEndUsingTool回调。

但是,此时,您的图形尚未完全更新,因为如Will所述,直到获得这些最终的力值,您才获得最终的canvasViewDrawingDidChange。

仅在这一点上,您可以确保获得最终的成品图。

因此,此时,您可以从画布中查询图形并更新模型对象,生成缩略图或在必要时进行保存。

您可能还需要将图形加载到“画布视图”中。

您可以通过调用设置工程图来实现。届时,我们将开始加载图块。

但是,直到这些贴完成加载后,您才会收到canvasViewDidFinishRendering回调。

滚动或缩放后,您还将获得此回调

说到滚动,我们不仅可以让您用铅笔绘图,而且还可以让您用手指绘图

而且由于PKCanvasView是滚动视图,因此实际上只用一根手指即可绘制。

和两个手指滚动。

这可以通过“画布”视图allowFingerDrawing属性进行切换

如果将其设置为true,则用一根手指和铅笔画图,同时用两根手指滚动。现在,这是“画布视图”上的默认行为。如果这不是您想要的,则实际上可以将此属性设置为false。

在这种情况下,只有铅笔会画画,并且一根手指会滚动。

但是,您应该牢记iPhone等无法使用Pencil的环境

如果您的应用程序中存在一些更复杂的交互,我们还将为您提供drawingGestureRecognizer 

这样,您可以设置手势识别器排除项或失败要求。

WWDC 2017上有一个关于“ iOS上的现代用户交互的精彩演讲

如Will所述,我们还在所有创建部件(包括屏幕截图和标记)中使用PencilKit 

在这些情况下,您可以覆盖内容。

您也可以通过将不透明标志设置为false并将背景颜色设置为透明来轻松在应用程序中实现此目的

在iOS 13中,我们还引入了暗模式,这是一种以完全不同的方式查看内容的绝佳方式。

您的PencilKit画布看起来仍然很棒,因为颜色会动态调整以保持清晰度。您可以看到我最初是如何在白色背景上用黑色墨水写此笔记的。

但是在深色模式下,它会在黑色背景上变为白色墨水我的笔记不仅保持清晰易读,而且看起来仍然很棒。

默认情况下,如果您的画布处于黑暗模式,则它们还将动态调整其颜色。

但是,如果这不是您想要的,则可以将overrideUserInterfaceStyle设置始终为light。

如果要标记的内容没有更改(例如,在图像或PDF上标记),则尤其需要这样做现在,我们已经遍历了PencilKit,并向您展示了如何在应用程序中带来惊人的绘图体验,让我们看一下“无处不在标记”,这项新功能使您的应用程序可以传递任何要标记的内容

这已经通过Screenshots上的新API得以体现,我们可以在其中提供完整的内容,每当您在应用程序上截屏时

您可以在Safari中看到采用的方法

在这里,我有apple.com。

我将通过从角落拉入使用新的铅笔手势来截取屏幕截图因此,我拥有了我所熟悉和喜爱的屏幕截图,但看不到页面的其余部分。

因此,我将在顶部点击整个页面部分,现在我有了完整的滚动页面供我标记和共享。

是的

您还可以在我们的示例应用程序中看到此实现。再次,以新的Screenshot手势,我将点击该整页片段,现在我有整个笔记要发送。

您还可以在有趣的用例(例如地图)中看到这一点

同样,使用新的Screenshot手势,我将截屏。

但是您可以看到我的屏幕截图被chrome覆盖了。

当我点击顶部的全页部分时,我将能够看到没有任何镶边的地图我可以看到下面的道路和餐馆。

您只需几行代码就可以在应用程序中轻松采用此功能

首先,将自己设置为UIWindowScene上的UIScreenshotService的委托

UIWindowScene是今年UIKit的新API 您可以参考“在iPad上引入多个Windows”演讲来了解更多信息

将自己设置为代表后,您将作为完整内容交付以PDF数据表示

您可能已经为共享或打印之操作生成了信息但是,如果您不这样做,WWDC 2017上有一个很棒的演讲,内容为“ iOS上的PDFKit简介”。

因此,一旦有了该PDF数据,就将实现委托方法screenshotService,并生成PDFRepresentation WithCompletion。您将在完成处理程序中将该PDF数据以及其他两个元数据传递给我们

这将帮助我们确保当您从屏幕转到整页时,我们可以顺利进行无缝过渡。

元数据的第一部分是indexOfCurrentPage。这在诸如Keynote之类的情况下很有用

假设我拍摄了幻灯片7的屏幕截图当我切换到全页部分时,它将自动跳到第七页。

元数据的第二部分是rectInCurrentPage。

这对于Safari这样的情况很有用在这里,我有一个长长的滚动页面。我将滚动到底部,因为我对新的iPad Pro感到非常兴奋

因此,我将在屏幕底部截屏现在,当我点击顶部的整个页面部分时,实际上并没有带我跳到顶部,而是将我带到了同一页面,即我截取屏幕截图时所用的RECT 

关于此RECT需要注意的一件事是我们期望它在PDF坐标中。

那么,这意味着什么呢?在“视图坐标”中,原点实际上是左上角。

但是,在PDF坐标中,它实际上位于左下角。因此,您需要确保进行适当的坐标转换,并在适当的坐标空间中将RECT发送给我们

因此,我们向您展示了如何使用现有的Pencil API如何构建自己强大的自定义绘图引擎。

但它需要一点肘油脂。您需要快速且异步渲染的同时聆听估计的触摸,延迟的力度。

但是现在,借助新的PencilKit API,我们可以非常轻松地将绘图集成到您的应用程序中。您将获得我们在所有iOS上相同的低延迟体验。

最后,您还可以在UIKit中采用其他出色的Pencil API,例如UIPencil交互,以在新的Apple Pencil上处理双击

或新的UIScreenshotService API,以便您可以提供完整的内容以在任何地方进行标记

有关更多信息,您可以在此会话中引用URL 

现在,开始构建一些惊人的很棒的Pencil应用程序。我们希望您有一个很棒的WWDC 2019。

原文地址:https://www.cnblogs.com/strengthen/p/14088647.html