setNeedsDisplay пересмотрен

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

Решение часто описывается как вызов -setNeedsDisplay. Ответ на вопрос setNeedsDisplay не вызывает drawRect указывает, что вызов его в подпредставлении не self .

Я создал подвид, чтобы рисовать на кнопке. Кнопка выбрана.


- (IBAction) selected1:(id)sender {
    NSLog(@"selected1");    
    UIButton *button = (UIButton *)sender; 
    [button setTitle:@"Chosen1" forState:UIControlStateNormal];   
    [button setTitleColor:[UIColor redColor] forState:UIControlStateDisabled];

 // UsableMark *um = [[UsableMark alloc] init ]; // Original
 // UsableMark *um = [[UsableMark alloc] initWithFrame:button.frame]; // 1st fix
    CGRect umFrame = CGRectMake(0,0,button.frame.size.width,button.frame.size.height); // 2nd fix
    UsableMark *um = [[UsableMark alloc] initWithFrame:umFrame ]; // 2nd fix

    [button addSubview:um];
    [um setNeedsDisplay];
    [um release];    
    button.enabled = NO;    
    NSLog(@"finished selected1");
}

Вызов drawRect в UsableMark не инициируется.
Замена [um setNeedsDisplay] на [button setNeedsDisplay] не вызывает вызов drawRect.
Попытка использования self завершается неудачно, поскольку метод selected1 является классом типа UIApplicaitonDelegate. Метод -setNeedsDisplay не найден.

Попытка [self.window setNeedsDisplay] не дает прогресса.

Непосредственный вызов drawRect (чего делать не хочется) CGRect rect = button.frame; [um drawRect:rect]; демонстрирует присутствующий метод, ведение журнала живо.

Решение может быть простым, но оно ускользает от меня.


person Refactor    schedule 23.04.2011    source источник
comment
Вы переопределили метод инициализации в UsableMark, чтобы установить кадр по умолчанию? В противном случае фрейм будет иметь нулевой размер, и UIKit может пропустить его отображение как операцию производительности.   -  person ughoavgfhw    schedule 24.04.2011
comment
Переопределил ли initWithFrame. Но используемый init был без него. Изменили код для использования initWithFrame. Теперь вызывается initWithFrame. Как и drawRect !   -  person Refactor    schedule 24.04.2011
comment
Спасибо. вызывается drawRect. Измените свой комментарий на ответ, и я отмечу его. Теперь, чтобы исследовать вопрос, почему рисунок drawRect не виден.   -  person Refactor    schedule 24.04.2011
comment
DrawRect после выполнения не дал видимых результатов, потому что фрейм, указанный в initWithFrame, должен был иметь размеры 0,0, button.frame.size.width, frame.size.height, а не фрейм. Это привело к двойному смещению рисунка, и, учитывая расположение кнопки, он был за пределами экрана.   -  person Refactor    schedule 24.04.2011


Ответы (1)


Проблема в том, что init вызывается вместо initWithFrame:. Поскольку использовалась инициализация по умолчанию, фрейм представления имел нулевой размер, и UIKit пропустил его отображение в качестве оптимизации.

person ughoavgfhw    schedule 24.04.2011