Ошибка setNeedsDisplayInRect в iOS5? - PullRequest
2 голосов
/ 15 февраля 2012

Я пытаюсь использовать setNeedsDisplayInRect: в iOS5 для оптимизации кода рисования.Настройка проста: у меня есть массив «горячих точек» CGRect, которые функционируют как кнопки.Когда касание обнаружено, я нахожу CGRect, в котором оно произошло, и вызываю setNeedsDisplayInRect: в представлении с этим прямоугольником в качестве параметра.Все CGRects действительны для вида - он использует их для первоначального рисования, и это получается правильно.

То, что я вижу (как показывает дамп консоли ниже), это первый вызов setNeedsDisplayInRect:передает видовой кадр как прямоугольник, а не прямоугольник, который я указал.Последующие звонки верны.

Кто-нибудь может подтвердить это как ошибку или увидеть, что я здесь что-то делаю неправильно?Весь код ниже.- Спасибо!

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


}

1 Ответ

2 голосов
/ 01 апреля 2012

У меня тоже есть эта проблема.Я сузил это до следующей ситуации:

Кажется, что это происходит, когда я переключаюсь с одного UIView на второй.В моем случае пользователь выбирает инструмент рисования в одном UIView, затем рисует на подложке UIView (холст).

Кажется, что первоначальный штрих меняет прямоугольник, полученный в drawRect, с того, что вы вставили вполный размер представления.После того, как эти один или два drawRects были нарисованы, это не меняет того, что вы там поместили.

Я могу доказать, что это setNeedsDisplayInRect, потому что, если я прокомментирую оскорбительную строку, drawRect больше не будет вызываться.Прямоугольник непосредственно перед вызовом показывает соответствующий суб прямоугольник для обновления, прямоугольник в drawRect показывает другой прямоугольник.

Опять же, это происходит только при первоначальном переходе от одного UIView к другому (кажется).

...