2009-07-12 8 views
0

Implementiert meine eigene DrawRect-Methode und ich versuche, die Form aus einer Controller-Klasse neu zu zeichnen, und ich kann nicht herausfinden, wie setNeedsDisplay korrekt neu zu dem Uiwiew neu zu erstellen. Bitte helfen Sie !!iPhone Programming setNeedsDisplay funktioniert nicht

Ich weiß, dass der Code hässlich ist, aber hier ist die benutzerdefinierte Methode:

- (void)drawRect:(CGRect)rect{ 
// Drawing code 
NSArray *kyle = [self pointsForPolygonInRect:rect numberOfSides:[pshape numberOfSides]]; 
CGContextRef c = UIGraphicsGetCurrentContext(); 

int counter = [kyle count]; 
NSLog(@"counter: %d",counter); 
int i = 0; 
BOOL first = YES; 

NSValue *kylevalue; 
CGPoint thePoint; 
for (i = 0; i < counter; i++) { 
    kylevalue = [kyle objectAtIndex:i]; 
    thePoint = [kylevalue CGPointValue]; 
    if (first) { //start. 
     CGContextMoveToPoint(c, thePoint.x, thePoint.y+5.0); 
     first = NO; 
    } else { //do the rest 
     CGContextAddLineToPoint(c, thePoint.x, thePoint.y+5.0); 
    } 
} 
CGContextClosePath(c); //solid color 
CGContextDrawPath(c, kCGPathFillStroke);  

}

+0

Sorry für die Verwirrung. Ich versuche, die Ansicht von einer anderen Klasse zu aktualisieren, und wenn ich rufe: [pview setNeedsDisplay]; Nichts passiert. Es ist kein Fehler, wenn ich es ausführe, aber es reagiert auch nicht. –

Antwort

1

Ich bin mir nicht sicher, ob ich verstehe Ihre Frage. Der Aufruf von -setNeedsDisplay auf einer Ansicht bewirkt, dass sie über ihre -drawRect: -Methode neu gezeichnet wird.

+0

Sorry für die Verwirrung. Ich versuche, die Ansicht von einer anderen Klasse zu aktualisieren, und wenn ich rufe: [pview setNeedsDisplay]; Nichts passiert. Es ist kein Fehler, wenn ich es ausführe, aber es reagiert auch nicht. Ich gebe eine NSLog-Nachricht an, die beim Eintritt in drawRect angezeigt wird, und sie wird nur einmal beim Start der Anwendung eingegeben. –

+0

Sie sollten überprüfen, dass pview nicht null ist, da Nachrichten, die an nil gesendet werden, ignoriert werden. – titaniumdecoy

0

nur ein paar Gedanken 1. Haben Sie verifiziert, dass Ihre Methode aufgerufen wird? 2. Haben Sie überprüft, dass Ihr Punktearray tatsächlich mit mehr als einem Punkt gefüllt ist? 3. Sind die Punkte tatsächlich im sichtbaren Bereich des Rahmens? 4. Ich sehe nicht, dass Sie die Strichlinienbreite, Farbe oder Füllfarbe einstellen.

3

Ich hatte ähnliche Probleme mit Neuzeichnen nicht funktioniert, wie ich entweder erwartet. Es scheint, als ob setNeedsDisplay Kinder nicht zum Neuzeichnen zwingt, für die Sie ihre setNeedsDisplay-Methode aufrufen müssen.

Für meine Bedürfnisse habe ich eine Kategorie geschrieben, um den gesamten Bildschirm neu zu zeichnen, indem ich setNeedsDisplay für jede einzelne Ansicht aufruft. Dies kann natürlich leicht modifiziert werden, um von einer bestimmten Ansicht im Gegensatz zu allen Fenstern zu starten.

@implementation UIApplication (Extensions) 

+ (void) redrawScreen { 
NSMutableSet* todo = [NSMutableSet set]; 
NSMutableSet* done = [NSMutableSet set]; 
[todo addObjectsFromArray:[[UIApplication sharedApplication] windows]]; 

while ([todo count] > 0) { 
    UIView* view = [todo anyObject]; 
    [view setNeedsDisplay]; 

    [done addObject:view]; 
    [todo removeObject:view]; 

    if (view.subviews) { 
    NSMutableSet* subviews = [NSMutableSet setWithArray:view.subviews]; 

    [subviews minusSet:done]; 
    [todo unionSet:subviews]; 
    } 
} 
} 

@end 

Hoffnung dieser Hilfe zu jemandem ist

0

Manchmal Grund kann sehr einfach sein: Die Datei Besitzer haben keine Verbindung zum UIView-Objekt. Das heißt, Outlet ist nicht richtig eingerichtet. Verwenden Sie IB, Strg-Taste und Zieh-Methode :)

0

Wenn Ihr Diagramm die DrawRect-Methode hat, schauen Sie in Ihrem ViewController, an dem Code, wo es mit Ihrem Diagramm verbindet. Ist das richtig angeschlossen? Ist der kleine Kreis am Grundstück hohl? oder gefüllt. Dieser kleine Kreis muss ausgefüllt werden, wenn die Eigenschaft richtig verbunden ist. Wenn es leer ist, rufen Sie das Storyboard auf.

Suchen Sie das Plot-Objekt im Storyboard. Bewegen Sie den Mauszeiger vom Plot-Objekt im Storyboard auf den leeren Kreis im View-Controller. Jetzt haben Sie die Steckdose angeschlossen. Versuchen Sie es erneut, und sehen Sie, ob Ihr DrawRect jetzt aufgerufen wird.

Verwandte Themen