iPhone - Помощь с CGGradientCreateWithColorComponents и создание градиента согласно скриншоту - PullRequest
3 голосов
/ 07 марта 2011

Я пытаюсь применить тот же градиент, что и на снимке экрана ниже, используя CGGradientCreateWithColorComponents.

Это то, что я сейчас использую, но это не совсем правильно, и я пытаюсь угадать эти значения. Я также хотел бы знать, как на самом деле определить, что это за значения, так как этот код был взят из учебника, который совсем не объяснял с точки зрения компонентов.

CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
CGFloat components[8] = { 1, 1, 1, 1, 0.866, 0.866, 0.866, 1 };
CGFloat locations[2] = { 0.0, 1.0 };

CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, components, locations, 2);

enter image description here

Ответы [ 4 ]

10 голосов
/ 15 апреля 2011

Я поиграл с этим и получил эту картинку:

enter image description here

с цветами:

static const CGFloat colors [] = { 
0.894, 0.894, 0.894, 1.0, 
0.694, 0.694, 0.694, 1.0
};

, используя этот кусок кода:

- (void) drawRect:(CGRect)rect {
   CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
   CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colors, NULL, 2);
   CGColorSpaceRelease(baseSpace), baseSpace = NULL;

   CGContextRef context = UIGraphicsGetCurrentContext();
   CGContextClearRect(context, rect);
   CGContextSaveGState(context);

   CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
   CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));

   CGContextClip(context);
   CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);

   CGGradientRelease(gradient), gradient = NULL;

   CGContextRestoreGState(context);
   [super drawRect:rect];
 }

Я не знаю, достаточно ли близко.

4 голосов
/ 12 апреля 2011

0.866 - это RGB в процентах, поделенном на 100. На каждом компьютере Mac есть очень хорошая стандартная программа, расположенная в Приложениях / Утилитах, которая называется DigitalColor Meter.Выберите RGB как процент в раскрывающемся меню.Наведите курсор мыши на цвет, и он покажет вам процентное значение красного, зеленого и синего.Если он дает вам R% 76,5, вы используете 0,765.

3 голосов
/ 07 марта 2011

Для получения дополнительной информации о CGGradient, обратитесь к справочнику для разработчиков

Но для быстрого обзора имеющегося у вас объекта компоненты есть значения RGB + Alpha для двухцвета в градиенте

Цвет 1 = 1,1,1,1

Цвет 2 = 0,866,0,866,0,866,1

Расположение объект по умолчанию используется по умолчанию, поэтому ничего особенного там не происходит

Больше информации о конструкторе , который вы используете , который должен помочь вам разобраться с остальным ... Удачи!

2 голосов
/ 18 апреля 2011

Градиент для бейджей

-(void) drawRoundedRectWithContext:(CGContextRef)context withRect:(CGRect)rect{
CGFloat radius = CGRectGetMaxY(rect)*self.badgeCornerRoundness;
CGFloat puffer = CGRectGetMaxY(rect)*0.10;

CGFloat maxX = CGRectGetMaxX(rect) - puffer;
CGFloat maxY = CGRectGetMaxY(rect) - puffer;
CGFloat minX = CGRectGetMinX(rect) + puffer;
CGFloat minY = CGRectGetMinY(rect) + puffer;

CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();

 CGFloat locations[3] = { 0.0, 0.5, 1.0 };
 CGFloat colors[] =
 {
 255.0 / 255.0, 200.0 / 255.0, 200.0 / 255.0, 1.00,
 230 / 255.0,  0.0 / 255.0, 0.0 / 255.0, 1.00,
 190 / 255.0,  0.0 / 255.0, 0.0 / 255.0, 1.00,
 };
CGGradientRef gradient = CGGradientCreateWithColorComponents(rgb, colors, locations, 3);
CGColorSpaceRelease(rgb);

CGContextBeginPath(context);
CGContextAddArc(context, maxX-radius, minY+radius, radius, M_PI+(M_PI/2), 0, 0);
CGContextAddArc(context, maxX-radius, maxY-radius, radius, 0, M_PI/2, 0);
CGContextAddArc(context, minX+radius, maxY-radius, radius, M_PI/2, M_PI, 0);
CGContextAddArc(context, minX+radius, minY+radius, radius, M_PI, M_PI+M_PI/2, 0);
// Close the path
CGContextClosePath(context);              

CGContextSaveGState(context);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, CGPointMake(minX,minY), CGPointMake(minX,maxY), kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation);
CGContextRestoreGState(context);

}

...