我是iOS开发人员,最近我正在为MAC OSX编写桌面APP。我仍然没有太多关于OSX的View组件的经验,所以也许这是一个愚蠢或简单的问题,但我已经对这个问题进行了一些研究并找不到任何解决方案。
问题在于:
我有一个NSView的自定义特化,用作我的NSPopover中使用的Content ViewController的视图。
在这个视图中,我正在调用" PopoverBackgroundView",我在drawRect里面绘制了这个红色背景,并计算了另一个小矩形并涂上了这种类似灰色的颜色。这是代码:
- (void)drawRect:(NSRect)dirtyRect
{
[[NSColor colorWithDeviceRed:174/255.0 green:72/255.0 blue:72/255.0 alpha:1.0] setFill];
NSRectFill(dirtyRect);
[[NSColor colorWithDeviceRed:51/255.0 green:51/255.0 blue:51/255.0 alpha:1.0] setFill];
NSRectFill(NSMakeRect(BORDER_WIDTH, BORDER_WIDTH, dirtyRect.size.width - 2*BORDER_WIDTH, dirtyRect.size.height - 2*BORDER_WIDTH));
}
所以,在PopoverBackgroundView.m
我内部以编程方式创建一个NSComboBox。这个组合框的编号为1到10.当我分配它时,一切似乎都很好:
问题是,在我选择组合框内的任何选项之后,它的背景以某种方式消失了#34;消失了#34;变得透明,我不知道,变成这样:
请注意NSComboBox周围的红色框架(视图的背景颜色),这个框架出现在我选择的东西之后。
这是我分配comboBox并初始化它的代码:
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
(...)
self.comboBox = [[NSComboBox alloc] initWithFrame:CGRectMake(15, frame.size.height - 55, 90, 25)];
self.comboBox.delegate = self;
[self.comboBox setDrawsBackground:NO];
[self.comboBox setSelectable:YES];
[self.comboBox setEditable:NO];
for (int i = 1; i<=10; i++)
{
NSString *mystr = [NSString stringWithFormat:@"%d", i];
[self.comboBox addItemWithObjectValue:mystr];
}
[self addSubview:self.comboBox];
}
return self;
}
任何想法我怎样才能修复&#39;这个&#34;选择的背景&#34;?所有我想要的选择状态等于正常状态,即。即,即使在选择之后,comboBox应该总是像第一个图像一样。
分配代码有问题吗?有什么使命?我真的以为只有一些我没有使用或初始化的属性,但我还无法找到。
提前致谢,
答案 0 :(得分:2)
为了给出反馈,我终于能够解决我的问题了。
我不确切知道为什么,但问题全部都是因为我在drawRect
绘制边框的方式造成的。不知何故,这些代码
[[NSColor colorWithDeviceRed:174/255.0 green:72/255.0 blue:72/255.0 alpha:1.0] setFill];
NSRectFill(dirtyRect);
被子视图传播,不知道是否是setFill或NSRectFill。因此,NSCombobox的“背景”被涂上了这种颜色。
看到这篇文章后:Adding border and Rounded Rect in the NSView我将我的绘图矩形更改为:
- (void)drawRect:(NSRect)dirtyRect
{
NSBezierPath *background = [NSBezierPath bezierPathWithRoundedRect:self.bounds xRadius:10 yRadius:10];
[[NSColor colorWithDeviceRed:174/255.0 green:72/255.0 blue:72/255.0 alpha:1.0] set];
[background setLineWidth:10];
[background stroke];
}
现在一切正常,正如我想的那样。现在,在我选择了我的组合框之后,没有画出奇怪的背景。
如果有人知道上一段代码发生的情况,请告诉我。