Ошибка 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 к другому (кажется).