0

谁能帮我用 CoreGraphics 绘制一个特定的渐变?只要给出线索就足够了。示例代码应该得到我最深切的尊重。我需要这个形状:

在此处输入图像描述

我尝试了以下代码:

-(UIImage *)imageWithGradientBorder
{
    CGRect rect=CGRectMake(0, 0, self.size.width, self.size.height);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
    CGContextRef ctx= CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, 8, rect.size.width, colorSpace, kCGImageAlphaNone);
    CGGradientRef glossGradient;
    size_t num_locations = 4;
    CGFloat locations[4] = { 0.0, 0.1, 0.9, 1.0 };
    CGFloat components[16] = { 0, 0, 0, 1, 1.0, 1.0, 1.0, 1, 1.0, 1.0, 1.0, 1, 0, 0, 0, 1};
    glossGradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, num_locations);
    CGRect currentBounds = rect;

    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMaxY(currentBounds));
    topCenter = CGPointMake( 0.0f, CGRectGetMidY(currentBounds));
    midCenter = CGPointMake(CGRectGetMaxX(currentBounds), CGRectGetMidY(currentBounds));

    CGContextDrawLinearGradient(ctx, glossGradient, topCenter, midCenter, 0);
    CGImageRef mask = CGBitmapContextCreateImage(ctx);
    CGContextRelease(ctx);
    CGImageRef maskedImageRef = CGImageCreateWithMask([self CGImage], mask);
    CGImageRelease(mask);
    UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef];
    CGImageRelease(maskedImageRef);
    return maskedImage;
}

但它仅从左侧绘制渐变。

4

4 回答 4

1
topCenter = CGPointMake( 0.0f, CGRectGetMidY(currentBounds));
midCenter = CGPointMake(CGRectGetMaxX(currentBounds), CGRectGetMidY(currentBounds));

这两个变量的名称具有误导性,它们并不是真正的中上和中中,而是中左和中右。所以当你打电话时:

CGContextDrawLinearGradient(ctx, glossGradient, topCenter, midCenter, 0);

您正在从左到右绘制渐变。

您需要做什么来组织您的点并绘制渐变 4 次(L->R、R->L、T->B、B->T)。根据您希望角落看起来像什么,您可能需要在每个渐变绘制之间进行一些遮罩,以防止渐变一直绘制到角落。

于 2013-09-20T14:50:37.720 回答
0

好的,我已经制作了一种解决方法。

CGContextRef currentContext = UIGraphicsGetCurrentContext();
CGContextRef context = currentContext;
CGContextSaveGState(currentContext);
CGFloat colStep = 255 / borderWidth / 10;
colStep = colStep / 255;
for (int i = 0; i < floor(borderWidth * 10); i++) {
    CGContextSetFillColorWithColor(context, [UIColor colorWithWhite:colStep*i alpha:1].CGColor);
    CGFloat delta = i / 10;
    CGRect rectToDraw = CGRectMake(delta,delta,rect.size.width - delta * 2,rect.size.height - delta * 2);
    CGContextFillRect(context, rectToDraw);
}


CGContextRestoreGState(currentContext);
于 2013-09-21T19:19:42.307 回答
0

对于原始问题,其他答案更好,但如果您不需要使用 CoreGraphics 进行绘制,您可能需要考虑使用资产目录进行图像切片。您可以在图形程序中创建渐变和角,并在 Xcode 中调整其大小。 https://developer.apple.com/library/ios/recipes/xcode_help-image_catalog-1.0/chapters/SlicinganImage.html

于 2016-05-06T03:02:28.140 回答
0
于 2017-05-06T09:19:19.770 回答