setNeedsDisplay повторно - PullRequest
       18

setNeedsDisplay повторно

2 голосов
/ 23 апреля 2011

У меня часто обсуждается 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]; демонстрирует присутствующий метод, ведение журнала активно.

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

1 Ответ

1 голос
/ 24 апреля 2011

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

...