【问题标题】:Can a CAShapeLayer be passed to CGContextDrawLayerAtPoint?可以将 CAShapeLayer 传递给 CGContextDrawLayerAtPoint 吗?
【发布时间】:2014-06-08 19:13:40
【问题描述】:

我有一个 CAShapeLayer,并试图通过将其传递给 CGContextDrawLayerAtPoint 来绘制它,但在将 CAShapeLayer *__strong 的可保留参数传递给需要 CGLayerRef 的函数时出错。

我进行了一些浏览,但不知道如何将它转换/桥接 CAShapeLayer 到 CGLayerRef。

如果不能转换,那么可以使用 CGLayerCreateWithContext 创建 CAShapeLayer 吗?

我正在做的是用 UIBezierPath 创建一个绘图,然后创建一个 CAShapeLayer 并将其路径设置为 UIBezierPath,然后我想显示它。我可以使用 addSublayer 来显示形状图层,但是我将在多个不同的点显示相同的形状,因此我计划使用 CGContextDrawLayerAtPoint 在不同的点显示它而不是添加多个子图层。

【问题讨论】:

    标签: ios calayer uibezierpath


    【解决方案1】:

    简答:不。

    长答案: CAShapeLayer 是一个核心动画层(CALayer)。你把它放到你的界面里,它就会自己画出来。

    我知道他们使用“层”一词的方式令人困惑,但CGContextDrawLayerAtPoint 与此无关(它以完全不同的方式使用“层”一词,指的是 CGLayer,它完全是不同并且使用方式完全不同)。你在这里走错了兔子洞。

    我可以使用addSublayer:来显示形状层

    不可能。必须。这就是您使用 CAShapeLayer 所做的事情。

    您正在寻找的替代方法是将 CGPath 拉出 CAShapeLayer 并分配该路径并在 CGContext 中的多个位置多次对其进行描边。但实际上没有必要这样做。 iOS 绘图都是关于图层的;不要害怕有多个子层。

    【讨论】:

    • 在这里查看我的“指南针”示例,其中一个复杂的绘图由许多子层组成。别担心。要开心。 apeth.com/iOSBook/ch16.html
    • 谢谢,是的,我对 layer 一词的双重含义感到困惑(我没有注意到 CA 与 CG 部分)。那么拥有几十个子层在很大程度上不是低效的吗?
    • 不要画它们。现在,你开始动画/滚动它们,这可能是个问题。但是让它们只显示在屏幕上——没问题,这就是屏幕的,它是一个层的渲染树。 你在 iOS 屏幕上看到的所有东西都是一层。
    猜你喜欢
    • 2020-02-18
    • 2021-06-11
    • 2017-09-17
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2011-07-17
    • 2017-10-09
    相关资源
    最近更新 更多