2013-07-22 2 views
3

Мне было интересно, может ли кто-нибудь помочь. В основном у меня есть код Objective C ниже, кто-нибудь знает, как я могу подключить его к CAShapeLayer для Mac OS X, а не iOS ?.Как подключить NSBezierPath к CAShapeLayer


****//// Color Declarations 
NSColor* fillColor = [NSColor colorWithCalibratedRed: 0 green: 0.886 blue: 0.886 alpha: 1]; 
NSColor* strokeColor = [NSColor colorWithCalibratedRed: 0 green: 0 blue: 0 alpha: 1]; 
//// Star Drawing 
NSBezierPath* starPath = [NSBezierPath bezierPath]; 
[starPath moveToPoint: NSMakePoint(106, 91.5)]; 
[starPath lineToPoint: NSMakePoint(110.21, 82.56)]; 
[starPath lineToPoint: NSMakePoint(119.18, 86.7)]; 
[starPath lineToPoint: NSMakePoint(116.65, 77.15)]; 
[starPath lineToPoint: NSMakePoint(126.19, 74.56)]; 
[starPath lineToPoint: NSMakePoint(118.11, 68.86)]; 
[starPath lineToPoint: NSMakePoint(123.75, 60.75)]; 
[starPath lineToPoint: NSMakePoint(113.91, 61.58)]; 
[starPath lineToPoint: NSMakePoint(113.01, 51.74)]; 
[starPath lineToPoint: NSMakePoint(106, 58.7)]; 
[starPath lineToPoint: NSMakePoint(98.99, 51.74)]; 
[starPath lineToPoint: NSMakePoint(98.09, 61.58)]; 
[starPath lineToPoint: NSMakePoint(88.25, 60.75)]; 
[starPath lineToPoint: NSMakePoint(93.89, 68.86)]; 
[starPath lineToPoint: NSMakePoint(85.81, 74.56)]; 
[starPath lineToPoint: NSMakePoint(95.35, 77.15)]; 
[starPath lineToPoint: NSMakePoint(92.82, 86.7)]; 
[starPath lineToPoint: NSMakePoint(101.79, 82.56)]; 
[starPath closePath]; 
[fillColor setFill]; 
[starPath fill]; 
[strokeColor setStroke]; 
[starPath setLineWidth: 1]; 
[starPath stroke];**** 

В основном я использую приложение Paintcode и хотел бы создать формы затем преобразовать их в CAShapeLayer, который будет использоваться для анимации.

Любая помощь была бы принята с благодарностью.

С уважением.

+0

Я думаю, что это post поможет http://stackoverflow.com/questions/15318918/how-to-make-my-uibezierpath-animated-with-cashapelayer – BigBadOwl

+0

Я думаю, что ссылка для iOS только так, как я это видел раньше, мне нужен код для OS X. Спасибо в любом случае. – Nightowl

ответ

6

CAShapeLayer свойству объекта путь является CGPathRef, но, в отличие от [UIBezierPath CGPath] Иос, там удивительно не какой-либо встроенный метод для преобразования OSX NSBezierPath в CGPathRef. Тем не менее, в документации Apple, они отправляют сниппет, чтобы сделать преобразование в https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CocoaDrawingGuide/Paths/Paths.html#//apple_ref/doc/uid/TP40003290-CH206-SW2:

@implementation NSBezierPath (BezierPathQuartzUtilities) 
// This method works only in OS X v10.2 and later. 
- (CGPathRef)quartzPath 
{ 
    int i, numElements; 

    // Need to begin a path here. 
    CGPathRef   immutablePath = NULL; 

    // Then draw the path elements. 
    numElements = [self elementCount]; 
    if (numElements > 0) 
    { 
     CGMutablePathRef path = CGPathCreateMutable(); 
     NSPoint    points[3]; 
     BOOL    didClosePath = YES; 

     for (i = 0; i < numElements; i++) 
     { 
      switch ([self elementAtIndex:i associatedPoints:points]) 
      { 
       case NSMoveToBezierPathElement: 
        CGPathMoveToPoint(path, NULL, points[0].x, points[0].y); 
        break; 

       case NSLineToBezierPathElement: 
        CGPathAddLineToPoint(path, NULL, points[0].x, points[0].y); 
        didClosePath = NO; 
        break; 

       case NSCurveToBezierPathElement: 
        CGPathAddCurveToPoint(path, NULL, points[0].x, points[0].y, 
             points[1].x, points[1].y, 
             points[2].x, points[2].y); 
        didClosePath = NO; 
        break; 

       case NSClosePathBezierPathElement: 
        CGPathCloseSubpath(path); 
        didClosePath = YES; 
        break; 
      } 
     } 

     // Be sure the path is closed or Quartz may not do valid hit detection. 
     if (!didClosePath) 
      CGPathCloseSubpath(path); 

     immutablePath = CGPathCreateCopy(path); 
     CGPathRelease(path); 
    } 

    return immutablePath; 
} 
@end 

Вы можете вставить в эту категорию, а затем установить форму на вашем слое с:

layer.path = [starPath quartzPath]; 
+0

вы, вероятно, хотите, чтобы это было 'CGPathRef quartzPath = [starPath quartzPath]; layer.path = quartzPath; CGPathRelease (quartzPath); 'иначе вы будете утечка возвращаемого CGPathRef – rudy

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