2009-07-12 9 views
0

J'ai implémenté ma propre méthode drawRect et j'essaie de redessiner la forme à partir d'une classe Controller et je n'arrive pas à comprendre comment implémenter correctement setNeedsDisplay pour redessiner l'UIView. S'il vous plaît aider !!iPhone Programmation setNeedsAffichage ne fonctionne pas

Je sais que le code est laid, mais voici la méthode personnalisée:

- (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

Désolé pour la confusion. J'essaye d'actualiser la vue d'une autre classe et quand j'appelle: [pview setNeedsDisplay]; Rien ne se passe. Il ne se trompe pas quand je l'exécute, mais il ne répond pas non plus. –

Répondre

1

Je ne suis pas sûr que je comprends votre question. Appeler -setNeedsDisplay sur une vue l'oblige à être redessiné via sa méthode -drawRect:.

+0

Désolé pour la confusion. J'essaye d'actualiser la vue d'une autre classe et quand j'appelle: [pview setNeedsDisplay]; Rien ne se passe. Il ne se trompe pas quand je l'exécute, mais il ne répond pas non plus. Je mets un message NSLog à afficher quand il entre dans drawRect et il n'entre qu'une fois quand l'application se lance. –

+0

Vous devriez vérifier que pview n'est pas nul, puisque les messages envoyés à nil sont ignorés silencieusement. – titaniumdecoy

0

juste quelques réflexions 1. avez-vous vérifié que votre méthode est appelée? 2. avez-vous vérifié que votre tableau de points contient en fait plus d'un point? 3. Les points sont-ils réellement dans la zone visible du cadre? 4. Je ne vous vois pas régler la largeur de trait, la couleur ou les couleurs de remplissage.

3

J'ai eu des problèmes similaires avec redessiner ne fonctionne pas comme prévu. Il semble que setNeedsDisplay ne force pas les enfants à redessiner, pour ceux dont vous avez besoin d'appeler leur méthode setNeedsDisplay.

Pour mes besoins, j'ai écrit une catégorie pour redessiner l'écran entier en appelant setNeedsDisplay sur chaque vue. Cela peut bien sûr être facilement modifié pour démarrer à partir d'une vue spécifique par opposition à toutes les fenêtres.

@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 

Espérons que cela est de l'aide à quelqu'un

0

Parfois, la raison peut être très simple: propriétaire du fichier n'a aucun lien avec l'objet UIView. c'est-à-dire que sa sortie n'est pas configurée correctement. Utilisez IB, Ctrl bouton et glisser la méthode :)

0

Si votre intrigue a la méthode drawRect, regardez votre viewController, au code où il se connecte à votre intrigue. Est-ce que cela est bien relié? Le petit cercle de la propriété est-il creux? ou rempli. Ce petit cercle doit être rempli si la propriété est correctement connectée. Si c'est creux, évoquez le story-board. Trouver l'objet de la parcelle dans le story-board.

Contrôle le glisser de l'objet de la parcelle dans le story-board vers le cercle vide sur le contrôleur de vue. Maintenant, vous avez branché la sortie. Essayez de l'exécuter à nouveau, et voyez si votre drawRect est appelée maintenant.