3

いくつかの(不明な数の)MKpointAnnotationsをマップに配置した後、ユーザーがポリゴンを作成できるようにしたいユーザーがボタンをタップするとアクティブになるジェスチャ認識機能を配置したので、注釈が配置されますが、これらを次のように使用する方法MKPolygonのコーナー?ポリゴンの角を保存するためのコードの下。これは、いくつかの変更を行った後です。アプリがクラッシュし、クラッシュレポーターがインデックスが範囲外であると表示します。角はGestureRecognizerを介して作成されたMKPointAnnotationです。

-(IBAction)addCorner:(id)sender
{
NSMutableArray *addCorners = [[NSMutableArray alloc] init];
[addCorners addObject:pointAnnotation];
ptsArray = addCorners;
}

-(IBAction)addPolygonOverlay:(id)sender
{
int cornersNumber = sizeof(ptsArray);
MKMapPoint points[cornersNumber];

for (int i=0; i<cornersNumber; i++) {
    points[i] = MKMapPointForCoordinate([[ptsArray objectAtIndex:i] coordinate]);
}

MKPolygon *polygon = [MKPolygon polygonWithPoints:points count:cornersNumber];
[mapview addOverlay:polygon];

}
4

1 に答える 1

1

最初の問題はaddCorner方法です。変数に各コーナーを追加する代わりにptsArray、最後のコーナーだけで新しい配列を作成し、それにptsArray等しい値を設定して、最後のコーナーが1つだけになるようにします。

addCorner次のように方法を変更します。

-(IBAction)addCorner:(id)sender
{
    if (ptsArray == nil)
    {
        self.ptsArray = [NSMutableArray array];
    }

    [ptsArray addObject:pointAnnotation];
}

また、ptsArray正しく宣言および合成されていることを確認してください。

//in the .h file...
@property (nonatomic, retain) NSMutableArray *ptsArray;
//in the .m file...
@synthesize ptsArray;

(ちなみに、別のユーザーアクションではなく、作成されたptsArray場所の右側にコーナーを追加してみませんか?)pointAnnotation


2番目の問題はaddPolygonOverlayメソッドにあります。NSArray count配列内のアイテムの数を取得するには、プロパティを使用する必要があります。このsizeof関数は、渡された変数が使用する物理メモリのバイト数を返します。ptsArrayこれがポインタの場合、4が返されます。アイテムptsArrayが4つ未満の場合、「インデックスが範囲外です」という例外が発生します。

だから変更

int cornersNumber = sizeof(ptsArray);

int cornersNumber = ptsArray.count;


注意すべきもう1つの重要な点は、ポリゴンの辺が、ポイントが配列内にある順序で描画されることです。ユーザーが時計回りまたは反時計回りの順序でコーナーを追加しない場合、ポリゴンは奇妙に見えます。ユーザーが注釈を追加/削除した直後にポリゴンオーバーレイを再作成して、注釈がどのように表示されるかについて即座にフィードバックを得ることができます。

于 2011-11-11T16:23:17.183 に答える