Рисунок какао глючит, когда окно теряет, а затем восстанавливает основной статус - PullRequest
1 голос
/ 13 декабря 2010

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

Вот пример:

View drawn correctly View drawn with glitch

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

Вот код, который выполняет рисование:

void EDDrawGlossEffectInRect(NSRect dirtyRect) {
    NSRect topRect, bottomRect;
    NSDivideRect(dirtyRect, &topRect, &bottomRect, (dirtyRect.size.height / 2), NSMaxYEdge);

    [EDLightChromeColor set];
    NSRectFill(topRect);

    [EDMidChromeColor set];
    NSRectFill(bottomRect);
}

и

-(void)drawRect:(NSRect)dirtyRect {
    EDDrawGlossEffectInRect(dirtyRect);

    NSBezierPath *path = [NSBezierPath bezierPath];
    [path setLineWidth:1.0];

    NSPoint startPoint = {0, dirtyRect.size.height};
    NSPoint endPoint = {dirtyRect.size.width, dirtyRect.size.height};

    [path moveToPoint:startPoint];
    [path lineToPoint:endPoint];

    [[NSColor colorWithCalibratedWhite:0.7 alpha:1] set];

    [path stroke];
}

Представление создается программноне с Interface Builder, который я не использую для этого проекта.

1 Ответ

3 голосов
/ 13 декабря 2010

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

...