iPhone - 帮助 CGGradient CreateWith 颜色组件并根据屏幕截图创建渐变

Posted

技术标签:

【中文标题】iPhone - 帮助 CGGradient CreateWith 颜色组件并根据屏幕截图创建渐变【英文标题】:iPhone - Help with CGGradientCreateWithColorComponents and creating gradient as per screenshot 【发布时间】:2011-03-07 03:49:28 【问题描述】:

我正在尝试使用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);

【问题讨论】:

【参考方案1】:

我玩过它并得到了这张照片:

颜色:

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];
 

我不知道它是否足够接近。

【讨论】:

【参考方案2】:

0.866 是 RGB 除以 100 的百分比。 在位于 Applications/Utilities 中的每台 mac 计算机上都有一个非常好的标准程序,称为 DigitalColor Meter。在下拉菜单中选择 RGB 作为百分比。将鼠标放在颜色上,它会显示红色、绿色和蓝色的百分比值。如果它给你 R% 76.5,你使用 0.765。

【讨论】:

谢谢,这正是我所需要的。你能帮我复制附图吗?我一直试图让它尽可能接近,但事实证明它有点难以复制。【参考方案3】:

如需进一步了解 CGGradient,请查看developer reference

但为了快速浏览,您拥有的 components 对象具有渐变中两种颜色的 RGB + Alpha 值

颜色 1= 1,1,1,1

颜色 2= 0.866,0.866,0.866,1

locations 对象基本上是默认对象,所以没有什么特别之处

有关constructor you are using 的更多信息应该可以帮助您掌握其余部分...祝您好运!

【讨论】:

我正在尝试使用具有 RGB 值的颜色选择器来解决这个问题。但是 RGB 值只能达到 255,所以我很困惑为什么它们会是 0.866?【参考方案4】:

徽章渐变

-(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);

【讨论】:

以上是关于iPhone - 帮助 CGGradient CreateWith 颜色组件并根据屏幕截图创建渐变的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 CGGradient 获得 CGColor 吗?

对于 Uiimageview 如何在 ios swift 4 中将 CGgradient 背景颜色设置为背景颜色?

iOS Quartz2D 渐变图形 CGGradient CGShading

内置(AJAX)帮助文档

使用Fiddler对IPhone手机的应用数据进行抓包分析

iPhone 开发 - NSInternalInconsistencyException 帮助?