gpt4 book ai didi

Cocoa - NSMenuItem 中的自定义 NSView 将不会绘制

转载 作者:行者123 更新时间:2023-12-03 16:21:44 25 4
gpt4 key购买 nike

我有一个自定义的 NSView,它曾经在 NIB 中创建并分配为 NSMenuItem 的 View ,效果很好,但现在我想在代码中创建 View (我可以向你保证,这是有充分理由的)看起来不难,但 View 实际上并未绘制。

即使我发送“setNeedsDisplay:”消息,之前在需要时调用以绘制 View 的“drawRect:”消息也不再被调用。

我用图像初始化 View 并设置大小( View 的大小以匹配图像大小),这似乎有效,因为菜单项的大小正确,但没有图像。

这里可能发生什么?

这是初始化 View 的代码:

-(id)initWithImage:(NSImage*)image
{
self = [super init];

if (self != nil)
{
self.imageToDisplay = image;

// this bit does get called and resizes the view to match the image size
NSRect imageBounds = NSMakeRect(0.0f, 0.0f, imageToDisplay.size.width, imageToDisplay.size.height);
[self setBounds:imageBounds];
[self setFrame:imageBounds];

[self setHidden:NO];
[self setAlphaValue:1.0f];

[self setAutoresizesSubviews:YES];
}

return self;
}

这是绘制未调用的 View 的代码

// this is never called
-(void)drawRect:(NSRect)dirtyRect
{
if (imageToDisplay == nil)
return;

NSRect imageBounds = NSMakeRect(0.0f, 0.0f, imageToDisplay.size.width, imageToDisplay.size.height);

[self setBounds:imageBounds];
[self setFrame:imageBounds];

[imageToDisplay drawInRect:[self bounds]
fromRect:imageBounds
operation:NSCompositeSourceAtop
fraction:1.0f];
}

这是添加 View 的菜单项的代码。

-(void)awakeFromNib
{
MyCustomView* view = [[MyCustomView alloc] init];

[self setView:view];

// i would have expected the image to get drawn at this point
[view setNeedsDisplay:YES];
}

最佳答案

您必须先设置 View 的框架,然后才能设置其边界。在您的 -init... 中,交换两个 set... 调用,或者删除 setBounds: (bounds 默认情况下设置为 {(0,0), (frame.size.width, frame.size.height)} )并且一切都应该正常。我也不认为你需要在 drawRect 中再次设置 framebounds ,事实上,改变它似乎是一个坏主意当焦点已经锁定在您的 View 上时;如果值实际上不同,充其量只会导致奇怪的闪烁。

更新:刚刚在 View Programming Guide 中看到此注释:

Note: Once an application explicitly sets the bounds rectangle of a view using any of the setBounds... methods, altering the view's frame rectangle no longer automatically changes the bounds rectangle. See "Repositioning and Resizing Views" for details.

关于Cocoa - NSMenuItem 中的自定义 NSView 将不会绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5161032/

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