使用作为参数传递的UIColor设置CGContextSetStrokeColorWithColor

时间:2014-05-14 22:32:33

标签: ios objective-c quartz-graphics uicolor

我的代码存在问题。我无法将圆圈设置为构造函数中传递的颜色。当它运行时,我收到以下错误," 由于未捕获的异常终止应用' NSInvalidArgumentException',原因:' -CGColor没有为UIColor定义;需要先转换色彩空间。'"这是我的代码

MainViewController.m

#import "CircleGenerator.h"
CircleGenerator *newCircle =[[CircleGenerator alloc]initWithFrame:frame initWithColor:[UIColor blackColor];

CircleGenerator.h

@property(nonatomic, strong) UIColor *circleColor;

- (id)initWithFrame:(CGRect)frame initWithColor:(UIColor*)color;

CircleGenerator.m

   - (id)initWithFrame:(CGRect)frame initWithColor:(UIColor *)color
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _circleColor = [[UIColor alloc]init];
        _circleColor = color;

        NSLog(@"the color is %@", _circleColor);

    }
    return self;
}


- (void)drawRect:(CGRect)rect
{


    // Init a CGContecRef
    CGContextRef context = UIGraphicsGetCurrentContext();
    // Makes circle a bit smaller then the rectange to prevent it from getting cut off
    CGRect border = CGRectInset(rect, 5, 5);
    // Draws circle
    CGContextAddEllipseInRect(context, border);
    // Changes the color of the line
    CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);
    // Sets the line to the appropriate thickness
    CGContextSetLineWidth(context, 5.0);
    // Draws the circle onto the UIView
    CGContextStrokePath(context);

}

我遇到了来自CircleGenerator.m的以下行的问题

        CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);

如果我用[UIColor blackColor]代替_circleColor,代码编译没有任何问题。我的错误做了什么想法?

3 个答案:

答案 0 :(得分:1)

替换:

 CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);

使用:

CGColorRef redRef = CFRetain(_circleColor.CGColor);
CGContextSetStrokeColorWithColor(context, [_circleColor CGColor]);
// use redRef and when done release it:
CFRelease(redRef)

修改:

查看此链接如何解决问题Accessing CGThings from NSThings or UIThings

答案 1 :(得分:1)

  

_circleColor = [[UIColor alloc] init];

这将返回类UIPlaceholderColor的实例,并且可能没有关于制作CGColor所需的颜色空间的信息。

尝试_circleColor = [UIColor clearColor];

您应该使用指定的初始值设定项创建颜色,或使用预设的颜色,如[UIColor blackColor]。

答案 2 :(得分:0)

什么调用你的init构造函数减少了颜色的保留计数。由于您通过直接指定_circleColor来绕过颜色的设置器,因此赋值不会增加保留计数 - 从而导致悬空指针。

_circleColor = color;替换为self.circleColor = color;