Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 确定填充背景色的正确窗口边框大小_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 确定填充背景色的正确窗口边框大小

Objective c 确定填充背景色的正确窗口边框大小,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我在Cocoa开发,目前在填充NSWindowController的背景时遇到问题 我知道如果你想定制你的cocoa应用,子类化是前进的方向。因此,我创建了一个名为whiteView的自定义NSView,并将此视图作为子视图添加到我的windowController的contentView;但是,完全填充窗口背景存在一些问题。有人能解释一下我怎么能让颜色覆盖窗框的整个表面吗。多谢各位 这些是我到目前为止得到的结果 1)这是窗口当我保持原样时,请注意白色只覆盖了窗口的一半。 2)当我将窗口调整到

我在Cocoa开发,目前在填充
NSWindowController
的背景时遇到问题

我知道如果你想定制你的cocoa应用,子类化是前进的方向。因此,我创建了一个名为whiteView的自定义
NSView
,并将此视图作为子视图添加到我的
windowController
contentView
;但是,完全填充窗口背景存在一些问题。有人能解释一下我怎么能让颜色覆盖窗框的整个表面吗。多谢各位

这些是我到目前为止得到的结果

1)这是窗口当我保持原样时,请注意白色只覆盖了窗口的一半。

2)当我将窗口调整到最右侧和最底部时,这里又是同一个窗口。白色屏幕似乎有足够的延展性,可以覆盖所有元素。

这就是我创建自定义视图的方式

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];
    [[NSColor whiteColor] set];
    NSRectFill([self bounds]);
}
这就是我如何在窗户上粘贴风景的方法

WhiteView *whiteBackgroundView = [[WhiteView alloc] initWithFrame:self.window.frame];
[self.window.contentView addSubview:whiteBackgroundView positioned:NSWindowBelow relativeTo:self.window.contentView];

我需要做什么才能正确地让我的窗口背景完全被白色覆盖?

首先,简单的解决方案是使用
-[NSWindow setBackgroundColor:
只设置窗口的背景色。不需要视图

如果您仍然对如何修复基于视图的方法感兴趣,那么可能错误在于您没有设置视图的自动调整大小掩码,使其跟随窗口大小的更改。例如,您可以执行
[whiteBackgroundView setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable]

但是,您也可以将
whiteBackgroundView
设置为窗口的
contentView
而不是它的子视图。窗口的内容视图始终保持为填充窗口内容矩形所需的大小。窗口的所有其他视图都是白色背景视图的子视图。在我看来,这比让它成为恰好在后面的兄弟姐妹要好。使用同级视图之间的相对顺序来实现特定的渲染顺序是一种技巧

最后,如果超类是
NSView
本身,则没有理由在
-drawRect:
中调用
super
的实现
NSView
在其
-drawRect:
中不进行任何绘图。此外,您的子类将全权负责其边界的整个绘制内容,因此您无论如何都会透支
super
所绘制的内容。(另外,您只需要填写
dirtyRect
,而不需要填写
[自定边界]

当您使用它时,由于您的类已填充其边界,您应该重写
-isOpaque
以返回
YES
进行优化


更新:关于视图的框架:如果它不是窗口的内容视图,那么您希望将其框架设置为预期超级视图的边界。因此,如果希望使用
whiteBackgroundView
填充内容视图,则应该使用
self.window.contentView.bounds

更一般地说,如果需要窗口的content-rect,可以执行
[window-contentRectForFrameRect:window.frame]
。但是,如果视图将成为窗口的内容视图,则无需将其框架设置为任何特定的内容。它将自动调整大小


更新2:

要将视图层次结构从原始内容视图传输到新内容视图(将白色背景视图设置为内容视图时),请执行以下操作:

(为手动保留释放而编写。如果使用ARC,只需删除
-release
调用即可。)


关于要使用的框架,如第一次更新中所述:请记住,视图的框架应以其superview的坐标系表示。因此,正如我所说的,
self.window.contentView.bounds
如果将新视图放入内容视图中,将起作用。窗口的框架和内容矩形位于屏幕坐标中。他们对视图的定位是完全错误的。

嘿,谢谢你的发帖。正如您所提到的,设置contentView可能比将我的自定义视图添加为contentView的同级视图要好,但这样做会在UI元素顶部绘制一个白色层,或者完全覆盖它。是否有一种特定的方法可以将其设置为contentView,以避免UI元素被绘制/删除?此外,我还将
autoresizingMask
属性设置为两个值,它们的写入顺序是什么,只有“宽度大小”值似乎影响白色背景视图,而不是“高度大小”。高度的行为与上面两个参考图像中显示的相同,但宽度现在就像一个符咒。还有什么我可以尝试的,或者我需要做的,来让ResizingSks按照我们期望的方式工作。你错过了第一段关于只设置窗口背景色的内容了吗?此外,如果将自定义视图设置为窗口的内容视图,则实际上已删除了在IB中设置的所有视图。这些视图是原始内容视图的子视图,但已被删除且不再在窗口中(如果没有其他内容保留,则将被释放)。在替换之前,需要将子视图从旧内容视图转移到新内容视图。我会更新我的答案来说明这一点。关于
自动重设网格任务
,您是否修复了自定义视图的框架?嘿,是的,我修复了。我忘了提到,是的,这确实有效,尽管我更愿意使用ustom视图解决这种情况,这样我就能够继续定制它。我确实修正了你让我做的关于自边界的事情,并用dirtyrect代替它。当你问是否
NSArray* subviews = [self.window.contentView.subviews copy];
[subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
[whiteBackgroundView setSubviews:subviews];
[subviews release];