我有一个非常基本的问题:当你想绘制形状时,你如何选择使用UIView
和CAShapeLayer
(我不是在谈论textfields
,{{1}或其他控件,只是绘图)?
我的理解是switches
(作为UIView
的一部分)使用正常的UIKit
来绘制其内容。如果这是正确的,那么CALayer
(或一般CAShapeLayer
)将是完全相同的事情,只有CALayer
给你的额外内容。
然后,何时使用UIKit
有意义,何时使用UIView
有意义?
CAShapeLayer
更快吗? CAShapeLayer
是否更适合手势识别或用户交互?
为了给你更多的背景,这就是我在这个问题出现时试图做的事情:
我希望这些红色圆圈围绕中心圆旋转。但是,用户应该能够在旋转时点击红色圆圈。
在这里,我看到两个主要选项(可能还有更多)添加其中一个红色圆圈:
UIKit
,操纵其图层的cornerRadius并使用UIView
旋转它。 CGAffineTransform
创建CAShapeLayer
。我可以使用UIBezierPath
我唯一的问题是CATransform3D
。由于它不断移动(旋转),我必须访问正确的框架。我可以使用user interaction
(我认为presentation layer
也在幕后使用)。
此时,我不确定是使用UIView
还是UIView
。此外,我不确定在这种情况下以这种方式制作动画是否正确。可能有更好的选择也会消除有关使用哪一个的问题。
感谢您对此的看法。
答案 0 :(得分:1)
引用Apple的文档
图层不是您应用视图的替代品 - 也就是说,您不能 创建一个仅基于图层对象的可视化界面。图层 为您的观点提供基础设施。具体来说,层是这样的 绘制和动画视图内容更容易,更有效 这样做时保持高帧率。但是,有很多 层不做的事情。图层不处理事件,绘制 内容,参与响应者链,或做许多其他事情。 因此,每个应用程序仍必须具有一个或多个要处理的视图 那些互动。
在iOS中,每个视图都由相应的图层对象支持,但在操作系统中 X你必须决定哪些视图应该有图层。在OS X v10.8和 之后,为所有视图添加图层可能是有意义的。 但是,您不需要这样做,仍然可以禁用图层 开销没有根据和不需要的情况。层做 增加你的应用程序的内存开销,但往往会带来好处 超过劣势,所以最好测试一下 在禁用图层支持之前,应用程序的性能。
为视图启用图层支持时,可以创建引用的内容 作为图层支持的视图。在图层支持的视图中,系统是 负责创建底层图层对象并保持 该图层与视图同步。所有iOS视图都是图层支持的 OS X中的大多数视图也是如此。但是,在OS X中,您也可以创建 图层托管视图,是您提供图层的视图 反对自己。对于图层托管视图,AppKit可以轻松完成 管理图层的方法,不会修改它以响应 查看更改。
现在是一些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>