2012-02-15 4 views
2

일부 드로잉 코드를 최적화하기 위해 iOS5에서 setNeedsDisplayInRect:을 사용하려고합니다. 셋업은 간단합니다 : 버튼으로 작동하는 CGRect '핫스팟'배열이 있습니다. 터치가 감지되면 CGRect가 발생한 것을 발견하고 그 rect를 param으로 볼 때 setNeedsDisplayInRect:을 호출합니다. 모든 CGRect는 뷰에 유효합니다.이 뷰는 초기 그리기 작업을 수행하는 데 사용되며 올바르게 출력됩니다.setNeedsDisplayInRect iOS5의 버그?

콘솔 덤프 (콘솔 덤프)에서 볼 수 있듯이 setNeedsDisplayInRect:의 첫 번째 호출은 내가 지정한 rect가 아닌 rect로 뷰 프레임을 전달합니다. 후속 통화가 올바른 것입니다.

누구나 버그로 확인하거나 내가 잘못하고있는 것을 볼 수 있습니까? 모든 코드는 아래와 같습니다. -- 감사!

WRONG -> drawRect with rect 0.000000 0.000000 70.000000 660.000000 
drawRect with rect 15.000000 260.000000 40.000000 40.000000 
drawRect with rect 15.000000 310.000000 40.000000 40.000000 
drawRect with rect 15.000000 360.000000 40.000000 40.000000 
drawRect with rect 15.000000 410.000000 40.000000 40.000000 
drawRect with rect 15.000000 460.000000 40.000000 40.000000 
drawRect with rect 15.000000 510.000000 40.000000 40.000000 
drawRect with rect 15.000000 410.000000 40.000000 40.000000 
drawRect with rect 15.000000 310.000000 40.000000 40.000000 
drawRect with rect 15.000000 260.000000 40.000000 40.000000 
drawRect with rect 15.000000 110.000000 40.000000 40.000000 
drawRect with rect 15.000000 610.000000 40.000000 40.000000 
drawRect with rect 15.000000 510.000000 40.000000 40.000000 



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 

UITouch *touch = [touches anyObject]; 
CGPoint point = [touch locationInView:self.view]; 

    CGRect rect; 
    int cnt = self.barNoteArray.count; 
    for (int i = 0; i < cnt; i++) { 
     rect = [[self.barNoteArray objectAtIndex:i] cellRect]; 
     if (CGRectContainsPoint(rect, point)) { 

      self.bar.highlightIndex = 1; 
      [self.bar setNeedsDisplayInRect:rect]; 

      break; 
     } 
    } 
} 



- (void)drawRect:(CGRect)rect 
{ 
if (highlightIndex){ 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor); 
    CGContextAddRect(context, rect); 
    CGContextFillPath(context); 

    highlightIndex = 0; 

    printf("drawRect with rect %f %f %f %f \n", rect.origin.x, 
      rect.origin.y, 
      rect.size.width, 
      rect.size.height); 
} else { 
    // other drawing code 


} 

답변

2

이 문제도 발생합니다. 나는 다음과 같은 상황으로 그것을 좁혔다 :

내가 한 UIView에서 두 번째로 이동하는 것 같습니다. 필자의 경우 사용자가 한 UIView에서 페인팅 도구를 선택한 다음 언더 레이 UIView (캔버스)를 그립니다.

초기 획이 drawRect에서받은 rect를 전체보기 크기로 바꾸는 것 같습니다. 일단 하나 또는 두 개의 drawRect가 그려지면, 거기에 넣은 것을 변경하지 않습니다.

나는 setNeedsDisplayInRect임을 증명할 수 있습니다. 문제가되는 라인에 주석을 달아 drawRect가 더 이상 호출되지 않기 때문입니다. 호출 직전의 rect는 업데이트 할 적절한 sub rectangle을 보여 주며, drawRect의 rect는 다른 사각형을 보여줍니다.

다시 한 가지 UIView에서 다른 UIView로 이동하는 경우에만 발생합니다 (보이는 것처럼 보입니다).