iOS - иногда вызывается drawRect на неожиданно большом прямоугольнике - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть простое тестовое приложение.Приложение состоит из делегата приложения, контроллера представления и представления.Делегат приложения просто запускает контроллер представления и добавляет его представление в окно.Контроллер представления в свою очередь загружает представление при запуске и больше ничего не делает.Вид выглядит следующим образом:

@implementation MyView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.backgroundColor = [UIColor blackColor];
    }
    return self;
}

- (void)drawRect:(CGRect)rect
{
    static NSDate* prevDate = nil;
    NSDate* now = [NSDate date];
    NSString* timeString = @"";
    if (prevDate) {
        NSTimeInterval dt = [now timeIntervalSinceDate:prevDate];
        timeString = [NSString stringWithFormat:@"%d seconds", (int)dt];
    }
    prevDate = now;
    NSLog (@"drawRect %@ %@", NSStringFromCGRect(rect), timeString);
}

-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch* touch = [touches anyObject];
    CGPoint point = [touch locationInView:self];
    CGRect rect = CGRectMake(point.x, point.y, 40, 40);
    [self setNeedsDisplayInRect:rect];
}

@end

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

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

2011-12-13 12:46:15.004 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 
2011-12-13 12:46:20.197 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 5 seconds
2011-12-13 12:46:23.235 DrawRectTest[1451:707] drawRect {{508, 475}, {40, 40}} 3 seconds
2011-12-13 12:46:27.671 DrawRectTest[1451:707] drawRect {{761, 484}, {40, 40}} 4 seconds
2011-12-13 12:46:36.394 DrawRectTest[1451:707] drawRect {{433, 254}, {40, 40}} 8 seconds
2011-12-13 12:46:51.190 DrawRectTest[1451:707] drawRect {{597, 270}, {40, 40}} 14 seconds
2011-12-13 12:47:04.979 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 13 seconds
2011-12-13 12:47:09.148 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 4 seconds
2011-12-13 12:47:14.314 DrawRectTest[1451:707] drawRect {{414, 480}, {40, 40}} 5 seconds
2011-12-13 12:47:31.343 DrawRectTest[1451:707] drawRect {{551, 503}, {40, 40}} 17 seconds
2011-12-13 12:47:33.639 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 2 seconds
2011-12-13 12:47:35.554 DrawRectTest[1451:707] drawRect {{521, 519}, {40, 40}} 1 seconds
2011-12-13 12:47:41.325 DrawRectTest[1451:707] drawRect {{366, 586}, {40, 40}} 5 seconds
2011-12-13 12:47:50.751 DrawRectTest[1451:707] drawRect {{535, 474}, {40, 40}} 9 seconds
2011-12-13 12:48:01.891 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 11 seconds
2011-12-13 12:49:24.600 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 82 seconds
2011-12-13 12:49:29.514 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 4 seconds
2011-12-13 12:49:30.774 DrawRectTest[1451:707] drawRect {{725, 372}, {40, 40}} 1 seconds
2011-12-13 12:50:04.435 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 33 seconds
2011-12-13 12:50:07.469 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 3 seconds
2011-12-13 12:50:09.417 DrawRectTest[1451:707] drawRect {{824, 471}, {40, 40}} 1 seconds
2011-12-13 12:51:04.550 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 55 seconds
2011-12-13 12:51:06.071 DrawRectTest[1451:707] drawRect {{0, 0}, {1024, 748}} 1 seconds
2011-12-13 12:51:07.809 DrawRectTest[1451:707] drawRect {{453, 557}, {40, 40}} 1 seconds
2011-12-13 12:51:11.776 DrawRectTest[1451:707] drawRect {{510, 370}, {40, 40}} 3 seconds

Если это имеет значение, я спрашиваю, почему я пытаюсь повысить производительность в большом проекте.Одна из причин медлительности - некоторые похожие вызовы drawRect.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

UIViews не гарантируется сохранение или повторное использование какого-либо ранее нарисованного графического содержимого при обновлении или выполнении какого-либо другого рисунка в этом виде в последующем drawRect (предыдущий чертеж был отправлен только для записи в графический процессор). Поэтому любой рисунок, даже крошечной части, может потребовать перерисовки всего вида, чтобы заново создать его содержимое.

Если вы хотите рисовать только в небольшой области, вам нужно рисовать в нечто иное, чем UIView, возможно, в растровом контексте, который ваше приложение выделило, например.

0 голосов
/ 13 декабря 2011

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

...