Ios 基于mapkit覆盖的UIImage动画

Ios 基于mapkit覆盖的UIImage动画,ios,overlay,mapkit,Ios,Overlay,Mapkit,我正试图在美国地图上制作一系列雷达图像的动画。我有一份从NOAA网站下载的雷达gif图像列表 如何在mapkit覆盖上实现一系列图像的动画? 我在这里看到了这些帖子: 和 但是找不到解决方案。以下是iOS7的最佳解决方案mkoverlayrender使向MKMapkit添加动画变得非常困难。按照此示例进行操作。我通过在视图控制器中创建计时器解决了此问题。每次计时器启动时,它都会调用自定义mkoverlayrender的setNeedsDisplay方法。在renderer子类drawMapRe

我正试图在美国地图上制作一系列雷达图像的动画。我有一份从NOAA网站下载的雷达gif图像列表

如何在mapkit覆盖上实现一系列图像的动画? 我在这里看到了这些帖子: 和


但是找不到解决方案。

以下是iOS7的最佳解决方案
mkoverlayrender
使向
MKMapkit
添加动画变得非常困难。按照此示例进行操作。

我通过在视图控制器中创建计时器解决了此问题。每次计时器启动时,它都会调用自定义mkoverlayrender的setNeedsDisplay方法。在renderer子类drawMapRect方法中,我有以下代码来更新覆盖上的图像:

-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context{
    if (!weatherDataStore) //This is the store where I have my radar images
        weatherDataStore = [WeatherDataStore sharedInstance];

    UIImage *image = [weatherDataStore currentRadarImage];
    if (!image || ![image isKindOfClass:[UIImage class]]) {
        return;
    }

    CGImageRef imageReference = image.CGImage;
    CGContextSetAlpha(context, 0.8);
    MKMapRect theMapRect = [self.overlay boundingMapRect];
    CGRect theRect = [self rectForMapRect:theMapRect];

    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextTranslateCTM(context, 0.0, -theRect.size.height);

    CGContextDrawImage(context, theRect, imageReference);
}
SWIFT

通过子类化MKOverlay和mkoverlarenderer将图像添加为覆盖

MapOverlay.swift

import UIKit
import MapKit

    class MapOverlay: NSObject, MKOverlay {

        var coordinate: CLLocationCoordinate2D
        var boundingMapRect: MKMapRect

        init(coord: CLLocationCoordinate2D, rect: MKMapRect) {
            self.coordinate = coord
            self.boundingMapRect = rect
        }
    }
import UIKit
import MapKit

class MapOverlayView: MKOverlayRenderer {

    var overlayImage: UIImage

    init(overlay: MKOverlay, overlayImage:UIImage) {
        self.overlayImage = overlayImage
        super.init(overlay: overlay)
    }

    override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) {
        let mapImage = overlayImage.cgImage
        let mapRect = rect(for: overlay.boundingMapRect)
        context.scaleBy(x: 1.0, y: -1.0)
        context.translateBy(x: 0.0, y: -mapRect.size.height)
        context.draw(mapImage!, in: mapRect)
    }
}
import UIKit
import MapKit

class ViewController: UIViewController {

    @IBOutlet weak var mapview: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapview.delegate = self

        let location = CLLocationCoordinate2D(latitude: 47.6062, longitude: -122.3320)
        let span = MKCoordinateSpanMake(2.0, 2.0)
        let region = MKCoordinateRegion(center: location, span: span)
        mapview.setRegion(region, animated: true)

        let rec = should be same as your image size 
        let overlay = MapOverlay(coord: location, rect: rec)
        mapview.add(overlay)
    }

}



extension ViewController: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

        if overlay is MapOverlay {
            let logo = UIImage(named: "swift")
            let overlayView = MapOverlayView(overlay: overlay, overlayImage: logo)
            return overlayView
        } else {
            return MKPolylineRenderer()
        }
    }
}
MapOverlayView.swift

import UIKit
import MapKit

    class MapOverlay: NSObject, MKOverlay {

        var coordinate: CLLocationCoordinate2D
        var boundingMapRect: MKMapRect

        init(coord: CLLocationCoordinate2D, rect: MKMapRect) {
            self.coordinate = coord
            self.boundingMapRect = rect
        }
    }
import UIKit
import MapKit

class MapOverlayView: MKOverlayRenderer {

    var overlayImage: UIImage

    init(overlay: MKOverlay, overlayImage:UIImage) {
        self.overlayImage = overlayImage
        super.init(overlay: overlay)
    }

    override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) {
        let mapImage = overlayImage.cgImage
        let mapRect = rect(for: overlay.boundingMapRect)
        context.scaleBy(x: 1.0, y: -1.0)
        context.translateBy(x: 0.0, y: -mapRect.size.height)
        context.draw(mapImage!, in: mapRect)
    }
}
import UIKit
import MapKit

class ViewController: UIViewController {

    @IBOutlet weak var mapview: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapview.delegate = self

        let location = CLLocationCoordinate2D(latitude: 47.6062, longitude: -122.3320)
        let span = MKCoordinateSpanMake(2.0, 2.0)
        let region = MKCoordinateRegion(center: location, span: span)
        mapview.setRegion(region, animated: true)

        let rec = should be same as your image size 
        let overlay = MapOverlay(coord: location, rect: rec)
        mapview.add(overlay)
    }

}



extension ViewController: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

        if overlay is MapOverlay {
            let logo = UIImage(named: "swift")
            let overlayView = MapOverlayView(overlay: overlay, overlayImage: logo)
            return overlayView
        } else {
            return MKPolylineRenderer()
        }
    }
}
ViewController.swift

import UIKit
import MapKit

    class MapOverlay: NSObject, MKOverlay {

        var coordinate: CLLocationCoordinate2D
        var boundingMapRect: MKMapRect

        init(coord: CLLocationCoordinate2D, rect: MKMapRect) {
            self.coordinate = coord
            self.boundingMapRect = rect
        }
    }
import UIKit
import MapKit

class MapOverlayView: MKOverlayRenderer {

    var overlayImage: UIImage

    init(overlay: MKOverlay, overlayImage:UIImage) {
        self.overlayImage = overlayImage
        super.init(overlay: overlay)
    }

    override func draw(_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext) {
        let mapImage = overlayImage.cgImage
        let mapRect = rect(for: overlay.boundingMapRect)
        context.scaleBy(x: 1.0, y: -1.0)
        context.translateBy(x: 0.0, y: -mapRect.size.height)
        context.draw(mapImage!, in: mapRect)
    }
}
import UIKit
import MapKit

class ViewController: UIViewController {

    @IBOutlet weak var mapview: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapview.delegate = self

        let location = CLLocationCoordinate2D(latitude: 47.6062, longitude: -122.3320)
        let span = MKCoordinateSpanMake(2.0, 2.0)
        let region = MKCoordinateRegion(center: location, span: span)
        mapview.setRegion(region, animated: true)

        let rec = should be same as your image size 
        let overlay = MapOverlay(coord: location, rect: rec)
        mapview.add(overlay)
    }

}



extension ViewController: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {

        if overlay is MapOverlay {
            let logo = UIImage(named: "swift")
            let overlayView = MapOverlayView(overlay: overlay, overlayImage: logo)
            return overlayView
        } else {
            return MKPolylineRenderer()
        }
    }
}
在此调用之后,将调用一个函数来切换mkoverlayrender的alpha值

该项目在github中提供: