Подкласс uiview отображается в виде черных прямоугольников при первом вызове setneedsdisplay, но после этого все в порядке

У меня есть собственный подкласс UIView, который переопределяет drawrect. Представление получает свои данные из источника данных и передает часть этой информации своему делегату, контроллеру представления, чтобы преобразовать их в строки, которые ему нужно нарисовать. При первом вызове 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]];
    }

}

Сообщите мне, есть ли другой код, который поможет пролить свет на проблему.


person chartman    schedule 07.04.2013    source источник


Ответы (1)


Вы пробовали перейти self.backgroundColor = [UIColor clearColor]; к методу инициализации?

В любом случае вам нужно запустить эту строку только один раз, и я мог представить, что ее вызов в середине метода рисования может привести к проблеме (а во втором вызове drawRect для backgroundColor уже будет установлено значение clearColor, поэтому UIView может проигнорировать это, и ваша проблема исчезнет с помощью второго вызова setNeedsDisplay)

person baris    schedule 08.04.2013
comment
полностью сработало, круто! все еще загадочно, что он будет работать во время второго набора, хотя мне нужно показывать. - person chartman; 08.04.2013
comment
Рад, что помог! Как я уже упоминал, это, вероятно, потому, что UIView может игнорировать эту строку во втором вызове drawRect, потому что вы не меняете там цвет - person baris; 08.04.2013
comment
Да, видимо, я не очень внимательный читатель. Наверное, из-за чего я вообще попал в беду! - person chartman; 08.04.2013