编辑代码

UIkit学习
在 iOS 中,所有到屏幕上的绘制(无论它是否涉及 OpenGL、Quartz、UIKit 还是 Core Animation)都发生在 UIView 类的实例或其子类的范围内。


UIView 类
定义: 一个管理屏幕上矩形区域内容的对象。
UIView class defines the behaviors that are common to all views.
UIView 类是一个具体类,您可以实例化它并使用它来显示固定的背景色。
您还可以子类化它以绘制更复杂的内容。
可嵌套,每个subview只有一个superview
subview可彼此覆盖,可通过方法调整Z顺序。

功能一、 Drawing and animation 绘图和动画
    views使用 UIKit 或 Core Graphics 在其矩形区域中绘制内容。
    You can animate some view properties to new values.
功能二、 Layout and subview management布局和子视图管理
    视图可以包含零个或多个子视图。
    views可以调整其子视图的大小和位置。
    自动布局
功能三、 Event handling 事件处理
    A view is a subclass of UIResponder and can respond to touches and other types of events.
    视图可以安装手势识别器来处理常见手势。

Normally, you create views in your storyboards by dragging them from the library to your canvas. 
You can also create views programmatically. 

UIView 类的以下属性是可动画的:提到一个叫UIViewPropertyAnimator的类。
frame
bounds
center
transform
alpha
backgroundColor

提到了尽量不要子类化和覆盖方法。

swipe 是不适合的。一、 它用于水平或者竖直方向;二、 在手势成功结束后才会调用操作方法,即只用于动作结束后。

arc指正圆的片段,curve指不规则的曲线,尤其是Bezier 方法绘制的曲线。 鹅,我可能不需要复杂的后者。
还有一种叫二次贝塞尔曲线quadratic Bézier curve, 不同于curve,它只需要一个控制点。

以下每一个都是单独的文档,越学越多,感觉找不到方向和重心。 
指导原理,可能更容易明白内容,找到方向;但是,弄懂所有原理,时间上、 心理承受上、 的问题不得不加以考虑。
原理的作用存疑
(链接均已删除,原理不如例子来得实在)

对于自定义视图,必须覆盖 drawRect方法并在其中执行所有绘图操作。

作为此配置的一部分,底层 UIView 类为当前绘图环境创建一个图形上下文( CGContextRef 不透明类型)。

Quartz 是 iOS 中原生绘图技术的总称。Core Graphics 框架是 Quartz 的核心,是用于绘制内容的主要界面。
(Core Graphics,也称为 Quartz 2D,是一种先进的二维绘图引擎,可用于 iOS、tvOS 和 macOS 应用程序开发。 Quartz 2D 提供低级、轻量级的 2D 渲染)
Core Graphics 框架包括用于创建图案、 渐变和阴影的附加功能。您可以使用这些类型创建非单色颜色,并使用它们来填充您创建的路径
创建和使用图案、渐变和阴影的详细信息都在 Quartz 2D 编程指南中介绍。
https://developer.apple.com/library/archive/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP30001066

此框架提供了用于操作以下内容的数据类型和函数:
Graphics contexts 图形上下文
Paths 路径
Images and bitmaps 图像和位图
Transparency layers 透明度图层
Colors, pattern colors, and color spaces  颜色、 图案颜色和色彩空间
Gradients and shadings 渐变和底纹
Fonts 字体
PDF content PDF 内容

UIKit 基于 Quartz 的基本功能构建,为图形相关操作提供了一组专用的类。UIKit 图形类并非旨在作为一组全面的绘图工具,Core Graphics 已经提供了这些工具。相反,它们为其他 UIKit 类提供绘制支持。UIKit 支持包括以下类和函数:
UIImage, which implements an immutable class for displaying images  它实现了一个用于显示图像的不可变类
UIColor, which provides basic support for device colors  它为设备颜色提供基本支持
UIFont, which provides font information for classes that need it  它为需要它的类提供字体信息
UIScreen, which provides basic information about the screen  它提供有关屏幕的基本信息
UIBezierPath, which enables your app to draw lines, arcs, ovals, and other shapes. 它使您的应用程序能够绘制线条、弧线、椭圆形和其他形状。
Functions for generating a JPEG or PNG representation of a UIImage object   用于生成 UIImage 对象的 JPEG 或 PNG 表示的函数
Functions for drawing to a bitmap graphics context  用于绘制到位图图形上下文的函数
Functions for generating PDF data by drawing to a PDF graphics context 通过绘制到 PDF 图形上下文生成 PDF 数据的函数
Functions for drawing rectangles and clipping the drawing area  用于绘制矩形和剪切绘图区域的函数
Functions for changing and getting the current graphics context  用于更改和获取当前图形上下文的函数

