1

我正在使用最新的 SDK 开发 iOS 5.0+ 应用程序。

我对 CoreGraphics 非常陌生,我不知道如何在CALayer.

我发现我必须使用CGContextDrawRadialGradient来绘制辐射渐变。

在 Google 上搜索,我看到我必须将辐射渐变添加到 CALayer 的内容中,但要绘制它,我需要一个CGContext,我不知道如何获取它CGContext

你知道我该怎么做吗?

我找到了本教程,但它也使用CGContext.

我的代码是这样的:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIView *testView;

@end

执行:

#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>

@interface ViewController ()

- (void)drawRadiantGradient;

@end

@implementation ViewController

@synthesize testView = _testView;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self drawRadiantGradient];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)drawRadiantGradient
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGFloat redBallColors[] = {
        1.0, 0.9, 0.9, 0.7,
        1.0, 0.0, 0.0, 0.8
    };
    CGFloat glossLocations[] = {0.05, 0.9};
    CGGradientRef ballGradient = CGGradientCreateWithColorComponents(colorSpace, redBallColors, glossLocations, 2);
    CGRect circleBounds = CGRectMake(20, 250, 100, 100);
    CGPoint startPoint = CGPointMake(50, 270);
    CGPoint endPoint = CGPointMake(70, 300);
    CGContextDrawRadialGradient(context, ballGradient, startPoint, 0, endPoint, 50, 0);
    CGContextAddEllipseInRect(context, circleBounds);
    CGContextDrawPath(context, kCGPathStroke);
}

我想创建一个CALayer,绘制一个辐射渐变,并将其添加CALayer_testView.

4

3 回答 3

1

您可以绘制到自己的上下文中(例如,您使用创建的图像上下文UIGraphicsBeginImageContextWithOptions()

或者

成为该层的代表并使用绘制到层图形上下文中drawLayer:inContext:

在我看来,你想做第二种选择。您将创建 CALayer 并将自己设置为委托。然后实现drawLayer:inContext:并使用上下文作为参数传递的上下文。

设置

CALayer *yourLayer = [CALayer layer];
// other layer customisation
yourLayer.delegate = self;

并画

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    // Check that the layer argument is yourLayer (if you are the 
    // delegate to more than one layer)

    // Use the context (second) argument to draw.
}
于 2013-04-12T08:03:47.050 回答
1

UIGraphicsGetCurrentContext()从特定方法调用或您通过调用创建一个新的 fe 时,唯一返回一个有效的上下文UIGraphicsBeginImageContext()

因此,您需要做的是子类 a并用您方法中的代码UIView覆盖它的方法。或者您可以使用协议提供的委托方法。只需将图层的委托设置为您的 vc 并实现该方法。这可能看起来像这样:drawRect:drawRadiantGradientCALayerDelegatedrawLayer:inContext:

在您的 .h 文件中:

@interface MyVC : UIViewController
@property (weak, nonatomic) IBOutlet UIView *drawingView;    
/...

在你的 .m 文件中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.drawingView.layer.delegate = self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context
{
    [self drawRadiantGradientInContext:context];
}
于 2013-04-12T08:11:14.950 回答
0

创建一个 UIView 的自定义子类,在其drawRect:方法中绘制渐变,并让您的 VC 创建一个径向渐变视图并将其添加为其视图的子视图。

于 2013-04-12T08:02:27.980 回答