用法UIView与CAShapeLayer(绘图,动画,用户交互)

时间:2017-10-04 08:45:04

标签: ios uikit core-animation

我有一个非常基本的问题:当你想绘制形状时,你如何选择使用UIViewCAShapeLayer(我不是在谈论textfields,{{1}或其他控件,只是绘图)?

我的理解是switches(作为UIView的一部分)使用正常的UIKit来绘制其内容。如果这是正确的,那么CALayer(或一般CAShapeLayer)将是完全相同的事情,只有CALayer给你的额外内容。

然后,何时使用UIKit有意义,何时使用UIView有意义?

CAShapeLayer更快吗? CAShapeLayer是否更适合手势识别或用户交互?

为了给你更多的背景,这就是我在这个问题出现时试图做的事情:

Illustration

我希望这些红色圆圈围绕中心圆旋转。但是,用户应该能够在旋转时点击红色圆圈。

在这里,我看到两个主要选项(可能还有更多)添加其中一个红色圆圈:

  1. 创建UIKit,操纵其图层的cornerRadius并使用UIView旋转它。
  2. 使用CGAffineTransform创建CAShapeLayer。我可以使用UIBezierPath
  3. 旋转它

    我唯一的问题是CATransform3D。由于它不断移动(旋转),我必须访问正确的框架。我可以使用user interaction(我认为presentation layer也在幕后使用)。

    此时,我不确定是使用UIView还是UIView。此外,我不确定在这种情况下以这种方式制作动画是否正确。可能有更好的选择也会消除有关使用哪一个的问题。

    感谢您对此的看法。

1 个答案:

答案 0 :(得分:1)

引用Apple的文档

  

图层不是您应用视图的替代品 - 也就是说,您不能   创建一个仅基于图层对象的可视化界面。图层   为您的观点提供基础设施。具体来说,层是这样的   绘制和动画视图内容更容易,更有效   这样做时保持高帧率。但是,有很多   层不做的事情。图层不处理事件,绘制   内容,参与响应者链,或做许多其他事情。   因此,每个应用程序仍必须具有一个或多个要处理的视图   那些互动。

     

在iOS中,每个视图都由相应的图层对象支持,但在操作系统中   X你必须决定哪些视图应该有图层。在OS X v10.8和   之后,为所有视图添加图层可能是有意义的。   但是,您不需要这样做,仍然可以禁用图层   开销没有根据和不需要的情况。层做   增加你的应用程序的内存开销,但往往会带来好处   超过劣势,所以最好测试一下   在禁用图层支持之前,应用程序的性能。

     

为视图启用图层支持时,可以创建引用的内容   作为图层支持的视图。在图层支持的视图中,系统是   负责创建底层图层对象并保持   该图层与视图同步。所有iOS视图都是图层支持的   OS X中的大多数视图也是如此。但是,在OS X中,您也可以创建   图层托管视图,是您提供图层的视图   反对自己。对于图层托管视图,AppKit可以轻松完成   管理图层的方法,不会修改它以响应   查看更改。

阅读:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreAnimation_guide/CoreAnimationBasics/CoreAnimationBasics.html#//apple_ref/doc/uid/TP40004514-CH2-SW3

现在是一些QNA的时间

问题1:

  

我的理解是UIView(作为UIKit的一部分)使用法线   引擎盖下的CALayer绘制其内容。如果这是正确的,那么   CAShapeLayer(或一般的CALayer)将完全相同,   只有没有额外的UIKit给你

再次引用Apple doc

  

默认情况下,图层支持的视图会创建CALayer类的实例,   在大多数情况下,您可能不需要不同类型的图层对象。   但是,Core Animation提供了不同的图层类   它提供了您可能会觉得有用的专业功能。   选择不同的图层类可能会使您改进   以简单的方式表现或支持特定类型的内容

显然,当您尝试使用CAShapeLayer绘制各种形状时,与CALayer相比,在性能方面是有益的。

问题2

  

CAShapeLayer更快吗? UIKit是否针对手势进行了更优化   一般的认可或用户互动?

显然,图层不处理事件,绘制内容,参与响应者链或执行许多其他操作。因此,无论是CALayer还是CAShapeLayer

,这一层都无法识别用户交互

问题3

  

此时,我不确定是否使用UIViews或CAShapeLayers

正如您在问题中指出的那样,您希望红色圆圈的用户交互,因为我们现在意识到CAShapeLayer / CALayer不会响应用户交互的事实,很明显您必须使用UIView而不是图层。< / p>