2009-05-19 17 views
1

Ich baute eine UIButton-Unterklasse, die ein sehr einfaches Kontrollkästchen ist. Alles funktioniert (z. B. bekomme ich die erwarteten Ereignisse, die drawRect-Methode wird aufgerufen, wenn ich es erwarte, usw.), aber mein Bild wird nicht gezeichnet. Ich habe überprüft, dass mein Bild nicht null ist und dass meine Bilder unterschiedlich sind.Was ist los mit meiner Checkbox-Zeichnung?

Code:

-(void)awakeFromNib { 
    [super awakeFromNib]; 
    [self addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside]; 
    self.state=YES; 
} 

-(void) buttonClick { 
    self.state = !self.state; 
    [self setNeedsDisplay]; 
} 

-(void)drawRect:(CGRect)rect { 
    UIImage *img = nil; 
    if (self.state) { 
     img = [self backgroundImageForState:UIControlStateSelected]; 
    } 
    else { 
     img = [self backgroundImageForState:UIControlStateNormal]; 
    } 
    [img drawInRect:rect]; 
} 

den Wert von 'img' prüfen, bevor sie gezogen wird:

Printing description of img: 
<UIImage: 0x52a710> 
(gdb) continue 

Printing description of img: 
<UIImage: 0x52a5d0> 

Die Hintergrundbilder werden in der NIB gesetzt. Wenn ich den ausgewählten Zustand in IB ändere, sehe ich das richtige Bild. Ich bekomme auch ein gültiges Bild von dem Anruf zurück (was ich nicht mache, wenn ich versuche, imageForState zu bekommen, was nicht in der NIB eingestellt ist).

Der Grund für die Unterklasse ist, dass ich ein Kontrollkästchen brauche. UIButton macht das nicht und UISwitch ist für alle außer den nützlichsten Ansichten hässlich.

Gedanken?

Danke.

tj

Edit: den gesamten Code für die Unterklasse hinzugefügt

Antwort

0

Nur weil das UIImage nicht nil ist, heißt das nicht, dass es Bilddaten enthält.

Überprüfen Sie den Fall Ihres Dateinamens.
Ich habe das schon mehrmals gemacht:

@ "CheckBox.png" und @ "checkbox.png" sind 2 verschiedene Namen für das iPhone.

Es scheint, dass Sie ein wenig vorzeitige Optimierung auch tun können.

Ich würde nicht tauchen in drawRect: für meine erste Option.

Verwenden Sie eine UIButton-Unterklasse (Sie müssen nur eine Unterklasse erstellen, um den Status zu verfolgen). Stelle den Knopf in IB auf und positioniere ihn wo du willst.Verbinden Sie die Taste, um das Verfahren unten und tauscht einfach die Bilder auf dem Klick:

- (IBAction)toggle:(id)sender{ 

    MyButtonSubClass *aButton = (MyButtonSubClass*)sender; 

    [aButton toggleChecked]; 

    if(aButton.checked) 
     [aButton setImage:checkedImage forState:UIControlStateNormal]; 
    else 
     [aButton setImage:uncheckedImage forState:UIControlStateNormal]; 


} 

optional können Sie nicht UIButton Unterklasse und Spur-Zustand in der Steuerung

2

Wo setzen Sie backgroundImageForState? Bist du sicher, dass es das richtige Bild ist? Das iPhone OS gibt Ihnen möglicherweise ein transparentes (leeres) Bild als Standard.

Zweitens würde ich nicht den übergebenen "Rect" -Param verwenden, um das Bild zu zeichnen. Das sagt dir nur den Bereich, den du neu zeichnen willst, nicht unbedingt etwas anderes. Verwenden Sie stattdessen

CGRectMake(0, 0, img.size.width, img.size.height)

oder etwas ähnliches.

Schließlich, warum machst du benutzerdefinierte Zeichnung? Ich habe etwas sehr ähnliches getan, und Sie müssen absolut keine Unterklasse drawRect und implementieren. UIButton bietet eine Vielzahl von Optionen für Bilder, einschließlich "hervorgehobener" und "ausgewählter" Bilder, die automatisch mit Benutzerinteraktion gezeichnet werden. Lassen Sie uns wissen, was Sie erreichen müssen.

+0

I Details zu der Frage hinzugefügt oben über Ihren ersten Satz Fragen. Was ich im Simulator bekomme, ist das Standardbild, das ich in der NIB gesetzt habe. Ich denke, es kommt von, wenn die Checkbox zur NIB serialisiert wird, nicht von meinem Code. Ich habe den Code geändert, um mein eigenes Rect zu verwenden (das ist das gleiche, wie ich es bekommen habe), und es hat es nicht beeinflusst. Ich habe auch den ganzen Code hinzugefügt, damit Sie sehen können, warum die benutzerdefinierte Zeichnung. UIButton tut nicht, was ich tun muss. –

+0

Ich bin offen für bessere Möglichkeiten, dies zu tun, BTW, wenn es nur etwas ist, das ich nicht kenne. Ich muss im Wesentlichen in der Lage sein, den "ausgewählten Zustand" beizubehalten, auch wenn der Benutzer nicht aktiv auf den Knopf klopft. –