【问题标题】:UIImage animation over mapkit overlay地图包覆盖上的 UIImage 动画
【发布时间】:2013-09-28 03:35:11
【问题描述】:

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

如何在 mapkit Overlay 上实现一系列图像的动画? 我在这里看到了这些帖子: Animated MKOverlayViewAnimating an MKOverlayView

但找不到解决方案。

【问题讨论】:

    标签: ios overlay mapkit


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我通过在我的视图控制器中创建一个计时器解决了这个问题。每次计时器触发时,它都会为我的自定义 MKOverlayRenderer 调用 setNeedsDisplay 方法。在渲染器子类 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);
      }
      

      【讨论】:

        【解决方案3】:

        SWIFT

        通过子类化 MKOverlay 和 MKOverlarRenderer 将图像添加为叠加层

        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
                }
            }
        

        MapOverlayView.swift

        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)
            }
        }
        

        ViewController.swift

        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()
                }
            }
        }
        

        在此之后调用一个函数来切换 MKOverlayRenderer 的 alpha 值。

        项目在 github 上可用:link

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多