2012-07-17 6 views
2

У меня возникла проблема с пользовательским чертежом NSView, использующим как documentView NSScrollView.пользовательский чертеж nsview внутри nsscrollview

Вот мой DrawRect: Код:

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [[NSColor lightGrayColor] set]; 
    NSRectFill(self.frame); // Fill entire frame 

    [[NSColor grayColor] set]; 
    [NSBezierPath setDefaultLineWidth:1]; 

    float y = 0.0f; 
    while (y <= self.frame.size.height) { 
     [NSBezierPath strokeLineFromPoint:NSMakePoint(0.0f, y) toPoint:NSMakePoint(self.frame.size.width, y)]; 
     y += 50.0f; 
    } 

    float x = 0.0f; 
    while (x <= self.frame.size.width) { 
     [NSBezierPath strokeLineFromPoint:NSMakePoint(x, 0.0f) toPoint:NSMakePoint(x, self.frame.size.height)]; 
     x += 50.0f; 
    } 
} 

Drawing a grid

Все нормально, когда я прокрутить вид вправо, но я вижу странные строки, когда я прокрутить вид влево.

enter image description here

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

В чем причина этой проблемы? Как я могу это решить? Благодарю.

ответ

0

В принципе, вы рисуете поверх старого контента. Итак, по сути, вам нужно как-то очистить его.

Одним из способов является

[[NSColor clearColor] set]; 
NSRectFill(_bounds); 

Вы можете что-то более точным или нет.

+0

Не работает для меня. У меня аналогичная проблема (изображение сильно повреждено при прокрутке). – LiMar

+0

Убедитесь, что ваши прямоугольники являются неотъемлемыми. CGRectIntegral() поможет. Взгляды ненавидят дробные прямоугольники – uchuugaka

0

Я знаю, что это старый вопрос, но я столкнулся с одной и той же проблемой, и мне удалось это исправить.

drawRect метод имеет один аргумент, a (CGRect) dirtyRect. Моя ошибка заключалась в том, что я использовал dirtyRect для проверки границ, которые можно использовать, как на iOS. Но я обнаружил, что этот CGRect называется «грязным» по какой-то причине. Он определяет регион, который ОС хочет, чтобы вы перерисовали. Иногда это не весь кадр NSView, а часть его. Это позволяет сделать действительно быстрый оптимизированный код, который не нарисовал больше, чем нужно.

Моим решением было проигнорировать dirtyRect и вместо этого просто использовать self.bounds для рисования.

Смежные вопросы