2013-12-20 106 views
0

这就是我用Bezier路径绘制类似popover窗口的方式。 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布尔的方式。之后,如果我再次调用带有bAbajo的相反值的drawRect,则会执行正确的代码(bAbajo具有期望的值,并且通过调试带有断点我可以看到它正在执行drawRect中的正确代码),但窗口是没有用新的NSBezierPath *路径更新。任何帮助?

+0

如果在进行任何绘图之前清除窗口,会发生什么情况? – user1118321

+0

你是什么意思“如果我再次调用drawRect?”你从不直接调用drawRect。你的意思是“当系统调用drawRect时,在我调用setNeedsDisplay之后?” –

+0

是的,你是对的,我的意思是'当我打电话给setNeedsDisplay后系统调用' –

回答

0

事实上,罗布间接给了我答案,我没有在设置bAbajo之后调用setNeedsDisplay。