Если одного из встроенных параметров 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
}
Ах, чтобы иметь его в качестве состояния переменной, я бы, вероятно, определил переменную экземпляра, например isHighlighted, чтобы отслеживать это состояние. Затем, когда бы ни происходило что-либо, что изменило бы выделенное состояние, вы устанавливаете представление как нужное для повторного отображения. Вы можете сделать это в методах set / get, например:
- (void)setHighlighted:(BOOL)aHighlighted {
isHighlighted = aHighlighted;
[self setNeedsDisplay:YES];
}
Затем обновите ваш метод drawRect: для учета флага isHighlighted. То, как вы достигнете невыделенного вида, может зависеть от стиля просмотра изображения. Вы можете попробовать просто вызвать super для рисования, но если при тестировании вы видите какую-либо остаточную информацию или информацию о подсвеченных пикселях, которую рисование 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];
}
}