MKMapView перерисовывает наложения (мигает) при добавлении новых наложений. MKPolyLines неровные
Я тестирую некоторые базовые функции рисования на MKMapView и получаю некоторые странные вещи. Вы можете обратиться к ссылке Dropbox, которая находится ниже. Это выполняется и проверяется на реальном устройстве, а не на симуляторе.
Вы заметите, что некоторые из MKPolyLines неровны, поскольку они связаны, а некоторые нет. В чем причина этого и можно ли это исправить? Я не видел никакой опции для настройки сглаживания. Крайне правый многоугольник, вы можете увидеть это больше всего, я думаю. Но в целом кажется, что некоторые линии более плавные, чем другие.
Другая вещь, которая случается, что этот скриншот не показывает, - то, что каждый раз, когда я нажимаю на представление, чтобы добавить новое наложение, все наложения на карте "мигают", как будто они перерисовываются или, возможно, перерисовываются недостаточно быстро. Интересно, что было причиной этого, или, возможно, я должен был сделать что-то еще, чтобы предотвратить это, о котором я не знаю.
Также вопрос по делегату. Что делать, если у вас есть 100 различных оверлеев на вашей карте? Предполагается ли вам выполнить проверку каждого участника в делегате, чтобы узнать, какой тип рисования выполнять? В моем случае есть только 3 случая, но я могу предположить, что этот метод может стать очень большим с тем, что я настроил здесь. Я знаю, что это вопрос в стороне, но подумал, что вставлю его сюда.
https://www.dropbox.com/s/dbordqnml33urmu/Screenshot%202013.03.28%2011.26.36.png
вот соответствующий код:
-(void)addCoordinateToList:(UITapGestureRecognizer*)recognizer{
CGPoint tappedPoint = [recognizer locationInView:map];
CLLocationCoordinate2D coord = [map convertPoint:tappedPoint toCoordinateFromView:map];
NSLog(@"Coordinate Info: Lat %f, Lon %f", coord.latitude, coord.longitude);
CLLocation *newLocation = [[CLLocation alloc] initWithLatitude:coord.latitude longitude:coord.longitude];
//Extension NSValue new for iOS6
//[path addObject:[NSValue valueWithMKCoordinate:coord]];
[path addObject:newLocation];
[self drawPolygon];
clearPolygonFromMap.enabled = YES;
clearPolygonFromMap.alpha = 1.0;
//add annotations
[self setPolygonAnnotationWithCoordinate:coord andWithTitle:@"default title"];
}
// рисуем полилинию. установите полигон, но не добавляйте его как оверлей, пока не закончите рисовать свою форму. Этот код не включен, потому что здесь много состояний кнопок, которые не имеют отношения к делу.
-(void)drawPolygon{
NSInteger numberOfCoordinates = path.count;
if(coords != NULL)
free(coords);
coords = malloc(sizeof(CLLocationCoordinate2D) * numberOfCoordinates);
CLLocationCoordinate2D coordinates[numberOfCoordinates];
for(int pathIndex = 0; pathIndex < numberOfCoordinates; pathIndex++){
CLLocation *location = [path objectAtIndex:pathIndex];
coords[pathIndex] = location.coordinate;
coordinates[pathIndex] = coords[pathIndex];
}
polyLine = [MKPolyline polylineWithCoordinates:coordinates count:numberOfCoordinates];
polygon = [MKPolygon polygonWithCoordinates:coords count:path.count];
[map addOverlay:polyLine];
}
// устанавливаем оверлей круга
-(void)setPolygonAnnotationWithCoordinate:(CLLocationCoordinate2D)coord andWithTitle:(NSString *)polygonDescription{
circle = [MKCircle circleWithCenterCoordinate:coord radius:15];
circle.title = polygonDescription;
[map addOverlay:circle];
//[map addAnnotation:circle];
}
// метод делегирования наложения MapView. Есть ли лучший способ проверить оверлеи? что если бы у меня было 100 оверлеев
-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay{
if(overlay == circle){
pointCircleView = [[MKCircleView alloc]initWithOverlay:overlay];
pointCircleView.strokeColor = [UIColor greenColor];
pointCircleView.fillColor = [UIColor redColor];
//circleView.alpha = 0.5;
pointCircleView.lineWidth = 4.0;
return pointCircleView;
}
else if(overlay == polyLine){
borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
borderView.strokeColor = [UIColor blackColor];
borderView.lineWidth = 1.0;
return borderView;
}
else if(overlay == polygon){
polygonView = [[MKPolygonView alloc] initWithPolygon:polygon];
polygonView.strokeColor = [UIColor blackColor];
polygonView.lineWidth = 1.0;
polygonView.fillColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.0 alpha:0.4];
return polygonView;
}
}
1 ответ
Моргание смотрите в этом посте - это может быть ошибка в оверлейной системе.
С неровными линиями они выглядят сглаженными на вашем скриншоте, но, возможно, были увеличены. Исходя из экспериментов, я считаю, что наложения отображаются в отдельное растровое изображение для дискретных уровней масштабирования, а затем визуализируются в виде карты, масштабируемой вверх или вниз, чтобы соответствовать текущему уровню масштабирования. Таким образом, может случиться так, что ваше наложение выглядит немного грубым на этом уровне, но увеличение или уменьшение немного улучшает его.
Что касается делегата, вы можете проверить класс оверлея, который передается, чтобы сократить сложность вашего mapView:viewForOverlay
функция, а не проверка на определенные наложения. Так:
if ([overlay isKindOfClass:[MKPolyline class]])
{
borderView = [[MKPolylineView alloc] initWithPolyline:overlay];
borderView.strokeColor = [UIColor blackColor];
borderView.lineWidth = 1.0;
return borderView;
}