【问题标题】:iPhone - Help with CGGradientCreateWithColorComponents and creating gradient as per screenshotiPhone - 帮助 CGGradient CreateWith 颜色组件并根据屏幕截图创建渐变
【发布时间】: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);

【问题讨论】:

    标签: iphone objective-c gradient quartz-graphics cgcolor


    【解决方案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);
      

      }

      【讨论】:

        猜你喜欢
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 2011-04-23
        • 2012-12-20
        • 2018-06-20
        • 1970-01-01
        相关资源
        最近更新 更多