2 Stimmen

setNeedsDisplay überarbeitet

Ich habe die oft diskutierte drawRect nicht immer aufgerufen. Ich habe durch viele Beiträge gewesen, aber nicht mein Problem behoben haben.

Die Lösung wird oft als Aufruf beschrieben -setNeedsDisplay . Die Antwort auf die Frage setNeedsDisplay ruft drawRect nicht auf zeigt an, dass der Aufruf in der Unteransicht nicht self .

Ich habe eine Unteransicht erstellt, um auf eine Schaltfläche zu zeichnen. Die Schaltfläche ist ausgewählt.

- (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");
}

Ein drawRect-Aufruf in UsableMark wird nicht ausgelöst.
Ersetzen der [um setNeedsDisplay] con [button setNeedsDisplay] löst keinen drawRect-Aufruf aus.
Ein Versuch der Nutzung self schlägt fehl, weil die Methode selected1 eine Klasse vom Typ UIApplicaitonDelegate ist. Die Methode -setNeedsDisplay wird nicht gefunden.

Versuchen Sie [self.window setNeedsDisplay] bringt keinen Fortschritt.

Direktes Aufrufen von drawRect (was man nicht tun möchte) CGRect rect = button.frame; [um drawRect:rect]; zeigt, dass die Methode vorhanden ist, ist die Protokollierung aktiv.

Die Lösung mag einfach sein, aber sie entzieht sich mir.

1voto

ughoavgfhw Punkte 39353

Das Problem ist, dass init anstelle von initWithFrame: aufgerufen wird. Da das Standard-Init verwendet wurde, hatte der Rahmen der Ansicht die Größe Null, und UIKit übersprang die Anzeige als Optimierung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X