NSView Не обновляется? - PullRequest
0 голосов
/ 14 июля 2010

Я работаю над перетаскиванием и нашел несколько обработчиков для операций перетаскивания в Интернете. Я хочу, чтобы он стал синим, когда пользователь перетаскивает файл над областью перетаскивания, и снова серым, когда он покидает область перетаскивания. Проблема в том, что он не обновляется, когда вы наводите на него мышью или выходите из нее. Вот часть кода:

- (void)drawRect:(NSRect)rect
{
   NSRect bounds = [self bounds];
   [[NSColor grayColor] set];
   [NSBezierPath fillRect:bounds];
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender  {
    NSRect bounds = [self bounds];
    [[NSColor blueColor] set];
    [NSBezierPath fillRect:bounds];

    return NSDragOperationCopy;

}

- (void)draggingExited:(id <NSDraggingInfo>)sender {
    NSRect bounds = [self bounds];
    [[NSColor grayColor] set];
    [NSBezierPath fillRect:bounds];

}

Спасибо за любую помощь.

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

Вы звоните [yourView: setNeedsDisplay] куда-нибудь?

Это то, как вы позволяете платформе рисования знать, что она должна сообщать вашему подклассу UIView с drawRect:, поэтому вы должны делать это всякий раз, когда что-то меняется. В вашем случае это, вероятно, означает, что мышь входит или выходит из области перетаскивания.

1 голос
/ 14 июля 2010

Рисование работает только в том случае, если для рисования установлен контекст (например, холст для рисования).Когда фреймворк вызывает -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.

...