0

我创建了一个名为 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

4 回答 4

1

您可能需要调用setNeedsDisplay您的自定义 UIView 子类:

- (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需要重绘的刺激。有关更多信息,请参阅文档

于 2013-10-28T15:51:34.937 回答
1

根据要求发布为单独的答案:

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

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

因为我忽略了调用[super setNeedsDisplay],所以 drawRect 从来没有被调用过,也没有绘制任何东西。所以这修复了它:

- (void)setNeedsDisplay
{
    [super setNeedsDisplay];
    NSLog(@"Redrawing info: %@", [_info description]);
}
于 2013-10-29T11:53:13.690 回答
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];
    }
于 2013-10-28T15:43:12.673 回答
0

那么在你的drawrect方法中包括这一行: -

        [super drawRect:rect];
于 2013-10-28T16:49:28.410 回答