0

CGContextEOFillPathを使って、角丸四角形の中に穴の開いた四角形を描画することに成功しました。形の色を変えることができます。ただし、グラデーションを使用したいのですが、CGContextDrawLinearGradient を使用する必要があると思いますが、機能させることはできません。穴も含めて四角形全体を塗り続けます。

これが私が使用しているコードです

- (void)drawRect:(CGRect)rect 
{
[super drawRect:rect];

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGFloat frameWidth = 1; //[CQMFloatingContentOverlayView frameWidth];

CGFloat radius = [self cornerRadius];
CGSize viewSize = [self frame].size;
CGPathRef path = CQMPathCreateRoundingRect(CGRectMake(frameWidth, frameWidth,
                                                      viewSize.width - frameWidth * 2,
                                                      viewSize.height - frameWidth * 2),
                                 radius, radius, radius, radius);
CGContextAddRect(context, CGRectMake(0, 0, viewSize.width, viewSize.height));
CGContextAddPath(context, path);
    CGContextEOFillPath(context);
CGPathRelease(path);
CGContextRestoreGState(context);
}


CGPathRef CQMPathCreateRoundingRect(CGRect rect, CGFloat blRadius, CGFloat brRadius, CGFloat trRadius, CGFloat tlRadius) {
CGPoint tlPoint = rect.origin;
CGPoint brPoint = CGPointMake(rect.origin.x + rect.size.width,
                              rect.origin.y + rect.size.height);
CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, tlPoint.x + tlRadius, tlPoint.y);
CGPathAddArcToPoint(path, NULL,
                    brPoint.x, tlPoint.y,
                    brPoint.x, tlPoint.y + trRadius,
                    trRadius);
CGPathAddArcToPoint(path, NULL,
                    brPoint.x, brPoint.y,
                    brPoint.x - brRadius, brPoint.y,
                    brRadius);
CGPathAddArcToPoint(path, NULL,
                    tlPoint.x, brPoint.y,
                    tlPoint.x, brPoint.y - blRadius,
                    blRadius);
CGPathAddArcToPoint(path, NULL,
                    tlPoint.x, tlPoint.y,
                    tlPoint.x + tlRadius, tlPoint.y,
                    tlRadius);
CGPathCloseSubpath(path);

return path;
}

グラデーション コードをどこに配置すればよいかわかりません。CGContextEOFillPath の前後で試しましたが、目的を達成できませんでした。

4

1 に答える 1

0

このコードはあなたが望むものを作るはずです(構文とタイプミスをチェックしてください、コードは答えに直接書かれています)

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGFloat gradientColors[] =
    {        
        0.1, 0.1, 0.5, 1.00,
        0.9, 0.9, 1.0, 1.00,
    };

    CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradientColors, NULL, sizeof(gradientColors)/(sizeof(gradientColors[0])*4));

    CGColorSpaceRelease(colorSpace);

    CGContextSaveGState(context);
    CGFloat frameWidth = 1; //[CQMFloatingContentOverlayView frameWidth];

    CGFloat radius = [self cornerRadius];
    CGSize viewSize = [self frame].size;
    CGPathRef path = CQMPathCreateRoundingRect(CGRectMake(frameWidth, frameWidth,
                                                      viewSize.width - frameWidth * 2,
                                                      viewSize.height - frameWidth * 2),
                                     radius, radius, radius, radius);
    CGContextAddRect(context, CGRectMake(0, 0, viewSize.width, viewSize.height));
    CGContextAddPath(context, path);
    CGContextEOClip(context);

    CGContextDrawLinearGradient(context, gradient, CGPointMake(0, 0),           CGPointMake(viewSize.width, viewSize.height), kCGGradientDrawsBeforeStartLocation);


CGPathRelease(path);
    CGContextRestoreGState(context);
}
于 2012-10-05T06:30:20.310 に答える