2017-10-04 164 views
0

我有一个非常基本的问题:如何做的时候,你想画的形状(我不是在谈论textfieldsswitches或其他使用UIViewCAShapeLayer之间你选择控制,只是绘图)?使用的UIView主场迎战CAShapeLayer(绘画,动画,用户交互)

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

那么,什么时候使用UIView有意义,何时使用CAShapeLayer有意义?

CAShapeLayer更快?一般情况下,UIKit更适合手势识别或用户交互?


给你更多的上下文,这里就是我一直试图做的时候这个问题上来:

Illustration

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

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

  1. 创建UIView,操纵其层的cornerRadius和使用CGAffineTransform旋转。使用UIBezierPath创建CAShapeLayer。我可以旋转它使用CATransform3D

我唯一的问题在这里是user interaction。由于它不断移动(旋转),我必须访问正确的框架。我可以使用presentation layer(我认为UIView也在引擎盖下使用)。

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

感谢您对此的看法。

回答

1

从苹果的doc报价

层不会对您的应用程序的意见,也就是说,你不能 创建单独的层对象基于可视化界面的替代品。图层 为您的观点提供基础设施。具体来说,图层使得它更容易和更高效地绘制和动画化视图 的内容,并在此过程中保持高帧率。但是,有很多层不能做的事情。图层不处理事件,绘制 内容,参与响应者链或做许多其他事情。 因此,每个应用程序都必须有一个或多个视图来处理这些交互。

在iOS中,每个视图都由相应的图层对象支持,但是在OS中,您必须决定哪些视图应该具有图层。在之后的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的给你

群众演员再次引述苹果文档

层支持的观点创建默认情况下为CALayer类的实例, ,在大多数情况下,您可能不需要不同类型的图层对象。 但是,Core Animation提供了不同的图层类别,每个图层类别都有 ,它们提供了您可能会觉得有用的专用功能。 选择不同的层类可能帮助您提高 性能或支持特定类型的内容以简单的方式

很显然,当你尝试绘制各种形状使用相比CALayerCAShapeLayer在性能方面是有益的。

问题2

是CAShapeLayer更快吗? UIKit是否对手势 识别或用户交互进行了更加优化?

显然,图层不处理事件,绘制内容,参与响应者链或做很多其他事情。所以,没有层的能够识别用户交互无论它的CALayer或CAShapeLayer

问题3

在这一点上,我不知道是否使用UIViews或CAShapeLayers

正如你在你的问题中指定的那样你需要红圈的用户交互,并且因为我们现在已经意识到CAShapeLayer/CALayer不会响应用户交互的事实,所以很清楚你必须使用UIView而不是图层。

+0

是的,我读过。 “(...)出于这个原因,每个应用程序必须仍然有一个或多个视图来处理这些类型的交互(...)”。如果他们的意思是,这些图层一般应该嵌入到'UIView'中,这意味着'CAShapeLayers'在我的情况下是最好的(因为嵌入的'UIView'可以处理交互)。如果它们的意思是,每个图层都需要它自己的视图(=使用一个由图层支持的'UIView'),我应该使用'UIView's。我不确定这一点。我的意思是,我确实有一个'UIView',我在这里做了所有这些,我只是不知道我应该使用'subviews'还是'sublayers' – Quantm

+0

@quantm:iOS中的每个View都有层次支持。默认情况下,你的视图带有一个CALayer,你无法替换现有的CALayer,无论你添加的图层是哪个子图层,那么你可以使用CAShapeLayer并将它作为子图层添加到视图的图层中。你不能使用没有视图的简单图层,因为你希望用户与圈子交互 –

+0

如果没有用户交互的简单动画,那么你可以使用CALayers并将它们添加到viewController的视图,并应用各种CoreAnimation API来动画,但因为你需要点击每个圈子你需要为每个圆圈创建视图,并为每个视图添加CAShapeLayer作为子图层,然后将圆视图添加为子视图到ViewController视图 –