2013-05-01 16 views
6

Ho un viewController che è ovviamente una sottoclasse di UIViewController denominata MapViewController. In questa viewController uso il GPS per ottenere la posizione dell'utente.setNeedsDisplay non attiva DrawRect

Ho anche una vista chiamata DrawCircle. Questa vista è una sottoclasse di UIView.

Uso di drawCircle Mi piacerebbe poter disegnare in qualsiasi momento sul mio MapViewController. Ma non sono sicuro di capire il concetto di farlo. So che il mio codice di disegno funziona, l'ho usato prima. Ma non so come disegnare su MapViewController utilizzando DrawCircle.

Da quello che sembra al mio quando chiamo [myCustomView setNeedsDisplay], non chiama il metodo DrawRect nella mia vista.

Ecco il codice: MapViewController.h

#import "DrawCircle.h" 


@interface MapViewController: UIViewController <CLLocationManagerDelegate>{ 
    DrawCircle *circleView; 
} 

@property (nonatomic, retain) DrawCircle *circleView; 
@end 

MapViewController.m

#import "DrawCircle.h" 

@interface MapViewController() 
@end 

@implementation MapViewController 
@synthesize circleView; 

- (void) viewDidLoad 
{ 
    circleView = [[DrawCircle alloc] init]; 
    [self setNeedsDisplay]; 

    [super viewDidLoad]; 

} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 

@end 

DrawCircle.m

#import "DrawCircle.h" 

@interface DrawCircle() 
@end 

@implementation DrawCircle 

-(id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if(self) { 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 


     CGPoint point = CGPointMake(40, 137); 
     CGContextAddEllipseInRect(ctx, CGRectMake(point.x, point.y, 10, 10)); 
    } 

    CGContextSetFillColor(ctx, CGColorGetComponents([[UIColor redColor] CGColor])); 
    CGContextFillPath(ctx); 
} 

Anche se questo offre qualche aiuto nel mio processo di pensiero, ecco la mia scena StoryBoard. StoryBoard Scene

Dove la classe personalizzata viewcontrollers è MapViewController e la classe personalizzata views è DrawCircle.

** MODIFICA: ** Vorrei anche ricordare che, nel mio DrawCircle.m, ho metodi che sto chiamando da MapViewController.m e funzionano.

Inoltre. Inizialmente, viene chiamato il metodo DrawRect, ma non sono in grado di chiamare manualmente utilizzando setNeedsUpdate. Durante il debug, non sta nemmeno entrando nel metodo DrawRect.

+0

A proposito, mentre spero che la mia risposta qui sotto aiuti, il tuo commento su mappe e GPS mi fa chiedere che tipo di mappa stai usando. Se stai usando 'MKMapView' e se vuoi che questa vista sia associata a coordinate lat/long, ci sono molti modi migliori per ottenerlo (ad esempio annotazione personalizzata o sovrapposizione di' MKCircle'). Ma se vuoi che questo cerchio rosso galleggi nello spazio, non si muova mentre l'utente esegue il panning e lo zoom della mappa, quindi la visualizzazione personalizzata va bene. Dipende solo da cosa stai cercando di fare. – Rob

risposta

5

Stai creando il tuo DrawCircle, ma non lo aggiungi mai alla vista, ad es.

[self.view addSubview:circleView]; 

Pertanto, non rientra nell'ambito e (se si utilizza ARC) viene rilasciato su di te. Inoltre non sembra che si stia impostando il suo frame, come ad esempio:

circleView = [[DrawCircle alloc] initWithFrame:self.view.bounds]; 

In alternativa, si potrebbe aggiungere la visualizzazione in costruttore di interfaccia (uno standard UIView, ma poi specificare il vostro diritto classe personalizzata in IB).

Inoltre, nota, in genere non chiamare nemmeno setNeedsDisplay. L'aggiunta alla gerarchia della vista lo chiamerà per te. Devi solo chiamare questo se hai bisogno di aggiornare la vista in base ad alcune proprietà personalizzate.


Personalmente, sarei propenso a definire drawRect in questo modo:

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // I'd just use `rect` and I can then use the `frame` to coordinate location and size of the circle 

    CGContextAddEllipseInRect(ctx, rect); 

    // perhaps slightly simpler way of setting the color 

    CGContextSetFillColorWithColor(ctx, [[UIColor redColor] CGColor]); 

    CGContextFillPath(ctx); 
} 

In questo modo, la posizione e la dimensione del cerchio sarà dettata dalla frame ho impostato per il cerchio (da A proposito, mi scuso se questo rende più confuso, ma io uso un nome di classe diverso, CircleView, come mi piace avere View nel nome delle mie sottoclassi UIView).

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIView *circle; 

    circle = [[CircleView alloc] initWithFrame:CGRectMake(100.0, 100.0, 200.0, 200.0)]; 
    circle.backgroundColor = [UIColor clearColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this 
    [self.view addSubview:circle]; 

    circle = [[CircleView alloc] initWithFrame:CGRectMake(300.0, 300.0, 10.0, 10.0)]; 
    circle.backgroundColor = [UIColor blackColor]; // because it calls `super drawRect` I can now enjoy standard UIView features like this 
    [self.view addSubview:circle]; 
} 
+0

Grazie mille Rob! Questo risolve definitivamente il mio problema con la possibilità di aggiornare la mia vista! L'unico problema che è emerso ora è che, anche se ho impostato il mio circlView alla dimensione dei miei limiti di mainviews, è dimensionato solo per metà dello schermo, non è attualmente a pieno schermo. – Johnrad

+0

@JohnnyWhisman è il cerchio che viene disegnato troppo piccolo? O la vista è troppo piccola? Per esempio, lascio il colore dello sfondo per la vista del cerchio e vedo, senza ambiguità, dove si trova, ma poi faccio in modo che il disegno del cerchio occupi l'intero fotogramma. Mi asterrò anche dalle dimensioni dei codici rigidi, ma lasciai che il processo di impostazione del frame controllasse le dimensioni. Vedi l'aggiornamento. Oltre a questo, è difficile dire perché non si stia vedendo il cerchio completo senza un esempio di codice aggiornato, ma quanto sopra funziona per me. – Rob

+0

@JohnnyWhisman Spero che la mia risposta aggiornata con gli esempi di codice non lo renda più confuso. Mi piace solo che le mie viste personalizzate si comportino come standard 'UIView' /' UIImageView' dove 'frame' definisce la posizione e le dimensioni del controllo. Ma se hai altri bisogni della tua classe 'DrawCircle', dove forse sta disegnando un gruppo di cerchi e li animiamo e simili, allora avere il cerchio che non occupa l'intero' frame' ha un senso. Dipende solo da quale sia il tuo obiettivo. Tuttavia, la regolazione dei colori di sfondo può aiutare a diagnosticare cosa sta succedendo, separando i problemi di 'frame' dai problemi di' drawRect'. – Rob