Кривые Безье в Cocoa на примере создания простой прямоугольной выноски

Рассмотрим как с помощью класса NSBezierPath можно нарисовать простую прямоугольную выноску.


Для этого в методе drawRect: класса NSView напишем следующий код:

    NSBezierPath *thePath = [NSBezierPath bezierPath];
    [thePath moveToPoint:NSMakePoint(NSMidX(aDirtyRect), NSMaxY(aDirtyRect))];
    
    NSUInteger theArrWidth = 32, theArrHeight = 24;
    [thePath lineToPoint:NSMakePoint(NSMidX(aDirtyRect) + theArrWidth / 2, NSMaxY(aDirtyRect) - theArrHeight)];
    [thePath lineToPoint:NSMakePoint(NSMaxX(aDirtyRect), NSMaxY(aDirtyRect) - theArrHeight)];
    [thePath lineToPoint:NSMakePoint(NSMaxX(aDirtyRect), NSMinY(aDirtyRect))];
    [thePath lineToPoint:NSMakePoint(NSMinX(aDirtyRect), NSMinY(aDirtyRect))];
    [thePath lineToPoint:NSMakePoint(NSMinX(aDirtyRect), NSMaxY(aDirtyRect) - theArrHeight)];
    [thePath lineToPoint:NSMakePoint(NSMidX(aDirtyRect) - theArrWidth / 2, NSMaxY(aDirtyRect) - theArrHeight)];
    
    [thePath closePath];
    
    [[NSColor colorWithDeviceWhite:1.0 alpha:1.0] setFill];
    [thePath fill];
    
    [[NSColor blueColor] setStroke];
    [thePath stroke];

Крыша у выноски получилась более четкая, чем остальные краевые линии собственно потому что мы краевые линии рисовали на границе вьюхи. Тут не помешало бы сделать отступ с помощью NSInsetRect.

Если дальше развивать код, то с помощью функции curveToPoint:controlPoint1:controlPoint2: можно сделать закругленные углы, сделав тем самым скругленную прямоугольную выноску.

исходники

P.S. Кстати еще можно автоматически парсить SVG path и рисовать его на вью.