Пользовательская анимация булавки - MKMapView - PullRequest
9 голосов
/ 16 апреля 2010

Я использовал изображения выводов в приложении вместо стандартного, теперь я хочу дать анимацию (эффект отбрасывания, как это было со стандартными выводами) для пользовательских выводов. Как я могу обеспечить эффект отбрасывания анимации для пользовательских изображений пин-кодов?

Ответы [ 5 ]

24 голосов
/ 13 июля 2010

Реализуйте следующий метод делегата.

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
   MKAnnotationView *aV; 
   for (aV in views) {
     CGRect endFrame = aV.frame;

     aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - 230.0, aV.frame.size.width, aV.frame.size.height);

     [UIView beginAnimations:nil context:NULL];
     [UIView setAnimationDuration:0.45];
     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
         [aV setFrame:endFrame];
     [UIView commitAnimations];

   }
}
6 голосов
/ 14 марта 2012

Это также намного круче, если вы не бросаете все контакты сразу, а отбрасываете каждый из них с небольшой задержкой, так что будет выглядеть эффект дождя из булавок. Подобно тому, что Apple делает изначально. Используйте это:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    MKAnnotationView *aV; 

    float delay = 0.00;

    for (aV in views) {
        CGRect endFrame = aV.frame;

        aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - 430.0, aV.frame.size.width, aV.frame.size.height);
        delay = delay + 0.01;

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDelay:delay];
        [UIView setAnimationDuration:0.45];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [aV setFrame:endFrame];
        [UIView commitAnimations];
    }
}
0 голосов
/ 10 августа 2017

Swift 3 анимация выпадения

// animate annotation views drop
func mapView(_ mapView: MKMapView, didAdd views: [MKAnnotationView]) {
        for annView in views {

            // animate any annotation views except the user pin
            if !(annView.annotation?.isKind(of: MKUserLocation.self))! {
                let endFrame = annView.frame
                annView.frame = endFrame.offsetBy(dx: 0, dy: -500)
                UIView.animate(withDuration: 0.5, animations: {
                    annView.frame = endFrame
                })
            }
        }
0 голосов
/ 08 августа 2013

Обратите внимание, что анимация представления аннотации в -mapView:didAddAnnotationViews: вызывает странные эффекты, когда MKMapView.userTrackingMode равно MKUserTrackingModeFollowWithHeading. Хотелось бы, чтобы Apple сделала анимацию выпадения доступной для класса MKAnnotationView.

0 голосов
/ 24 мая 2012

Это хорошо сработало для меня. Не могу вспомнить, где я нашел это здесь, хотя

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
MKAnnotationView *aV; 

for (aV in views) {

    // Don't pin drop if annotation is user location
    if ([aV.annotation isKindOfClass:[MKUserLocation class]]) {
        continue;
    }

    // Check if current annotation is inside visible map rect, else go to next one
    MKMapPoint point =  MKMapPointForCoordinate(aV.annotation.coordinate);
    if (!MKMapRectContainsPoint(self.mapView.visibleMapRect, point)) {
        continue;
    }

    CGRect endFrame = aV.frame;

    // Move annotation out of view
    aV.frame = CGRectMake(aV.frame.origin.x, aV.frame.origin.y - self.view.frame.size.height, aV.frame.size.width, aV.frame.size.height);

    // Animate drop
    [UIView animateWithDuration:0.3 delay:0.03*[views indexOfObject:aV] options:UIViewAnimationCurveLinear animations:^{

        aV.frame = endFrame;

        // Animate squash
    }completion:^(BOOL finished){
        if (finished) {
            [UIView animateWithDuration:0.05 animations:^{
                aV.transform = CGAffineTransformMakeScale(1.0, 0.8);

            }completion:^(BOOL finished){
                if (finished) {
                    [UIView animateWithDuration:0.5 animations:^{
                        aV.transform = CGAffineTransformIdentity;
                    }];
                }
            }];
        }
    }];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...