2013-04-07 2 views
1

У меня есть пользовательский подкласс UIView, который переопределяет drawrect. Представление получает свои данные из источника данных и передает часть этой информации своему делегату, контроллеру представления, для обработки его в строки, которые ему нужно рисовать. В первый раз, когда вызывается setneedsdisplay, представление отображается как черный прямоугольник, но он отлично работает, если он называется второй раз. Все размеры и позиции кадра устанавливаются правильно, поэтому я уверен, что делегат и источник данных правильно настроены с самого начала. Вот код обижая DrawRect:Подкласс uiview, показывающий, как черные прямоугольники первый раз setneedsdisplay вызывается, но нормально после этого

- (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* [email protected]" ("; 
     [openParentheses drawAtPoint:[_delegate openParenthesesPoint:self] withFont:[_delegate fontToDrawWith:self]]; 
     NSString* [email protected]")"; 
     [closedParentheses drawAtPoint:[_delegate closeParenthesesPoint:self] withFont:[_delegate fontToDrawWith:self]]; 
    } 

} 

Позвольте мне знать, если есть другой код, который помог бы пролить свет на эту проблему.

ответ

3

Вы попытались переместить self.backgroundColor = [UIColor clearColor]; в метод init?

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

+0

полностью работал, потрясающе! все еще таинственный, что он будет работать во время второго показа, хотя и для меня. – chartman

+0

Рад, что это помогло! Как я уже упоминал, вероятно, потому, что UIView может игнорировать эту строку во втором вызове drawRect, потому что вы не меняете цвет – baris

+0

Правильно, по-видимому, я не очень осторожный читатель. Наверное, что привело меня в беду, в первую очередь! – chartman