полный пример gettext в php

Фактически на MKMapView по умолчанию - аннотация (например, контакт или изображение) и выноска (например, пузырь) остаются того же размера, что и вы увеличиваете или уменьшаете масштаб. Они не масштабируются. Но я получаю вашу точку зрения по отношению к карте, которую они, по-видимому, растут по мере того, как карта масштабируется и сжимается по мере приближения карты.

Итак, есть две проблемы в вашей проблеме, и они работают несколько иначе:

  1. Внедрите -(void)mapView:(MKMapView *)pMapView regionDidChangeAnimated:(BOOL)animated из ссылки протокола MKMapViewDelegate, которую вы уже выполнили.
  2. Прикрепите UIPinchGestureRecognizer к объекту MKMapView, а затем выполните действие.

Вариант №1 - mapView:regionDidChangeAnimated: будет вызван либо для прокрутки, либо для события масштабирования - в основном в любое время, когда область карты изменилась с учетом названия. Это приводит к чуть менее плавному изменению размеров значков, потому что события карты срабатывают реже.

Мои настройки предназначены для варианта № 2 - присоедините UIPinchGestureRecognizer к объекту MKMapView и затем выполните действие. События жестового нажатия запускаются довольно быстро, поэтому вы получаете плавное изменение размера значка. И они только срабатывают для распознанного события пинча, поэтому они не будут стрелять во время события прокрутки.

Вызванные методы действия должны соответствовать одной из следующих подписей:

- (void)handleGesture; - (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;

blockquote>

Вы должны быть осторожны, чтобы не переопределять поведение по умолчанию по умолчанию для карт. См. Это сообщение: «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 .

  1. Измените размер аннотационного изображения и выноска с помощью преобразования. Лично я думаю, что преобразование приводит к более чистому изменению размера. Но в большинстве случаев - изменение размера выноски не требуется.
  2. Измените размер только аннотационного изображения. Я использую . Тревор 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];
    }
}

Если это работает, не забудьте отметить его как ответ.

38
задан Sherif Buzz 31 October 2010 в 10:59
поделиться