MKPinAnnotationView не центрирован

После загрузки пользовательского изображения для MKPinAnnotationView я заметил, что булавка смещена от центра. Штырь должен находиться в точке полилинии маршрута и в центре mkcircle; однако булавка кажется справа от полилинии и немного севернее центра. Я пытался поэкспериментировать со свойством centerOffset, но когда я подставляю значения в свойство, ничего не меняется. Вот код,

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

static NSString *viewID = @"MKPinAnnotationView";
MKPinAnnotationView *annotationView = (MKPinAnnotationView*)
[self.mapView dequeueReusableAnnotationViewWithIdentifier:viewID];

if(annotationView ==nil){
    annotationView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:viewID];
}


annotationView.image = [UIImage imageNamed:@"Pin.png"];
annotationView.enabled = YES;

//doesn't move the pin, still offcentered
annotationView.centerOffset = CGPointMake(0,-50);
return annotationView;
 }

Просто хочу добавить, я также заметил, что с новым изображением булавки ничего не появляется, когда я нажимаю на булавку. Раньше, с булавкой по умолчанию, после нажатия на булавку появлялось всплывающее окно с текстом. Поскольку это так, я хочу включить код метода, который создает и размещает булавку на карте,

-(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D)coordinate{

MKPointAnnotation* annotation = [[MKPointAnnotation alloc]init];
annotation.coordinate = coordinate;
annotation.title = @"This is a pin!";

[mapView addAnnotation:annotation];


}

Я также попытался изменить изображение булавки, чтобы увидеть, повлияет ли это на позиционирование MKPinAnnotationView. Хотя мне удалось центрировать булавку, отредактировав изображение, она не центрируется для других полилиний. Любая помощь будет оценена по достоинству!

Изображение булавки

Изображение булавки относительно маршрута, полилинии и окружности


person Chris Gong    schedule 22.03.2015    source источник
comment
Если вы хотите использовать пользовательское изображение, создайте простой MKAnnotationView (не MKPinAnnotatioView). Это также может исправить центрирование. Чтобы активировать выноску при касании, выполните annotationView.canShowCallout = YES.   -  person    schedule 22.03.2015
comment
Спасибо за ответ анна. Изменение его на MKAnnotationView действительно решило проблему выноски, но аннотация по-прежнему смещена от центра. Я пытался использовать свойства centeroffSet и center, но когда я возился с ними, аннотация, похоже, не двигалась.   -  person Chris Gong    schedule 22.03.2015
comment
Обратите внимание, что centerOffset не масштабируется с уровнем масштабирования карты. Это фиксированное значение, поэтому вы должны установить его так, чтобы точка на изображении, которая должна соответствовать фактической координате, оставалась такой. Изменение его на MKAnnotationView не имело никакого отношения к выноске (это сделала установка canShowCallout).   -  person    schedule 23.03.2015
comment
Я не уверен, правильно ли я читаю, но нельзя ли переместить аннотацию? Аннотация находится немного правее центра mkcircle, в котором она размещена, если это поможет.   -  person Chris Gong    schedule 23.03.2015
comment
Пожалуйста, отредактируйте вопрос и опубликуйте Pin.png и небольшой скриншот того, как аннотация выглядит на карте относительно круга.   -  person    schedule 23.03.2015
comment
Хорошо, я добавил фотографии, которые вы просили!   -  person Chris Gong    schedule 24.03.2015


Ответы (2)


Во-первых, важным моментом является то, что при использовании пользовательского изображения аннотации лучше всего использовать простой класс MKAnnotationView вместо его подкласса MKPinAnnotationView, который предназначен для автоматического отображения стандартного изображения булавки.

Это связано с тем, что MKPinAnnotationView включает в себя некоторые встроенные настройки рамки представления аннотации и centerOffset на основе собственного изображения булавки. В некоторых случаях ваше пользовательское изображение даже будет заменено на экране изображением булавки по умолчанию. Таким образом, хотя MKPinAnnotationView имеет свойство image, класс не всегда будет использовать его должным образом.

