頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


CALayerだとベジェ曲線が描けない

UIBezierPathクラスってあるじゃない。これベジェ曲線を描く時に使ってるんだけどさ。
今までUIViewクラスのdrawRect:メソッド内で使ってたのよ、こんな感じで。
-(void)drawRect:(CGRect)rect
{
    UIBezierPath *bezierPath = [UIBezierPath bezierPath];
    [bezierPath moveToPoint:(CGPoint){10,100}];
    [bezierPath addCurveToPoint:(CGPoint){310,200} controlPoint1:(CGPoint){200,100} controlPoint2:(CGPoint){150,200}];
    bezierPath.lineWidth = 1.f;
    UIColor *bezierLineColor = [UIColor redColor];
    [bezierLineColor setStroke];
    [bezierPath stroke];
}
これはいいんだけど、UIViewじゃなくてCALayerのサブクラスで描こうとしたのよ。
そしたら表示されなくて、コンソールにやたらとメッセージが出てきちゃってさ。

警告メッセージ

CGContextSetStrokeColorWithColor: invalid context 0x0. This is a serious error. This application, or a library it uses, is using an invalid context and is thereby contributing to an overall degradation of system stability and reliability. This notice is a courtesy: please fix this problem. It will become a fatal error in an upcoming update.

↑contextうんぬんかあ。もしかしてUIViewのサブクラスじゃないとダメなの?とか思って調べてみたら、ありがたいことにこういうページがあったのよ。
ios - CALayer subclass "drawInContext" called but not drawing? - Stack Overflow
まあいつものStack Overflowだけどさ。

-(void)drawInContext:(CGContextRef)context
{
    UIGraphicsPushContext(context);//追加

    UIBezierPath *bezierPath = [UIBezierPath bezierPath];
    [bezierPath moveToPoint:(CGPoint){10,100}];
    [bezierPath addCurveToPoint:(CGPoint){310,200} controlPoint1:(CGPoint){200,100} controlPoint2:(CGPoint){150,200}];
    bezierPath.lineWidth = 1.f;
    UIColor *bezierLineColor = [UIColor blueColor];
    [bezierLineColor setStroke];
    [bezierPath stroke];
   
    UIGraphicsPopContext();//追加
}
そうなのか、挟むだけでいいのか。

CALayerで描いたベジェ曲線

これでなんとかCALayer内の drawInContext: でも描くことができたよ。

ちなみに、ラインのalpha値はどうするのよ?!って一瞬なったんだけど、よく考えたらUIColorってalpha値まで設定できるの忘れてたよ。
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
↑こういうのあったよね。
めでたし、めでたし!

<< なぜかCALayerのdrawInContext:が呼び出されない  TopPage  Xcodeから実機テスト時にいつもアンロックしろと怒られる >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/861-9e7b46a4




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad