2012-07-18 9 views
12

Ho un errore in cui si blocca l'applicazione durante l'avvio. Questo è l'errore che ho ottenuto:Come risolvere CALayerInvalidGeometry ', motivo:' La posizione CALayer contiene NaN: [nan nan]?

*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', reason: 'CALayer position contains NaN: [nan nan]' 
*** First throw call stack: 
(0x250b022 0x2709cd6 0x24b3a48 0x24b39b9 0x217ec0d 0x2174f55 0x158f3f7 0xbc74e 0xbe512 0xbfa26 0xbe4ad 0x224ffda 0x224f956 0x224e449 0x224ab9a 0x24df970 0x247f1c1 0x2442967 0x2441d84 0x2441c9b 0x2c0a7d8 0x2c0a88a 0x1559626 0x2aed 0x2a65) 
terminate called throwing an exception 

Ho provato ad utilizzare Exception punto di interruzione e non mostra che parte del codice è andato wrong.It solo fermarsi a questo punto -0xbc74e: movl $ 0,% eax -

Come posso risolverlo? Per favore aiuto.

* Modifica

ho trovato la parte che genera l'eccezione, ma non riesco a vedere ciò che è sbagliato

- (void)viewDidLoad { 
[super viewDidLoad]; 
[self.activityView startAnimating]; 
self.mapView.layerDelegate = self; 
self.mapView.touchDelegate = self; 
self.mapView.calloutDelegate = self; 

NSURL *mapUrl = [NSURL URLWithString:kTiledMapServiceURL]; 
AGSTiledMapServiceLayer *tiledLyr = [AGSTiledMapServiceLayer tiledMapServiceLayerWithURL:mapUrl]; 
[self.mapView addMapLayer:tiledLyr withName:@"Tiled Layer"]; 
     . 
     . 
     . 
} 
- (void)mapViewDidLoad:(AGSMapView *)mapView { 

AGSEnvelope *envelope = [[AGSEnvelope alloc]initWithXmin:29757.610204117 ymin:40055.0379682464 xmax:29884.6992302249 ymax:40236.6028660071 spatialReference:self.mapView.spatialReference]; 

//call method to set extent, pass in envelope 
[self.mapView zoomToEnvelope:envelope animated:YES]; 

self.mapView.callout.width = 195.0f; 
self.mapView.callout.accessoryButtonHidden = YES; 

[self.mapView.gps start]; 
[self.mapView centerAtPoint:self.mapView.gps.currentPoint animated:YES]; 

[self.activityView stopAnimating]; 
self.activityView.hidden = YES; 

} 

Questa linea è causa l'errore self.mapView.layerDelegate = self; che di default chiamare il metodo mapViewDidLoad

+1

qualcuno sa come risolvere? – sihao

risposta

4

Penso che questo errore si verifichi perché il livello che viene eseguito ha frame in questo formato:

Layer frame == {{inf, inf}, {0, 0}}

Qui inf è minimo. La sua serie di numeri.

Quindi la soluzione per evitare questo tipo di problema crea solo le condizioni prima del ritorno del livello. come come:

if (layer.frame.size.width ==0 || layer.frame.size.height ==0) { 
    return [self simpleLayer]; 
}else{ 
    return layer;   
} 

Dove semplice strato è come come:

-(CALayer *)simpleLayer{ 
    CALayer *layer = [[CALayer alloc] init]; 
    [layer setFrame:CGRectMake(0, 0, 10, 10)]; 
    [layer setHidden:TRUE]; 
    return layer; 
} 

Questa condizione ha risolto il mio problema. Provalo.

+7

Grazie per aver risposto. Ma non riesco a trovare quale parte ha avuto l'errore. dove potrei mettere il codice? qualche consiglio? – sihao

-1

So che questa domanda non è molto recente, ma voglio solo dare una risposta. Comunque, sto indovinando il tuo mapView è di AGSMapView e vi ho inizializzato in questo modo:

self.mapView = [[[AGSMapView alloc] init] autorelease]; 

Ora, penso che il, se non l'unico modo corretto meglio, per inizializzare sta usando initWithFrame. Anche se non sono sicuro del perché, mapView è rotto se si utilizza init per l'inizializzazione.

Spero che questo aiuti.

1

Per me è stato causato dalla toview in questo codice essere pari a zero:

[UIView transitionFromView:self.fromView 
         toView:self.toView 
         duration:0.6 
         options:(currentPage > toPage ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp) 
        completion:^(BOOL finished) { 
         if (finished) { 
         } 
        }