Фактически на MKMapView по умолчанию - аннотация (например, контакт или изображение) и выноска (например, пузырь) остаются того же размера, что и вы увеличиваете или уменьшаете масштаб. Они не масштабируются. Но я получаю вашу точку зрения по отношению к карте, которую они, по-видимому, растут по мере того, как карта масштабируется и сжимается по мере приближения карты.
Итак, есть две проблемы в вашей проблеме, и они работают несколько иначе:
-(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated
из ссылки протокола MKMapViewDelegate, которую вы уже выполнили. UIPinchGestureRecognizer
к объекту MKMapView, а затем выполните действие. Вариант №1 - mapView:regionDidChangeAnimated:
будет вызван либо для прокрутки, либо для события масштабирования - в основном в любое время, когда область карты изменилась с учетом названия. Это приводит к чуть менее плавному изменению размеров значков, потому что события карты срабатывают реже.
Мои настройки предназначены для варианта № 2 - присоедините UIPinchGestureRecognizer
к объекту MKMapView и затем выполните действие. События жестового нажатия запускаются довольно быстро, поэтому вы получаете плавное изменение размера значка. И они только срабатывают для распознанного события пинча, поэтому они не будут стрелять во время события прокрутки.
Вызванные методы действия должны соответствовать одной из следующих подписей:
blockquote>
- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;
Вы должны быть осторожны, чтобы не переопределять поведение по умолчанию по умолчанию для карт. См. Это сообщение: «UIMapView: UIPinchGestureRecognizer не называется» для получения дополнительной информации. Короткий ответ заключается в том, что вы должны реализовать
shouldRecognizeSimultaneouslyWithGestureRecognizer:
и вернуть YES.Все сказанное здесь - это пример кода:
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; self.mapView.mapType = MKMapTypeStandard; // also MKMapTypeSatellite or MKMapTypeHybrid // Add a pinch gesture recognizer UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)]; pinchRecognizer.delegate = self; [self.mapView addGestureRecognizer:pinchRecognizer]; [pinchRecognizer release]; } #pragma mark - #pragma mark UIPinchGestureRecognizer - (void)handlePinchGesture:(UIPinchGestureRecognizer *)pinchRecognizer { if (pinchRecognizer.state != UIGestureRecognizerStateChanged) { return; } MKMapView *aMapView = (MKMapView *)pinchRecognizer.view; for (id
annotation in aMapView.annotations) { // if it's the user location, just return nil. if ([annotation isKindOfClass:[MKUserLocation class]]) return; // handle our custom annotations // if ([annotation isKindOfClass:[MKPointAnnotation class]]) { // try to retrieve an existing pin view first MKAnnotationView *pinView = [aMapView viewForAnnotation:annotation]; //Format the pin view [self formatAnnotationView:pinView forMapView:aMapView]; } } } - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } Итак, на этом этапе у вас снова есть несколько вариантов как изменить размер аннотации. Оба следующих примера кода полагаются на код Трой Бранта для получения уровня масштабирования MKMapView .
- Измените размер аннотационного изображения и выноска с помощью преобразования. Лично я думаю, что преобразование приводит к более чистому изменению размера. Но в большинстве случаев - изменение размера выноски не требуется.
- Измените размер только аннотационного изображения. Я использую . Тревор Harmon's Resize a UIImage правильный путь , но опять же мое мнение состоит в том, что оно не так чисто выглядит, как изменение размера.
Вот еще пример кода:
- (void)formatAnnotationView:(MKAnnotationView *)pinView forMapView:(MKMapView *)aMapView { if (pinView) { double zoomLevel = [aMapView zoomLevel]; double scale = -1 * sqrt((double)(1 - pow((zoomLevel/20.0), 2.0))) + 1.1; // This is a circular scale function where at zoom level 0 scale is 0.1 and at zoom level 20 scale is 1.1 // Option #1 pinView.transform = CGAffineTransformMakeScale(scale, scale); // Option #2 UIImage *pinImage = [UIImage imageNamed:@"YOUR_IMAGE_NAME_HERE"]; pinView.image = [pinImage resizedImage:CGSizeMake(pinImage.size.width * scale, pinImage.size.height * scale) interpolationQuality:kCGInterpolationHigh]; } }
Если это работает, не забудьте отметить его как ответ.