Ошибка setNeedsDisplayInRect в iOS5?

Я пытаюсь использовать 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 ответ

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

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

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

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

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

Другие вопросы по тегам