UIView不显示和drawRect方法从不调用

时间:2013-10-28 15:31:44

标签: objective-c uiview core-graphics drawrect cgcontext

我创建了一个名为MiniView的UIView子类。

我尝试将它添加到我的viewController中,如下所示:

@interface SomeViewController ()

@property (strong, nonatomic) MiniView *miniView;

@end

- (void)viewDidLoad
        {
        [super viewDidLoad];

        self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
        _miniView.backgroundColor = [UIColor blackColor];
        [self.view addSubview:_miniView];
    }

MiniView类看起来像这样:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    NSLog(@"DRAW RECT");
    CGContextRef context = UIGraphicsGetCurrentContext();
    UIColor * redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];
    CGContextSetFillColorWithColor(context, redColor.CGColor);
    CGContextFillRect(context, self.bounds);
}

但是drawRect永远不会被调用,除非我明确地在setNeedsLayout方法中调用它。它也没有任何吸引力。我试过在drawRect方法中添加一个UIImageView,看起来很好。但上面的代码什么也没有产生。

我也得到错误:

  

:CGContextSetFillColorWithColor:无效的上下文0x0。这是   一个严重的错误。此应用程序或它使用的库正在使用   无效的上下文,从而导致整体退化   系统稳定性和可靠性。这个通知是礼貌的:拜托   解决这个问题。在即将到来的更新中,它将成为一个致命的错误。

如果我在drawRect方法中打印一个日志语句并输出'rect'值,它在200 x 200时是正确的,所以我不知道为什么上下文是0x0。

所以一个问题是从不调用drawRect,另一个问题是如果我明确地调用它,则不显示任何内容......

4 个答案:

答案 0 :(得分:1)

您可能需要在自定义UIView子类上调用setNeedsDisplay

- (void)viewDidLoad {
    [super viewDidLoad];

    self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
    _miniView.backgroundColor = [UIColor blackColor];
    [_miniView setNeedsDisplay];    // Added this
    [self.view addSubview:_miniView];
}

这基本上是告诉系统需要重新绘制UIView的一种方法。有关详细信息,请参阅the docs

答案 1 :(得分:1)

按要求发布单独答案:

实际问题是我在MiniView类中重新定义了setNeedsDisplay方法,如下所示:

- (void)setNeedsDisplay
{
    NSLog(@"Redrawing info: %@", [_info description]);
}

因为我忽略了对[super setNeedsDisplay]的调用,所以drawRect从未被调用过,没有任何东西在绘制。所以这解决了它:

- (void)setNeedsDisplay
{
    [super setNeedsDisplay];
    NSLog(@"Redrawing info: %@", [_info description]);
}

答案 2 :(得分:0)

永远不要调用drawRect表达,试试这个:

- (void)viewDidLoad
        {
        [super viewDidLoad];

        self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
        _miniView.backgroundColor = [UIColor blackColor];
        [self.view addSubview:_miniView];

        [_miniView setNeedsDisplay];
    }

答案 3 :(得分:0)

在你的直接方法中包括这一行: -

        [super drawRect:rect];