drawRect 没有被调用用于使用 NSView 进行图层支持的绘图

用户007

我正在尝试将我的 Opengl 应用程序迁移到 Metal,并且我正在使用CAMetalLayerMetal 实现。我在继承的NSView类对象上设置了以下属性

self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize;
[self setWantsLayer:YES];

我已经检查了其他答案,比如NSView 子类 - drawRect: not called

所以,我尝试按照上面的答案中的建议分配代表,就像这样

[self.layer setDelegate:self];

我收到以下编译错误:

Cannot initialize a parameter of type 'id<CALayerDelegate> _Nullable' with an lvalue of type 'MyNSView *'

此外,我还在https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreAnimation_guide/SettingUpLayerObjects/SettingUpLayerObjects.html 上看到了设置图层对象的文档,其中指出:

对于具有自定义内容的图层支持视图,您应该继续覆盖视图的方法来进行绘图。层支持的视图会自动使自己成为其层的委托并实现所需的委托方法,您不应更改该配置。相反,您应该实现视图的 drawRect: 方法来绘制您的内容。

因此,据此,我什至不必在我的情况下设置委托,而且我已经drawRectMyNSView. 仍然没有被调用。

还有什么需要做的吗?

谢谢!

编辑:所以,我通过让我的层遵循协议来修复编译错误CALayerDelegate,但我仍然没有收到任何对drawLayer或 的调用drawRect

制作支持层

- (CALayer*)makeBackingLayer
{
    id <MTLDevice> device = MTLCreateSystemDefaultDevice();
    CAMetalLayer *backingLayer   = [CAMetalLayer layer];
    backingLayer.opaque          = YES;
    backingLayer.device          = device;
    backingLayer.pixelFormat     = MTLPixelFormatBGRA8Unorm;
    backingLayer.framebufferOnly = YES;

//    [backingLayer setDelegate:self]; //Tried setting the delegate 
                                       //here as well

    return backingLayer;
}

初始化函数

self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize;
[self setWantsLayer:YES];
[self.layer setDelegate:self];

绘制函数

- (void)displayLayer:(CALayer *)layer
{
    [self drawRect:self.bounds];
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    [self drawRect:self.bounds];
}

-(void) drawRect: (NSRect) dirtyRect
{
    [super drawRect:dirtyRect];
}

我已经实现了所有的绘制函数来检查它们中是否有任何一个被击中,但我没有收到任何这些函数的调用。

为了将内容绘制到 NSView,我绘制到屏幕外资源并drawable从 NSView 的 CALayer获取presentDrawable在提交commandBuffer.

用户007

由于这里没有太多我可以调试以找到引入错误的位置,因此我开始尝试执行指令的顺序。事实证明,您调用的顺序是:

[self setWantsLayer:YES];
self.layerContentsRedrawPolicy = NSViewLayerContentsRedrawDuringViewResize;

导致了这个问题。在交换这两个语句时,我开始接收对我的displayLayer函数的调用我仍然无法弄清楚为什么drawRect没有调用层支持的 NSView。

发布这个以防万一这种交换也解决了其他人的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

drawRect:不要求使用CAMetalLayer的NSView

来自分类Dev

drawRect:不要求使用CAMetalLayer的NSView

来自分类Dev

在OS X上使用Swift:如何访问当前的CGContext以便在-[NSView drawRect:]中进行绘制

来自分类Dev

如何在OSX应用程序中使用DrawRect旋转直接绘制到NSView的图像?

来自分类Dev

尝试从扩展类覆盖NSView的drawRect

来自分类Dev

在NSView上绘图

来自分类Dev

iOS在drawRect内容上使用CGAffineTransformMakeScale进行缩放

来自分类Dev

使用VFL在NSView中对齐NSView

来自分类Dev

CALayer与层支持的NSView性能

来自分类Dev

以编程方式快速调用drawRect()

来自分类Dev

Qt 5.7 drawRect具有较大的笔划宽度绘图切出的角

来自分类Dev

在子视图上使用drawRect?

来自分类Dev

显示带有按钮的NSView

来自分类Dev

NSView-绘图2色检查器

来自分类Dev

使用带有QQuickPaintedItem :: paint()的drawRect

来自分类Dev

如何正确使用UIView和drawRect()在操场上对其进行自定义?

来自分类Dev

支持层的NSView在viewDidLoad中的问题

来自分类Dev

混乱时未调用UIView的drawRect

来自分类Dev

为什么不从ViewController调用* drawRect *?

来自分类Dev

使用drawRect绘制可编辑的角度?

来自分类Dev

在转换后的UIView中使用drawRect

来自分类Dev

iOS-使用自动布局和drawRect

来自分类Dev

使用CAGradientLayer和drawRect:(CGRect)绘制顺序

来自分类Dev

从单独的方法中使用 java awt drawRect?

来自分类Dev

如果NSView使用自动布局,是否其所有子视图还需要使用自动布局进行定位?

来自分类Dev

如果NSView使用自动布局,它的所有子视图是否还需要使用自动布局进行定位?

来自分类Dev

android drawRect没有画任何东西

来自分类Dev

如何淡出带有动画的NSView?

来自分类Dev

Swift中具有KVC属性的NSView

Related 相关文章

  1. 1

    drawRect:不要求使用CAMetalLayer的NSView

  2. 2

    drawRect:不要求使用CAMetalLayer的NSView

  3. 3

    在OS X上使用Swift:如何访问当前的CGContext以便在-[NSView drawRect:]中进行绘制

  4. 4

    如何在OSX应用程序中使用DrawRect旋转直接绘制到NSView的图像?

  5. 5

    尝试从扩展类覆盖NSView的drawRect

  6. 6

    在NSView上绘图

  7. 7

    iOS在drawRect内容上使用CGAffineTransformMakeScale进行缩放

  8. 8

    使用VFL在NSView中对齐NSView

  9. 9

    CALayer与层支持的NSView性能

  10. 10

    以编程方式快速调用drawRect()

  11. 11

    Qt 5.7 drawRect具有较大的笔划宽度绘图切出的角

  12. 12

    在子视图上使用drawRect?

  13. 13

    显示带有按钮的NSView

  14. 14

    NSView-绘图2色检查器

  15. 15

    使用带有QQuickPaintedItem :: paint()的drawRect

  16. 16

    如何正确使用UIView和drawRect()在操场上对其进行自定义?

  17. 17

    支持层的NSView在viewDidLoad中的问题

  18. 18

    混乱时未调用UIView的drawRect

  19. 19

    为什么不从ViewController调用* drawRect *?

  20. 20

    使用drawRect绘制可编辑的角度?

  21. 21

    在转换后的UIView中使用drawRect

  22. 22

    iOS-使用自动布局和drawRect

  23. 23

    使用CAGradientLayer和drawRect:(CGRect)绘制顺序

  24. 24

    从单独的方法中使用 java awt drawRect?

  25. 25

    如果NSView使用自动布局,是否其所有子视图还需要使用自动布局进行定位?

  26. 26

    如果NSView使用自动布局,它的所有子视图是否还需要使用自动布局进行定位?

  27. 27

    android drawRect没有画任何东西

  28. 28

    如何淡出带有动画的NSView?

  29. 29

    Swift中具有KVC属性的NSView

热门标签

归档