2013-04-07 3 views
1

drawrect를 재정의하는 사용자 정의 UIView 하위 클래스가 있습니다. 뷰는 데이터 소스에서 데이터를 가져 와서 해당 정보 중 일부를 뷰 컨트롤러 인 대리자로 전달하여 그리기에 필요한 문자열로 처리합니다. 처음 setneedsdisplay가 호출되면 뷰는 검은 색 사각형으로 나타나지만 두 번째 호출하면 제대로 작동합니다. 모든 프레임 크기 및 위치가 올바르게 설정되어 대리자 및 데이터 소스가 제대로 설정되어 있는지 확인합니다. 문제에 빛나는 빛을 도움이 될 다른 코드가있는 경우uview 서브 클래스가 처음으로 setneedsdisplay가 호출 될 때 검정색 사각형으로 표시되지만 그 후에는 ok

- (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]]; 
    } 

} 

가 알려줘 다음은 위반의 drawRect 코드입니다.

답변

3

self.backgroundColor = [UIColor clearColor];을 초기화 메소드로 이동 했습니까?

어쨌든 한 번만 해당 선을 실행하면되고 그리기 방법의 중간에 호출하면 문제가 발생할 수 있다고 생각할 수 있습니다 (drawRect에 대한 두 번째 호출에서 backgroundColor는 이미 clearColor, 그래서 UIView 그것을 무시할 수있는, 두 번째 setNeedsDisplay 호출과 함께 떠날)

+0

완전히 일 했어, 끝내! 여전히 그것이 두 번째 setneeds 동안 나에게 움직일 것 인 신비적인 전시. – chartman

+0

도움이 되니 기쁩니다! 앞서 언급했듯이 UIView는 drawRect에 대한 두 번째 호출에서 해당 줄을 무시할 수 있습니다. 왜냐하면 색상을 변경하지 않기 때문입니다. – baris

+0

맞아요, 분명히 나는 ​​아주 조심성있는 독자가 아닙니다. 아마 내가 처음에 곤경에 처 했을까? – chartman