Во-вторых, установите centerOffset таким образом, чтобы при увеличении карты часть изображения, которая «указывает» на координату, продолжала указывать на координату. Это связано с тем, что centerOffset находится на экране CGPoints и не масштабируется с уровнем масштабирования карты. Если centerOffset не установлен должным образом, "точка" изображения начнет дрейфовать от целевой координаты.

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


Основываясь на опубликованном вами изображении, вот код и итоговый внешний вид без установки centerOffset (оставив значение по умолчанию):

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    static NSString *viewID = @"MKPinAnnotationView";

    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:viewID];

    if (annotationView ==nil) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewID];
        annotationView.image = [UIImage imageNamed:@"Pin.png"];
        annotationView.canShowCallout = YES;
    }
    else {
        annotationView.annotation = annotation;
    }

    return annotationView;
}

введите здесь описание изображения

(Я добавил красные центральные линии, чтобы показать, где координата цели относительно изображения булавки.)


Вот код и итоговый внешний вид с centerOffset, установленным так, чтобы нижняя часть указывала на координату:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    static NSString *viewID = @"MKPinAnnotationView";

    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:viewID];

    if (annotationView ==nil) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:viewID];
        annotationView.image = [UIImage imageNamed:@"Pin.png"];
        annotationView.canShowCallout = YES;
        annotationView.centerOffset = CGPointMake(0,-15);
    }
    else {
        annotationView.annotation = annotation;
    }

    return annotationView;
}

введите здесь описание изображения

person Community    schedule 24.03.2015
comment
Спасибо за хорошо структурированный ответ! Я изменил свой код, но centerOffset, похоже, ничего не делает. Я не понимаю, почему свойство centerOffset не работает. Штифт все еще находится в том же месте. - person Chris Gong; 24.03.2015
comment
Я знаю, что прошло несколько дней, но я до сих пор не смог найти решение. Когда я ввожу любые значения для свойства centeroffset, ничего не меняется. Пожалуйста помоги! - person Chris Gong; 28.03.2015
comment
Это странно, так как calloutOffset работает, но не centerOffset - person Chris Gong; 28.03.2015

Вы должны установить MKCoordinateRegion для загрузки карты, отредактируйте свой метод createAndAddAnnotationForCoordinate, как показано ниже.

-(void) createAndAddAnnotationForCoordinate : (CLLocationCoordinate2D)coordinate{

MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(coordinate, 3000, 3000); //Set zooming level
    MKCoordinateRegion adjustedRegion = [mapView regionThatFits:viewRegion]; //add location to map
    [mapView setRegion:adjustedRegion animated:YES]; // create animation zooming

MKPointAnnotation* annotation = [[MKPointAnnotation alloc]init];
annotation.coordinate = coordinate;
annotation.title = @"This is a pin!";

[mapView addAnnotation:annotation];


}
person DilumN    schedule 22.03.2015
comment
Спасибо за ответ. MKCoordinateRegion успешно загружается, а добавленный вами код уже находится в моем методе viewdidLoad. Штифт по-прежнему смещен от центра, а заголовок не отображается. Однако, если я избавился от переопределенного метода viewForAnnotation, то булавка (с изображением по умолчанию) центрируется с всплывающим заголовком. - person Chris Gong; 22.03.2015
comment
попробуйте этот код, прежде чем возвращать annotationView в методе viewForAnnotation, annotationView.center = CGPointMake(annotationView.bounds.size.width*0.1f, -annotationView.bounds.size.height*0.5f); - person DilumN; 22.03.2015
comment
Я добавил строку кода, и булавка осталась не по центру. Не похоже, что код переместил булавку. - person Chris Gong; 22.03.2015
comment
Затем попробуйте следующее: UIImage *pin = [UIImage imageNamed:@Pin.png]; annotationView.center = CGPointMake(pin.size.width*0.1f, -pin.size.height*0.5f); - person DilumN; 23.03.2015
comment
К сожалению, дополнительный код никак не повлиял на расположение вывода. - person Chris Gong; 24.03.2015