突出显示NSImageView - Objective-c

lab*_*b12 1 cocoa objective-c nsimageview

有没有办法用Mac的默认高亮颜色"突出显示"NSImageView?我只是想找一种方法来修改我的nsimageview,以便用户可以轻松识别对象.

谢谢,

凯文

NSG*_*God 7

如果NSImageView的内置选项之一不够,可以继承NSImageView,并在drawRect中执行:

- (void)drawRect:(NSRect)frame {
   [super drawRect:frame]; // this takes care of image
   [NSBezierPath setDefaultLineWidth:4.0];
   [[NSColor highlightColor] set];
   [NSBezierPath strokeRect:frame]; // will give a 2 pixel wide border
}
Run Code Online (Sandbox Code Playgroud)

啊,要把它作为一个变量状态,我可能会定义一个实例变量,比如isHighlighted来跟踪那个状态.然后,每当发生任何会改变突出显示状态的事件时,您都会将视图设置为需要重新显示.您可以在set/get方法中执行此操作,例如:

- (void)setHighlighted:(BOOL)aHighlighted {
   isHighlighted = aHighlighted;
   [self setNeedsDisplay:YES];
}
Run Code Online (Sandbox Code Playgroud)

然后,更新drawRect:方法以考虑isHighlighted标志.如何实现不突出的外观可能取决于图像视图的样式.您可以尝试只调用super来进行绘制,但是如果在测试中,您会看到超级绘图没有覆盖的任何残留或杂散突出显示的像素信息,您可能需要先绘制清晰的颜色,然后调用super.

所以,像这样:

- (void)drawRect:(NSRect)frame {
   isHighlighted ? [[NSColor highlightColor] set] : [[NSColor clearColor] set];
   [NSBezierPath setDefaultLineWidth:4.0];
   if (isHighlighted) {
      [super drawRect:frame];
      [NSBezierPath strokeRect:frame]; // will give a 2 pixel wide border
   } else {
      [NSBezierPath fillRect:frame];
      [super drawRect:frame];
   }
}
Run Code Online (Sandbox Code Playgroud)