uiview 子类在第一次调用 setneedsdisplay 时显示为黑色矩形,但在那之后就可以了

Posted

技术标签:

【中文标题】uiview 子类在第一次调用 setneedsdisplay 时显示为黑色矩形,但在那之后就可以了【英文标题】:uiview subclass showing up as black rectangles first time setneedsdisplay is called, but ok after that 【发布时间】:2013-04-07 20:58:15 【问题描述】:

我有一个覆盖 drawrect 的自定义 UIView 子类。视图从数据源获取数据,并将其中的一些信息传递给它的委托视图控制器,以将其处理成需要绘制的字符串。第一次调用 setneedsdisplay 时,视图显示为黑色矩形,但如果第二次调用它就可以正常工作。所有的帧大小和位置都已正确设置,因此我确信代理和数据源从一开始就已正确设置。这是有问题的drawrect代码:

- (void)drawRect:(CGRect)rect


    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetLineWidth(context, 2.0);
    CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = 0, 0, 0, 1.0;
    CGColorRef color = CGColorCreate(colorSpace, components);
    ;
    //CGContextStrokeRect(context, CGRectMake(1, 1, self.frame.size.width-1.0, self.frame.size.height-1.0));

    CGContextMoveToPoint(context, 0, [_delegate denominatorPoint:self].y);
        if ([_delegate numeratorBiggerThanDenominator:self]==YES) 
    CGContextAddLineToPoint(context,[[_delegate numeratorString:self]sizeWithFont:[_delegate fontToDrawWith:self]].width , [_delegate denominatorPoint:self].y);
        else
            CGContextAddLineToPoint(context,[[_delegate denominatorString:self]sizeWithFont:[_delegate fontToDrawWith:self]].width , [_delegate denominatorPoint:self].y);
    if ([_delegate hasAFraction:self]==YES) 


    CGContextSetStrokeColorWithColor(context, color);


    CGContextStrokePath(context);

    

    CGColorSpaceRelease(colorSpace);
    CGColorRelease(color);



    self.backgroundColor=[UIColor clearColor];


    [[_delegate numeratorString:self] drawAtPoint:[_delegate numeratorPoint:self] withFont:[_delegate fontToDrawWith:self]];
    NSLog([_delegate numeratorString:self]);
    if ([_delegate hasAFraction:self]==YES) 
        [[_delegate denominatorString:self] drawAtPoint:[_delegate denominatorPoint:self] withFont:[_delegate fontToDrawWith:self]];
    [[_delegate Variable:self] drawAtPoint:[_delegate variablePoint:self] withFont:[_delegate fontToDrawWith:self]];
    if ([_delegate hasAParenthesTerm:self]==YES) 
        //NSLog(@"parentheses being drawn");
        NSString* openParentheses=@" (";
        [openParentheses drawAtPoint:[_delegate openParenthesesPoint:self] withFont:[_delegate fontToDrawWith:self]];
        NSString* closedParentheses=@")";
        [closedParentheses drawAtPoint:[_delegate closeParenthesesPoint:self] withFont:[_delegate fontToDrawWith:self]];
    


如果有其他代码可以帮助解决这个问题,请告诉我。

【问题讨论】:

【参考方案1】:

您是否尝试将 self.backgroundColor = [UIColor clearColor]; 移至 init 方法?

无论如何,您应该只需要运行该行一次,我可以想象在 draw 方法的中间调用它可能会导致问题(并且在第二次调用 drawRect 时,backgroundColor 已经设置为clearColor,所以 UIView 可以忽略它,让你的问题在第二个 setNeedsDisplay 调用中消失)

【讨论】:

完全成功,太棒了!尽管对我来说,它会在第二个 setneeds 显示期间起作用,但仍然很神秘。 很高兴它有帮助!正如我所提到的,这可能是因为 UIView 可以在第二次调用 drawRect 时忽略该行,因为您没有更改那里的颜色 好吧,显然我不是一个非常细心的读者。可能是什么让我首先陷入困境!

以上是关于uiview 子类在第一次调用 setneedsdisplay 时显示为黑色矩形,但在那之后就可以了的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIView 子类调用 UIViewController?

drawRect 在 UIView 子类上被调用,但不在 UIViewController 上

XIB 中的 UIView 子类不显示(drawRect:从未调用)

如何在不使用 Nib 的情况下实例化和调用 UIView 子类

如何让 UITableViewCell 在自定义 UIView 子类上调用 setHighlighted 或 setSelected?

iOS:UIView子类init会调用[super init]然后调用超类中的方法,为啥会调用[subclass initWithFrame:xx]?