2013-12-20 3 views
0

Так я рисую однополярное окно с траекторией безье. BOOLEAN bAbajo делает окно чертежа вверх. Если не bAbajo, он указывает вверх:Перекрашивание NSBezierPath

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect contentRect = NSInsetRect([self bounds], LINE_THICKNESS, LINE_THICKNESS); 
    NSBezierPath *path = [NSBezierPath bezierPath]; 
    if (_bAbajo) 
    { 
     [path removeAllPoints]; 
     [path moveToPoint:NSMakePoint(_arrowX, NSMinY(contentRect))]; 
     [path lineToPoint:NSMakePoint(_arrowX + ARROW_WIDTH/2, NSMinY(contentRect) + ARROW_HEIGHT)]; 
     [path lineToPoint:NSMakePoint(NSMaxX(contentRect) - CORNER_RADIUS, NSMinY(contentRect) + ARROW_HEIGHT)]; 
     NSPoint bottomRightCorner = NSMakePoint(NSMaxX(contentRect), NSMinY(contentRect) + ARROW_HEIGHT); 
     [path curveToPoint:NSMakePoint(NSMaxX(contentRect), NSMinY(contentRect) + ARROW_HEIGHT + CORNER_RADIUS) 
     controlPoint1:bottomRightCorner controlPoint2:bottomRightCorner]; 
     [path lineToPoint:NSMakePoint(NSMaxX(contentRect), NSMaxY(contentRect) - CORNER_RADIUS)]; 
     NSPoint topRightCorner = NSMakePoint(NSMaxX(contentRect), NSMaxY(contentRect)); 
     [path curveToPoint:NSMakePoint(NSMaxX(contentRect) - CORNER_RADIUS, NSMaxY(contentRect) + CORNER_RADIUS) controlPoint1:topRightCorner controlPoint2:topRightCorner]; 
     [path lineToPoint:NSMakePoint(NSMinX(contentRect) + CORNER_RADIUS, NSMaxY(contentRect) + CORNER_RADIUS)]; 
     NSPoint topLeftCorner = NSMakePoint(NSMinX(contentRect), NSMaxY(contentRect)); 
     [path curveToPoint:NSMakePoint(NSMinX(contentRect), NSMaxY(contentRect) - CORNER_RADIUS) controlPoint1:topLeftCorner controlPoint2:topLeftCorner]; 
     [path lineToPoint:NSMakePoint(NSMinX(contentRect), NSMinY(contentRect) + CORNER_RADIUS + ARROW_HEIGHT)]; 
     NSPoint bottomLeftCorner = NSMakePoint(NSMinX(contentRect), NSMinY(contentRect) + ARROW_HEIGHT); 
     [path curveToPoint:NSMakePoint(NSMinX(contentRect) + CORNER_RADIUS, NSMinY(contentRect) + ARROW_HEIGHT) controlPoint1:bottomLeftCorner controlPoint2:bottomLeftCorner]; 
     [path lineToPoint:NSMakePoint(_arrowX - ARROW_WIDTH/2, NSMinY(contentRect) + ARROW_HEIGHT)]; 
    } 
    else 
    { 
     [path removeAllPoints]; 
     [path moveToPoint:NSMakePoint(_arrowX, NSMaxY(contentRect))]; 
     [path lineToPoint:NSMakePoint(_arrowX + ARROW_WIDTH/2, NSMaxY(contentRect) - ARROW_HEIGHT)]; 
     [path lineToPoint:NSMakePoint(NSMaxX(contentRect) - CORNER_RADIUS, NSMaxY(contentRect) - ARROW_HEIGHT)]; 
     NSPoint topRightCorner = NSMakePoint(NSMaxX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT); 
     [path curveToPoint:NSMakePoint(NSMaxX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT - CORNER_RADIUS) 
      controlPoint1:topRightCorner controlPoint2:topRightCorner]; 
     [path lineToPoint:NSMakePoint(NSMaxX(contentRect), NSMinY(contentRect) + CORNER_RADIUS)]; 
     NSPoint bottomRightCorner = NSMakePoint(NSMaxX(contentRect), NSMinY(contentRect)); 
     [path curveToPoint:NSMakePoint(NSMaxX(contentRect) - CORNER_RADIUS, NSMinY(contentRect)) 
      controlPoint1:bottomRightCorner controlPoint2:bottomRightCorner]; 
     [path lineToPoint:NSMakePoint(NSMinX(contentRect) + CORNER_RADIUS, NSMinY(contentRect))]; 
     [path curveToPoint:NSMakePoint(NSMinX(contentRect), NSMinY(contentRect) + CORNER_RADIUS) 
      controlPoint1:contentRect.origin controlPoint2:contentRect.origin]; 
     [path lineToPoint:NSMakePoint(NSMinX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT - CORNER_RADIUS)]; 
     NSPoint topLeftCorner = NSMakePoint(NSMinX(contentRect), NSMaxY(contentRect) - ARROW_HEIGHT); 
     [path curveToPoint:NSMakePoint(NSMinX(contentRect) + CORNER_RADIUS, NSMaxY(contentRect) - ARROW_HEIGHT) 
      controlPoint1:topLeftCorner controlPoint2:topLeftCorner]; 
     [path lineToPoint:NSMakePoint(_arrowX - ARROW_WIDTH/2, NSMaxY(contentRect) - ARROW_HEIGHT)]; 
    } 
    [path closePath]; 
    [[NSColor colorWithDeviceWhite:1 alpha:FILL_OPACITY] setFill]; 
    [path fill]; 
    //[NSGraphicsContext saveGraphicsState]; 

    NSBezierPath *clip = [NSBezierPath bezierPathWithRect:[self bounds]]; 
    [clip appendBezierPath:path]; 
    [clip addClip]; 

    [path setLineWidth:LINE_THICKNESS * 2]; 
    [[NSColor whiteColor] setStroke]; 
    [path stroke]; 

    [NSGraphicsContext restoreGraphicsState]; 
} 

В первый раз DrawRect называется, все работает отлично, рисунок идет так, как он должен в зависимости от логического значения bAbajo. После этого, если я снова вызову drawRect с противоположным значением bAbajo, будет выполнен правильный код (bAbajo имеет ожидаемое значение и путем отладки с точками останова я вижу, что он выполняет правильный код внутри drawRect), но окно не обновляется с помощью нового пути NSBezierPath *. Любая помощь?

+0

Что произойдет, если вы очистите окно перед выполнением какого-либо рисунка? – user1118321

+0

Что вы подразумеваете под словом «если я снова вызову drawRect?» Вы никогда не называете drawRect напрямую. Вы имеете в виду «когда drawRect вызывается системой после вызова setNeedsDisplay?» –

+0

Да, вы правы, я имел в виду «когда он вызывается системой после вызова setNeedsDisplay» –

ответ

0

Фактически, Роб косвенно дал мне ответ, я не вызывал setNeedsDisplay после установки bAbajo.

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