iOS MKMapView быстро перерисовывает оверлей на карте
У меня есть многоугольник треугольника в MKMapView, который я хотел бы перерисовать очень быстро или привязать в определенной позиции на телефоне.
Этот многоугольник всегда будет указывать на верхнюю часть телефона, но сама карта будет вращаться в соответствии с указанными заголовками. В настоящее время я нашел единственный способ удалить оверлей, а затем добавить его заново. Проблема в том, что это очень изменчиво.
Следующая идея, которая у меня возникла, состояла в том, чтобы просто добавить изображение треугольника на карту и изменить размер карты по мере необходимости, это изображение треугольника было бы точной визуализацией того, каким будет полигон при добавлении в качестве наложения карты. Это почти работает, но не очень точно. По некоторым причинам он почти никогда не реагирует на изменения уровня масштабирования широты и некоторые другие проблемы.
Мой метод для этого:
- (void)setMapVisibleRect {
//we have to mock the heading to 0 so that the distances show up in lat/long correctly
//create a new instance of the cone model with a fake heading of 0 for calculations
ConePolygonModel *conePolygonModel = [[ConePolygonModel alloc] init:[self.userLocationModel getLocation].coordinate
withHeading:0
withLatLongMultiplier:[self.conePolygonModel getLatLongMultiplier]
withDistanceMultiplier:[self.conePolygonModel getDistanceMultiplier]];
//reset the map heading to 0
[self.mapView.camera setHeading:0];
//top left setup
CLLocationCoordinate2D topLeftCoordinate;
topLeftCoordinate.latitude = [[[conePolygonModel getXCoordinates] objectAtIndex:1] doubleValue];
topLeftCoordinate.longitude = [[[conePolygonModel getYCoordinates] objectAtIndex:1] doubleValue];
CLLocation *topLeftLocation = [[CLLocation alloc] initWithLatitude:topLeftCoordinate.latitude longitude:topLeftCoordinate.longitude];
//top right setup
CLLocationCoordinate2D topRightCoordinate;
topRightCoordinate.latitude = [[[conePolygonModel getXCoordinates] objectAtIndex:2] doubleValue];
topRightCoordinate.longitude = [[[conePolygonModel getYCoordinates] objectAtIndex:2] doubleValue];
CLLocation *topRightLocation = [[CLLocation alloc] initWithLatitude:topRightCoordinate.latitude longitude:topRightCoordinate.longitude];
//center setup
CLLocationCoordinate2D topCenterCoordinate = [conePolygonModel midpointBetweenCoordinate:topLeftCoordinate andCoordinate:topRightCoordinate];
CLLocation *topCenterLocation = [[CLLocation alloc] initWithLatitude:topCenterCoordinate.latitude longitude:topCenterCoordinate.longitude];
//set distances
CLLocationDistance latitudeDistance = [topLeftLocation distanceFromLocation:topRightLocation];
CLLocationDistance longitudeDistance = [topCenterLocation distanceFromLocation:[self.userLocationModel getLocation]];
//set the map zoom
NSLog(@"zoom levels: %f %f", latitudeDistance, longitudeDistance);
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance([self.userLocationModel getLocation].coordinate, latitudeDistance, longitudeDistance);
[self.mapView setRegion:viewRegion];
//move the map to the actual heading
[self.mapView.camera setHeading:self.currentHeading];
}
Есть ли способ сохранить оверлей, всегда указывающий на верхнюю часть экрана, независимо от поворота карты? Масштабирование карты, чтобы оверлей всегда занимал один и тот же размер на экране, также было бы неплохо, но это не так важно, как в другом месте.
1 ответ
Попробуйте реализовать это как MKAnnotationView вместо наложения, так как вы хотите, чтобы треугольник всегда имел одинаковый размер и ориентацию, но при этом был прикреплен к определенной точке в системе координат карты.
Самый простой способ сделать это - создать файл PNG и присвоить его UIImage image
свойство MKAnnotationView
в вашем mapView:viewForAnnotation:
метод делегата. В качестве альтернативы вы можете использовать Core Graphics, чтобы программно нарисовать треугольник и превратить его в UIImage во время выполнения. Вы можете визуализировать изображение с помощью Core Graphics один раз и сохранить ссылку на объект UIImage, чтобы не перерисовывать его каждый раз, когда вызывается viewForAnnotation.