Я создал подкласс UIView для реализации пользовательского метода drawRect. Поместив несколько логов в код, я обнаружил, что drawRect на самом деле вызывается дважды, так как представление сначала устанавливается его контроллером представления. Почему это?
Другая проблема заключается в том, что у моего подкласса UIView есть ивар с именем needsToDrawTools. Мой назначенный инициализатор для этого подкласса устанавливает значение needsToDrawTools в YES. Затем метод drawRect проверяет это значение. Если ДА, он рисует инструменты, а затем устанавливает значение needsToDrawTools в НЕТ, чтобы никогда не перерисовывать инструменты.
НО, каким-то образом значение needsToDrawTools равно NO к моменту вызова drawRect. Нигде в моем коде я не устанавливаю его на NO, кроме как в операторе if (needsToDrawTools) внутри drawRect. Но так как needsToDrawTools уже NO к моменту, когда он достигает оператора if, код внутри оператора никогда даже не запускается. Если я вообще уберу это утверждение IF, то оно, конечно, запустится, и я увижу, что я ожидаю в представлении. Но я не хочу удалять оператор IF, потому что это приведет к перерисовке вещей, которые не нужно перерисовывать.
Вот мой код:
- (id)initWithParentViewController:(NewPhotoEditingViewController *)vc
{
self = [super init];
if (self) {
parentVC = vc;
needsToDrawTools = YES;
NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 1
}
return self;
}
#pragma mark - Drawing
- (void)drawRect:(CGRect)rect
{
NSLog(@"needsToDrawTools: %i",needsToDrawTools); //Console result: 0 !!!!!
if (needsToDrawTools){
NSLog(@"drawingTools"); //Never shows up in the console
UIBezierPath *toolPointDragger = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(75, 100, 30, 30)];
[[UIColor blackColor] setStroke];
toolPointDragger.lineWidth = 6;
[toolPointDragger stroke];
[[UIColor blueColor] setFill];
[toolPointDragger fill];
needsToDrawTools = NO;
}
}
Итак, мои два вопроса:
Почему drawRect вызывается дважды? Я предполагаю, что он вызывается в первый раз автоматически как часть процесса загрузки представления, но я не знаю, почему он вызывается снова.
Каким образом needsToDrawTools заканчивается значением NO?