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:

2番目のオプションを実行したいようです。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()、特定のメソッドから呼び出された場合、または を呼び出して新しいものを作成した場合にのみ、有効なコンテキストを返します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 に答える