【问题标题】:Why is my draw method not called in a subclassed MTKView?为什么我的绘图方法没有在子类 MTKView 中调用?
【发布时间】:2017-12-24 13:38:06
【问题描述】:

我正在尝试绘制从MTKView 子类化的视图,但未调用绘制方法。

@interface GameViewController : MTKView
@end

@implementation GameViewController
{
   ...
}

- (BOOL)acceptsFirstResponder
{
    return YES;
}

- (void)drawRect:(CGRect)rect
{
    NSLog(@"drawRect\n");
}

- (void)draw:(CGRect)rect
{
    NSLog(@"draw\n");
}

没有调用记录的方法。为什么?

根据documentation,我应该使用委托或子类MTKView。我选择子类化是因为我的理解是我可以使用键盘输入,这是我想要的。

【问题讨论】:

  • 您确定要将类的实例实例化为视图吗?它是否已添加到正在显示的窗口中?另外两件事:1)-drawRect:rect 参数的类型是NSRect,而不是CGRect,在macOS 上。 2)MTKView-draw方法不带参数。您的 -draw: 方法不相关,不会被框架调用。
  • @KenThomases 谢谢。修复2)解决了这个问题。如果您将其发布为答案,我可以接受。

标签: objective-c macos metal


【解决方案1】:

您已经实现了-draw: 方法。这不是覆盖MTKView 的任何方法。 MTKView 有一个不带参数的 -draw 方法。如果您打算覆盖该方法,则需要更改方法的签名。

也就是说,覆盖-draw 以记录消息然后调用超类实现是合理的,但您不应该覆盖它来进行实际绘图。为此,应覆盖 -drawRect: 方法。我不知道为什么没有调用您对该方法的覆盖(尽管您确实弄错了参数类型)。

【讨论】:

    猜你喜欢
    • 2014-04-08
    • 2015-08-01
    • 2018-08-22
    • 1970-01-01
    • 2016-05-08
    • 2014-10-13
    • 1970-01-01
    • 2017-12-07
    • 2019-07-03
    相关资源
    最近更新 更多