【问题标题】:Can I pass the CGContextRef to methods called from drawRect?我可以将 CGContextRef 传递给从 drawRect 调用的方法吗?
【发布时间】:2013-04-09 16:43:07
【问题描述】:

我在 Quartz 2D 编程指南中找到了这个:

要在 iOS 应用程序中绘制到屏幕上,您需要设置一个 UIView 对象并实现它的 drawRect: 方法来执行绘制。当视图在屏幕上可见并且其内容需要更新时,将调用视图的 drawRect: 方法。在调用您的自定义 drawRect: 方法之前,视图对象会自动配置其绘图环境,以便您的代码可以立即开始绘图。作为此配置的一部分,UIView 对象为当前绘图环境创建图形上下文(CGContextRef 不透明类型)。您可以通过调用 UIKit 函数 UIGraphicsGetCurrentContext 在 drawRect: 方法中获取此图形上下文。

由于我遇到了无效上下文的问题(因为当我返回重新绘制时它是 0x00),我想知道是否可以在 -drawRect 的开头获取当前上下文,并且不知何故将它传递给我从 -drawRect 中调用的方法?

【问题讨论】:

  • 我也在下面回答,但只是想检查一下:你不是直接打电话给drawRect,对吧? UIKit 仅在需要时调用它。如果你想更新你的视图,你应该打电话给setNeedsDisplay

标签: ios objective-c uigraphicscontext


【解决方案1】:

您绝对可以将CGContextRef 传递给从drawRect: 调用的方法,只要这些方法不保存引用以供在drawRect: 调用期间之外使用,您的代码应该没问题。但是,您传递的上下文引用将等同于通过UIGraphicsGetCurrentContext 检索到的上下文,因此我怀疑通过添加额外的参数可以获得很多好处。

【讨论】:

  • 嘿伙计们...这不是正在发生的事情...文档状态:您可以通过调用 UIKit 函数 UIGraphicsGetCurrentContext 在 drawRect: 方法中获取此图形上下文。 我正在从被调用的方法调用 UIGraphicsGetCurrentContext 并且它返回 0x00 (请参阅我上面的问题)......我在这里得到了三个不同的答案;我想最好的办法就是这样做,然后看看……我会回复大家的。
  • @spokane-dude 你可能想分享一些代码,你从drawRect: 调用某些东西并为你的NULL 获取UIGraphicsGetCurrentContext 然后:可能存在很多不同的问题,包括错误地检查/打印上下文引用。
  • 对于初学者,您可以从 -drawRect 中调用方法并传递一个被认为有效的上下文。但是,如果我在调用其他方法之前在drawRect中获取当前上下文,它似乎可以工作......需要更多测试,但我想我发现了问题:在drawRect的开头调用UIGraphicsGetCurrentContext!谢谢大家!
  • 多么糟糕,因为下一个答案是完全正确的;显然,您必须从 -drawRect 中调用 UIGraphicsGetCurrentContext 以使被调用的方法起作用,但是您不能传递上下文——它在运行时被标记为无效。你们想让我做什么?
  • @spokane-dude 我强烈怀疑您的发现的普遍性:我毫不怀疑您所描述的内容在您的具体情况下是正确的,但我也确信我的代码在在drawRect 的中间,以及从drawRect 调用的其他方法中,没有丝毫问题的痕迹。此外,another question 讨论了获取图形上下文与传递它的相对性能,这意味着这两种方法都可以正常工作。如果您发布了一些代码,我们可以查找其中可能存在的问题。
【解决方案2】:

UIGraphicsGetCurrentContext 只能从 drawRect: 方法(或从它调用的方法)中调用,否则它将返回 nil。

【讨论】:

    【解决方案3】:

    您可以从-drawRect 调用的任何方法中使用UIGraphicsGetCurrentContext。值得注意的是,当需要更新视图时,不要直接调用-drawRect;请致电-setNeedsDisplay

    如果你想使用 UIKit 绘图系统和你自己的离屏上下文,你可以使用UIGraphicsPushContext 来设置当前上下文。

    【讨论】:

      【解决方案4】:

      根据我的经验,传递CGContextRef 会产生相当“快”的内存泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-09
        • 2020-10-27
        • 1970-01-01
        • 2019-02-14
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多