Невозможно нарисовать градиент в слое CGLayerRef - PullRequest
0 голосов
/ 25 сентября 2011

Я новичок в разработке Xcode и iOS.Я пытаюсь нарисовать градиент в слое, чтобы я мог многократно рисовать этот слой в своем виде.Этот градиент формирует фон представления, и я делаю некоторый рисунок поверх этого градиента.Но когда я рисую градиент в своем слое, а затем рисую его в контексте моего представления, он не рисует градиент.Я попытался отладить код, но все, кажется, просто отлично.Вставьте соответствующий код ниже: Я создаю градиентный слой в начале.

CGContextRef context = UIGraphicsGetCurrentContext();
CGRect myRect = self.bounds;
CGGradientRef myGradient;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGFloat colors[] =
{
    204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00,
    100 / 255.0, 200 / 255.0, 50 / 255.0, 1.00,
    0, 0, 0, 1.00,
};
myGradient = CGGradientCreateWithColorComponents(rgb, colors, NULL, sizeof(colors)/(sizeof(colors[0])*4));
CGColorSpaceRelease(rgb);

CGContextRef layerContext = CGLayerGetContext(gradientLayer);
CGPoint start, end;
CGRect clip = CGContextGetClipBoundingBox(layerContext);
start = getStartPoint(clip);
end = getEndPoint(clip);
CGContextDrawLinearGradient(layerContext, myGradient, start, end, 0);
//CGContextSetRGBFillColor (layerContext, red / 255.0, green / 255.0, blue / 255.0, 1);
//CGContextFillRect (layerContext, clip);

Я вызываю эту функцию, когда создается экземпляр моего класса.А затем несколько раз нарисуйте этот слой в моем методе drawRect.

CGRect rect = self.bounds;
CGContextSaveGState(context);
CGContextDrawLayerInRect(context, rect, gradientLayer);
CGContextSaveGState(context);

Я могу нарисовать тот же градиент непосредственно в drawRect, но не могу сделать это при рисовании в слое, а затем в drawRectчертеж).

Ответы [ 2 ]

0 голосов
/ 10 декабря 2013

ВАМ нужно преобразовать CGLayerRef в CGContextRef Вот так:

    CGContextRef context = UIGraphicsGetCurrentContext();
     CGLayerRef layer = CGLayerCreateWithContext(context, myRect.size, NULL);
        CGContextRef gradientContext = CGLayerGetContext(layer);
// from here we care only on this  gradientContext
    // somewhere call 
    CGContextDrawLinearGradient(gradientContext, /*other args*/ 

// don't forget to clean memory 

CGLayerRelease(layer);

, и вы можете нарисовать градиент в контексте CGContextRef

Или, если вы хотите избежать этих преобразований,Вы можете использовать обычный CGContextRef

Вот как я добился градиента

CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
   // CGLayerRef gradientLayer = CGLayerCreateWithContext(ctx, myRect.size, NULL);
    CGFloat colors[] =
    {
        204.0 / 255.0, 224.0 / 255.0, 244.0 / 255.0, 1.00, //color 1
        100 / 255.0, 200 / 255.0, 50 / 255.0, 1.00, // color 2
        0.0, 0.0, 0.0, 1.00, // color3 
    };
     CGFloat locations[3] = { 0.0, 0.5, 1.0 }; // 3 locations
    CGGradientRef   myGradient = CGGradientCreateWithColorComponents(rgb, colors, locations, 3);
    CGColorSpaceRelease(rgb);
  //  CGContextRef layerContext = CGLayerGetContext(gradientLayer);
    CGFloat minX = CGRectGetMinX(self.bounds);
    CGFloat minY = CGRectGetMinY(self.bounds);
    CGFloat maxY = CGRectGetMaxY(self.bounds);
    CGContextBeginPath(ctx);
    CGRect clip = self.bounds;
    CGContextAddRect(ctx, clip);
    //release memory
    CGContextClip(ctx);
    CGContextDrawLinearGradient(ctx, myGradient, CGPointMake(minX,minY), CGPointMake(minX,maxY), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
    CGGradientRelease(myGradient);

Используйте приведенный выше код для получения градиента. Конечно, вы можете настраивать как местоположения, так и цвета, чтобы получитьэффект, который вы хотите, но помните, что местоположение всегда находится между 0,0 и 1,0

0 голосов
/ 26 сентября 2011

Значения RGBA для вашего градиента должны быть между 0,0f и 1,0f, а не между 0,0f и 255.0f.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...