Swift - эффективный способ переключения между несколькими изображениями в MapKit - PullRequest
0 голосов
/ 05 мая 2020

У меня небольшая проблема с отображением изображений радаров дождя на MapKit (переключение между ними каждую секунду). Информация: 14 изображений (каждое: 32-42 КБ, 2000 x 1450 пикселей).

Вопрос 1

Я скачиваю их каждый раз, да. Кэширование на самом устройстве находится в ToDo. Есть предложения?

Вопрос 2

В настоящее время я переключаюсь между этими изображениями каждые 1 секунду (простой таймер на банкомате), выполняя mapView.removeOverlay(layer) и mapView.addOverlay(newLayer). Но это съедает много процессора (около 130%) и памяти. Изображения также мерцают на экране (на моем физическом iPhone), потому что он не получает рендеринг вовремя, этого не происходит на моем эмуляторе iPhone / iPad.

Я храню загруженные изображения в класс / модель (с другой информацией), которая является членом простого var rainLayers = [RainMapOverlay]().

Мой код MapKit выглядит так: ViewController.swift

    var rainLayers = [RainMapOverlay]()
    var currentNumber = -1

    func switchBetweenOverlays()
    {        
        if ( currentNumber > -1 )
            // remove current overlay
            let layer = self.rainLayers[currentNumber]
            mapView.removeOverlay(layer)
        }

        currentNumber += 1

        if ( currentNumber > ( self.rainLayers.count - 1 ) )
        {
            currentNumber = 0
        }

        let layer = self.rainLayers[currentNumber]
        mapView.addOverlay(layer)
    }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
    {
        if ( overlay is RainMapOverlay )
        {
            return ImageMapOverlayView(overlay: overlay)
        }

        return MKOverlayRenderer()
    }

RainMapOverlay.swift

class RainMapOverlay: NSObject, MKOverlay
{
    var coordinate: CLLocationCoordinate2D
    var boundingMapRect: MKMapRect
    var theImage: UIImage
    var layerData: RainMapData
    public var alpha: CGFloat

    init (_ rainData: RainMapData)
    {
        layerData = rainData
        boundingMapRect = rainData.overlayBoundingMapRect
        coordinate = rainData.midCoordinate
        alpha = CGFloat(1.0)

        // download picture - TODO: caching
        let photoUrl = URL(string: rainData.name)
        let photoData = try? Data(contentsOf: photoUrl!)
        theImage = UIImage(data: photoData!)!
    }
}

ImageMapOverlayView.swift

class ImageMapOverlayView: MKOverlayRenderer
{
    override func draw (_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext)
    {
        guard let overlay = self.overlay as? RainMapOverlay else {
            return
        }

        let rect = self.rect(for: overlay.boundingMapRect)

        context.scaleBy(x: 1.0, y: -1.0)
        context.translateBy(x: 0.0, y: -rect.size.height)
        context.setAlpha(overlay.alpha)
        context.draw(overlay.theImage.cgImage!, in: rect)
    }
}

Заранее спасибо!

1 Ответ

0 голосов
/ 08 мая 2020

Обновление до iOS 13.4.x устранило проблему (вопрос 2).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...