调用您的 drawRect: 方法后,视图将自身标记为已更新,并等待新操作到达并触发另一个更新周期。
为此,请调用 setNeedsDisplay or setNeedsDisplayInRect: 方法以触发更新。
重要提示:请勿自行调用视图 drawRect: 的方法。在屏幕重绘期间,该方法只能由 iOS 中内置的代码调用。在其他时候,不存在图形上下文,因此无法进行绘制。

在 iOS 中创建路径时,建议您使用 UIBezierPath 代替CGPath 函数,除非您需要一些只有 Core Graphics 提供的功能,例如向路径添加省略号。

构建和使用路径对象的过程是独立的(separate)。 且UIkit和Core Graphics的坐标系统是不一样,
要防止在其一创建在另一绘制的与预期的不同。

构建路径的步骤:
1.创建 path 对象。
2.设置 UIBezierPath 对象的任何相关绘制属性,例如描边路径的 lineWidth or lineJoinStyle 属性或 usesEvenOddFillRule 填充路径的属性。这些绘制属性适用于整个路径。
3.使用 moveToPoint: 该方法设置初始段的起点。
4.添加直线段和曲线段以定义子路径。
5.(可选)通过调用 closePath 来关闭子路径,这将从最后一段的末尾到第一段的开头绘制一条直线段。
6.(可选)重复步骤 345 以定义其他子路径。

要绘制 path 对象,请使用 stroke and fill 方法。 这些方法在当前图形上下文中渲染路径的直线段和曲线段。
渲染过程包括使用 path 对象的属性栅格化直线段和曲线段。 栅格化过程不会修改路径对象本身。
因此,您可以在当前上下文或其他上下文中多次呈现同一 path 对象。

(Core Animation 是一个 Objective-C 框架,它为快速轻松地创建流畅的实时动画提供了基础设施。)
Core Animation 中的关键技术是图层对象。 图层是轻量级对象,在性质上类似于视图,但实际上是模型对象,用于封装要显示的内容的几何图形、 计时和视觉属性。
在大多数情况下,您可以毫不费力地获得 Core Animation 的好处。例如,可以将 UIView 类的多个属性(包括视图的 frame、center、color 和 opacity 等)配置为在其值更改时触发动画。
您必须做一些工作,让 UIKit 知道您希望执行这些动画,但动画本身是自动为您创建和运行的。
当您超越基本动画时,您必须更直接地与 Core Animation 类和方法交互。

感觉自己这几天一直在学理论,陷入理论恐慌中,其实自己并没有细看,也没有详细了解,就像心理安慰一样过一遍。

冥冥之中有个声音告诉自己,有点备大于实了,即:你学超过了你实际要用到的内容,多花了成本。

不用导入第三方框架,已敲示例验证,UIkit原生就有2D物理(重力、 碰撞、 弹性等等)
https://www.kodeco.com/2326-uikit-dynamics-tutorial-getting-started

脑袋里面突然闪过一个念头,既然我需要的功能没有现成的或者内置的,那么我何不extend View呢? 比如在View的现有功能
上增加自己的 hitTest,以及裂开为两个View的功能。

哪怕能提取到每个View的轮廓或shape, 把它们放在一个数组里面,不断的和手指的location对比,当屏幕上的View非常多
时,这会导致越来越慢,不知道这在IOS上会不会明显。(两种思路,一种是整个屏幕来通盘考虑,另一个是每个View自己考虑
自己的,这里是第一种,上一段是第二种)

我是不是想复杂了,已经想到了一次性划过多个圆。

如果有个知识在内外网都搜不到,那还有一种可能,那就是:这个东西已经有了官方的明确定义了。(没有人拿已经很明确的东西再去无脑的问)

分成两个视图之后,让每个视图也能接受gesture?
可接受,但是接受之后,比如点击后做什么动作?

一个拼图游戏,它在foreach循环里面
ImageTileView(piece: tiles[index])
    .onTapGesture {handleTap(index)}

ask yourself,还可以简化到前面哪一步?比如在实现滑动(滑过)事件的时候,想一想,比滑动更简单的事件是什么?
哦,于是就可以先实现更简单的Tap。
这样,测验的重心就变成了view的分裂了,即:点一下就分裂
这么浅显,应该听得懂了吧