gpt4 book ai didi

iphone - 如何从 UIView 或 UIWindow 获取 CGContextRef 以调试外部绘制方法?

转载 作者:行者123 更新时间:2023-12-03 18:39:42 25 4
gpt4 key购买 nike

[这是我在这里发表的第一篇文章(但我已经浏览了很多次答案;感谢大家提供了一个非常有用的网站)。如果我在这篇文章中犯下了任何重大罪过,请原谅我并指出我正确的方向。]

我正在尝试在我的 iPhone 应用程序中调试一些复杂的启动代码;我确实需要画一些图像来使调试更有洞察力,并从根本上减少调试的乏味。

我需要绘制的状态并不真正作为模型对象存在;它在初始化期间有些短暂。我特别希望能够一次绘制一点状态,而不是在一张大图像中绘制所有状态(以帮助我查看哪些组件是正确/错误的)。就我而言,有很多可能重叠的内容,并且单个图像无法轻松、清晰地显示正在发生的事情。

如果我添加特殊的 Debug模式以及用于导航/突出显示/绘制组件的附加控件,则可能可以创建使用普通绘图架构绘制到屏幕的静态 View ,但这将需要大量不自然的脚手架,在我看来,这不是调试我的问题的正确方法。

所以,我希望做的是:

  1. 获取或创建适当的 CGContextRef
  2. 画进去
  3. 立即将其刷新到屏幕
  4. 等待用户的一些输入,不涉及 UIEvents
  5. 重复1-4多次

第 4 项似乎几乎不可能(有没有办法让简单的 C 或 C++ 控制台 I/O 在 iPhone 或 iPhone 模拟器中工作?),所以我现在放弃了;我将满足于仅使用 Xcode 调试器在绘图操作之间停止。

但更有趣的是如何在 UIView 绘制方法之外获取 CGContextRef,以在其中绘制调试输出。缓存以前有效的上下文,即使在我的情况下是可能的(不可能,因为我在应用程序启动时进行调试),似乎不起作用。似乎可以为每个绘图操作重新创建上下文,这让我觉得会产生大量开销;我会假设保存了一个 UIWindow,也许还有一个 UIView,并且可以提供对适当绘图上下文的引用。看来我一定是错的(但如果不是,我如何从 View 或窗口获取上下文?我没有找到这方面的方法)。

那么,如果我必须创建绘图上下文,我该怎么做?我想我真的不太明白上下文到底绑定(bind)在一起的是什么:它在多大程度上了解并绑定(bind)到某些特定的显示输出设备?如何控制上下文映射到屏幕的哪一部分?创建上下文的方法似乎很少,而且它们似乎不提供这样的控制。 UIGraphicsBeginImageContext 似乎是唯一可能对我有帮助的例程,而且我不知道如何创建和绘制到一个例程中,仅生成一个 CGImage 结果将是有用的;我如何将生成的图像显示到屏幕上?

如果我发现自己对一些与 CG 上下文相关的基本内容感到困惑,我不会感到惊讶。希望这个问题不是那么基本和明显,以至于我会惹恼每个阅读它的人,但如果我完全错过了正确的文档,我将非常感谢一些指示。

感谢您的精神支持和任何帮助。 -jar

最佳答案

您是正确的,因为您无法直接在屏幕上绘制。话虽这么说,如果您调用[view setNeedsDisplay],则可以指示 UIView 随意刷新。如果您覆盖 - (void)drawRect:(CGRect)rect,则刷新时将调用此方法。我对您的问题的建议是子类化 UIView,在此类上公开您的调试状态,并在更新状态时强制刷新。如果您要频繁更新状态,则应使用 CADisplayLink 将 View 刷新与显示刷新联系起来。如果在 View 重绘之前多次调用[view setNeedsDisplay],那也没关系。

例如:

#import "QuartzTestView.h"
#import <QuartzCore/QuartzCore.h>

@interface QuartzTestView()

- (void)refreshView:(CADisplayLink*)displayLink;

@end


@implementation QuartzTestView

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(drawView:)];
[displayLink setFrameInterval:1];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
return self;
}

- (void)refreshView:(CADisplayLink*)displayLink {
[self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
// do updates

}

@end

注意:您必须添加 QuartzCore.framework 才能运行此

关于iphone - 如何从 UIView 或 UIWindow 获取 CGContextRef 以调试外部绘制方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3202777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com