17

起動時にアプリケーションがクラッシュするというエラーがあります。これは私が得たエラーです:

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

例外ブレークポイントを使用しようとしましたが、コードのどの部分が間違っているかが表示されません。この時点でのみ停止します-0xbc74e:movl $ 0、%eax-

どうすれば解決できますか?助けてください。

*編集

例外をスローする部分を見つけましたが、何が問題なのかわかりません

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

}

この行が原因でエラーが発生self.mapView.layerDelegate = self;し、デフォルトでメソッドが呼び出されますmapViewDidLoad

4

3 に答える 3

5

このエラーは、実行されるレイヤーに次の形式のフレームがあるために発生すると思います。

レイヤー枠 == {{inf, inf}, {0, 0}}

ここで inf は infimum です。その数字のセット。

したがって、この種の問題を回避するための解決策は、レイヤーを返す前に条件を作成することです。次のように:

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

単純なレイヤーは次のようになります。

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

この条件は私の問題を解決しました。それを試してみてください。

于 2012-07-24T11:04:45.843 に答える
-1

この質問は最近ではないことは知っていますが、答えたいと思います。とにかく、私はあなたがのであると推測してmapViewいます、AGSMapViewそしてあなたはそれをこのように初期化しました:

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

さて、私はそれを初期化するための唯一の正しい方法ではないにしても、より良い方法はを使用することだと思いますinitWithFrame。理由はわかりませんが、初期化mapViewに使用すると壊れinitます。

お役に立てれば。

于 2013-01-21T06:58:14.177 に答える