控制的MKMapView在iOS6的动画速度(Controlling the animation s

2019-08-01 05:50发布

我试图按照汽车上的地图视图。

此代码应动画车以相同的速度地图,让注解视图始终出现在中心:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration: 1.0];
[UIView setAnimationBeginsFromCurrentState:YES];

[car setCoordinate:coord];
[mapView setCenterCoordinate:coord];

[UIView commitAnimations];

它在IOS 5的罚款在iOS 6中的地图是不是动画了,但车上没有动画。

我试图[mapView setCenterCoordinate:co animated:YES] ,但随后我无法控制动画速度。 它总是与默认持续时间(0.2秒)动画。

Answer 1:

我今天碰见同一种问题。 我认为问题不靠的MKMapView,但(新)的方式iOS6的管理动画。

看来,在iOS6的,如果前一个已经完成之前发生的动画(取决于运行循环),老得到由新的中断。 我想这只有在“beginsFromCurrentState”选项或属性用于(由新)(取决于如果您使用的是基于块的动画与否)发生。

可以肯定的,我想你应该尝试使用基于块的动画,看看你的动画实在是被另一个中断。

此代码必须等同于你的,让你看到,如果你的动画已经中断或取消(如“成品”是假的):

[UIView animateWithDuration:1.0 delay:0.0f options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionBeginFromCurrentState) animations:^{

    [car setCoordinate:coord];
    [mapView setCenterCoordinate:coord];

} completion:^(BOOL finished){
    NSLog(@"has not been interrupted : %d", finished);
}];

(在IOS <6, “已完成” 应该是真实的...)

在我而言,就显得我的动画是由以下UIViewController的方法,这是由系统中的动画块进行,打断我的动画链中断:

- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;


Answer 2:

我发现,如果格式化像这样标准的UIView AnimationWithDuration将适用:

// create a region with a center coordinate and a degree span
let center = CLLocationCoordinate2D(latitude: 42.3601, longitude: -71.0689)
let span = MKCoordinateSpanMake(1.0, 1.0)
let region = MKCoordinateRegion(center: center, span: span)

UIView.animateWithDuration(3.0,
             delay: 0.0,
           options: .CurveEaseInOut | .AllowUserInteraction,
        animations: {
                    self.mapView.setRegion(region, animated: true);
        },
        completion: { finished in
                    println("completed 3 second animation to new region")
        })

希望对你太作品! :)

(注:有人向我指出,这种反应是对iOS7 / 8和问题对于iOS6的齿轮。)


而且,这个简单的将实际做工精细...

    let c = mkMap.userLocation.coordinate
    let r = CLLocationDistance( 1500 )
    let cr = MKCoordinateRegionMakeWithDistance( c, r, r )

    UIView.animate(withDuration: 1.4, animations: { [weak self] in

        self?.mkMap.setRegion( cr, animated: true)
    })


Answer 3:

这似乎是不可能使用这些方法时,控制动画的速度在iOS 6中MKMapView

- (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;
- (void)setVisibleMapRect:(MKMapRect)mapRect animated:(BOOL)animate;
- (void)setVisibleMapRect:(MKMapRect)mapRect edgePadding:(UIEdgeInsets)insets animated:(BOOL)animate;

但是我发现,有一个持续时间参数的私有方法。 所以,我解决我的问题,通过继承的MKMapView并重写私有方法(一种只能在iOS6的存在):

MyMapView.h

#import <MapKit/MapKit.h>

@interface MyMapView : MKMapView

@property(nonatomic) BOOL overridesAnimationDuration;
@property(nonatomic) NSTimeInterval mapAnimationDuration;

@end

MyMapView.m

@interface MKMapView (Private)
- (void)_setZoomScale:(float)scale centerMapPoint:(CLLocationCoordinate2D)center duration:(double)d animationType:(int)animType;
@end

@implementation MyMapView
- (void)_setZoomScale:(float)scale centerMapPoint:(CLLocationCoordinate2D)center duration:(double)d animationType:(int)animType
{
    if (_overridesAnimationDuration) {
        d = _mapAnimationDuration;
    }
    [super _setZoomScale:scale centerMapPoint:center duration:d animationType:animType];
}    
@end

我已经添加了2个属性,让你覆盖默认的动画时间。 要使用它设置overridesAnimationDuration为YES的区域改变之前,设置mapAnimationDuration到所需的持续时间和开关overridesAnimationDuration在委托调用NO mapView:regionWillChangeAnimated:

请注意,这可能不会在将来的IOS版本工作,因为它是私有的API。 苹果可以删除或更改此方法。



文章来源: Controlling the animation speed of MKMapView in iOS6