Рисование работает только в том случае, если для рисования установлен контекст (например, холст для рисования).Когда фреймворк вызывает -drawRect:
, он устанавливает для вас контекст рисования, поэтому команды рисования, такие как -[NSColor set]
и -[NSBezierPath fillRect:]
, работают так, как вы ожидаете.
За пределами -drawRect:
обычно контекст рисования отсутствуетнастроить.Использование команд рисования за пределами -drawRect:
похоже на взмах кисти в воздухе;нет холста, поэтому рисование не происходит.
В 99,99% случаев все виды рисования должны быть сохранены в пределах -drawRect:
, потому что NSView выполняет большую часть работы, которую вы не хотите делать, чтобы получить рисунокконтекст настроен правильно и эффективно.
Итак, как вы изменяете чертеж вашего вида в ваших -draggingEntered:
и -draggingExited:
методах?По побочным эффектам.
Вы делаете одно и то же во всех трех случаях: 1) Установка цвета и 2) Рисование прямоугольника.Разница лишь в изменении цвета в каждом методе.Итак, почему бы не контролировать, какой цвет вы используете в -drawRect:
с помощью ивара, например:
- (void)draggingEntered:(id <NSDraggingInfo>)sender {
drawBlueColorIvar = YES;
// ...
}
Затем в -drawRect:
вы делаете это:
- (void)drawRect:(NSRect)rect {
NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor];
[color set];
[NSBezierPath fillRect:rect];
}
(Обратите внимание, Iне использовал [self bounds]
. Более эффективно просто рисовать в «грязный» прямоугольник, когда это возможно.)
Наконец, вам нужен какой-то способ сообщить платформе, что ваше представление должно перерисовываться, когда drawBlueColorIvarизменения.Фреймворк не будет ничего рисовать, пока не будет сказано, что это необходимоКак сказал Крис Купер, вы делаете это с [self setNeedsDisplay:YES]
.Это должно идти после любого места, которое вы меняете drawBlueColorIvar
.