Настраиваемая ячейка NSTextFieldCell и фоновый рисунок

#cocoa #nstextfield #nstextfieldcell

#cocoa #nstextfield #nstextfieldcell

Вопрос:

Я создал пользовательскую ячейку NSTextFieldCell и переписал - (void)drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView *)controlView ее, чтобы сделать свой собственный рисунок здесь. Однако у меня проблемы с фоновым рисунком. Без вызова super фон не очищается, а последующие рисунки создают что-то вроде эффекта размазывания. Этого не происходит, когда установлен параметр drawsBackground, так как в этом случае я могу просто заполнить ячейку цветом фона.

 - (void)drawInteriorWithFrame: (NSRect)cellFrame inView: (NSView *)controlView {
    if (self.drawsBackground) {
        [self.backgroundColor set];
    } else {
        [NSColor.clearColor set];
    }
    NSRectFill(cellFrame);

    [self.attributedStringValue drawInRect: cellFrame];
}
  

введите описание изображения здесь

Но что мне нужно сделать, чтобы очистить фон в случае, если фоновый рисунок отключен? Конечно, я хочу, чтобы другой контент в текстовом представлении просвечивал (так что простое стирание с помощью цвета фона superview не является решением).

Ответ №1:

Если вы попытаетесь заполнить ячейку символом a [NSColor clearColor] , она станет черной. Старайтесь избегать заливки, когда она не нужна. И вы сможете удалить свой super вызов.

Пример:

 - (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{
    if (self.drawsBackground) {
        if (self.backgroundColor amp;amp; self.backgroundColor.alphaComponent>0) {

            [self.backgroundColor set];
            NSRectFill(cellFrame);
        }
    }
    NSRect titleRect = [self titleRectForBounds:cellFrame];
    NSAttributedString *aTitle = [self attributedStringValue];
    if ([aTitle length] > 0) {
        [aTitle drawInRect:titleRect];
    }
}