SetNeedsDisplay * всегда * перекрашивается? - PullRequest
0 голосов
/ 06 сентября 2011

Я написал небольшое приложение для просмотра с использованием какао.А потом (да, я знаю, что это плохо), я просто спросил себя: подействует ли это также на прикосновение какао?Конечно, идентификатор не работал сразу, мне пришлось изменить имена классов и так далее.Ну, я обновлял View, когда это было необходимо, используя метод NSTimer и setNeedsDisplay:.Работал довольно хорошо под какао, но абсолютно не под воздействием какао.

Я не могу объяснить это себе, на самом деле я не знаю, какие строки кода могут помочь кому-то решить проблему.Может быть, здесь таймер:

[self setMyTimer: [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(myTarget:) userInfo:nil repeats:YES]];

И его цель:

- (void) myTarget:(NSTimer *)timer {
    [self setNeedsDisplay];
}

Таймер вызывается каждые 30 мс, я проверял это с помощью NSLog.

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

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Сначала я проверил бы, работает ли drawRect:, используя точку останова или оператор журнала.

Затем убедитесь, что ваш вид действительно на экране. Какова стоимость [self superview]? Вы также должны сделать что-то вроде self.backgroundColor = [UIColor redColor];, чтобы вы могли видеть, где находится ваш взгляд.

Если вы помечаете вид как грязный каждые 30 мс, это не значит, что он будет рисовать каждые 30 мс. Как правило, должно (это около 30 кадров в секунду), но нет гарантии. drawRect: не следует полагаться на то, как часто это называется. Исходя из вашего вопроса, я предполагаю, что вы имеете в виду, что он никогда не рисует, а не просто рисует так часто, как ожидалось.

3 голосов
/ 06 сентября 2011

Вот обсуждение setNeedsDisplay (обратите внимание на НЕДОСТАТОК аргументов) из документации UIView:

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

Этот метод следует использовать, чтобы запросить перерисовку вида только при изменении содержимого или внешнего вида вида.Если вы просто измените геометрию вида, вид обычно не перерисовывается.Вместо этого его существующее содержимое корректируется на основе значения в свойстве contentMode представления.Повторное отображение существующего контента повышает производительность, избегая необходимости перерисовывать контент, который не изменился.

В отличие от этого, здесь обсуждается setNeedsDisplay: (обратите внимание на аргумент) из документации NSView:

Всякий раз, когда данные или состояние, используемые для рисования объекта вида, изменяются, представлению следует отправить сообщение setNeedsDisplay:.NSView объекты, помеченные как требующие отображения, автоматически отображаются снова при каждом проходе цикла событий приложения.(Просмотр объектов, которые должны повторно отображаться до начала цикла обработки событий, конечно, может быть немедленно отправлен соответствующим методом display ...).

...