Создание MKPolygon из размещенных пользователем аннотаций на карте - PullRequest
3 голосов
/ 31 октября 2011

Я хочу, чтобы пользователь мог создавать многоугольники после размещения некоторых (неизвестное число) MKpointAnnotations на карте. Я установил распознаватель жестов, который активируется, когда пользователь нажимает кнопку, и поэтому размещаются аннотации. Но какиспользовать их в качестве углов для MKPolygon?Ниже приведен код для сохранения углов многоугольника. Это после некоторых модов, которые я сделал с ним. Теперь приложение аварийно завершает работу, и программа аварийного завершения сообщает, что индекс выходит за пределы диапазона. Углы - это MKPointAnnotation-s, созданные с помощью GestureRecognizer.

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

}

1 Ответ

1 голос
/ 11 ноября 2011

Первая проблема - метод addCorner.Вместо добавления каждого угла в переменную ptsArray он создает новый массив только с последним углом и устанавливает ptsArray равным этому, поэтому он имеет только один, последний угол.

Изменить 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 создается вместо отдельного действия пользователя?)


Вторая проблема заключается в методе addPolygonOverlay.Вы должны использовать свойство NSArray count, чтобы получить количество элементов в массиве.Функция sizeof возвращает количество байтов физической памяти, которое использует переданная переменная.Для ptsArray, который является указателем, он вернет 4. Если ptsArray имеет менее 4 элементов, вы получите исключение «индекс вне диапазона».

Поэтому измените

int cornersNumber = sizeof(ptsArray);

до

int cornersNumber = ptsArray.count;


Еще одна важная вещь, на которую следует обратить внимание, это то, что стороны многоугольника будут нарисованы в порядке расположения точек в массиве.Если пользователь не добавляет углы по часовой стрелке или против часовой стрелки, многоугольник будет выглядеть странно.Вы можете воссоздать наложение полигонов сразу после того, как пользователь добавит / удалит аннотацию, чтобы немедленно получить обратную связь о том, как она будет выглядеть.

...