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 颜色组件并根据屏幕截图创建渐变的主要内容,如果未能解决你的问题,请参考以下文章
对于 Uiimageview 如何在 ios swift 4 中将 CGgradient 背景颜色设置为背景颜色?