MapKit - Добавление изображений в аннотации - PullRequest
0 голосов
/ 01 мая 2020

Я скажу следующее с обычным - я ни в коем случае не разработчик.

Я работаю над небольшим проектом, где я взял существующий файл kml для локаций в Нью-Йорке C. Я преобразовал его в geo json, а затем использовал этот учебник для составления карты этих мест

https://www.raywenderlich.com/7738344-mapkit-tutorial-getting-started#toc -anchor-012

Все хорошо уже. У меня есть geo json, отображающий стандартные маркеры по всей карте, и аннотации направлены к соответствующим заголовкам и т. Д. c.

Теперь я буду sh, чтобы идти дальше, и у меня есть некоторые проблемы и я не уверен на подходе, чтобы взять.

Geo json У меня есть следующий формат для каждой записи:

{"features": [{ "type": "Feature", "properties":{ "Name": "Battery Park 1","gx_media_links": "https://imgur.com/wgcqauR.jpg" },"geometry": { "type": "Point", "coordinates": [ -74.015086, 40.703464 ] } }

Все это прекрасно работает, передавая через как строки. Однако я бы хотел, чтобы в аннотациях были изображения, перечисленные в gx_media_links. т.е. вы нажимаете на маркер, и появляется всплывающая аннотация с jpg, поставляемым в json, вместе с «Name»

Прямо сейчас, если я пройду через gx_media_links в аннотацию, я, очевидно, получу строку url.

Я пытался протолкнуть его как UIImage вместо строки, но, похоже, это не очень помогает ... и я столкнулся с множеством проблем, просто заставить его собрать.

Я понимаю, что мне может понадобиться нажать на URL изображения, загрузить изображение и затем передать его в одно из значений. Если у кого-нибудь есть хорошие уроки, которыми я мог бы следовать, пожалуйста, дайте мне знать. Заранее спасибо!

Я полный нуб к этому, поэтому нужно подробно объяснить, где это возможно, например, где разместить указанный код и т. Д. c! Вот два основных файла, которые я использую.

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

Artwork.swift

import Foundation
import MapKit

class Artwork: NSObject, MKAnnotation {
    let title: String?
    let coordinate: CLLocationCoordinate2D


    init(
        title: String?,
        coordinate: CLLocationCoordinate2D

        ) {
        self.title = title
        self.coordinate = coordinate

        super.init()
    }
    @available(iOS 13.0, *)
    init?(feature: MKGeoJSONFeature) {
        // 1
        guard
            let point = feature.geometry.first as? MKPointAnnotation,
            let propertiesData = feature.properties,
            let json = try? JSONSerialization.jsonObject(with: propertiesData),
            let properties = json as? [String: Any]
            else {
                return nil
        }

        // 3
        title = properties["Name"] as? String
        coordinate = point.coordinate


        super.init()
    }

}

А вот и контроллер вида.

import UIKit
import MapKit



private var artworks: [Artwork] = []
@available(iOS 13.0, *)
class ViewController: UIViewController {
@IBOutlet private var mapView: MKMapView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Set initial location in NYC
        let initialLocation = CLLocation(latitude: 40.7180, longitude: -73.9887)
        mapView.centerToLocation(initialLocation)
        mapView.delegate = self
        loadInitialData()
        mapView.addAnnotations(artworks)
        let nycCenter = CLLocation(latitude: 40.7180, longitude: -73.9887)
        let region = MKCoordinateRegion(
          center: nycCenter.coordinate,
          latitudinalMeters: 50000,
          longitudinalMeters: 60000)
        mapView.setCameraBoundary(
          MKMapView.CameraBoundary(coordinateRegion: region),
          animated: true)
        let zoomRange = MKMapView.CameraZoomRange(maxCenterCoordinateDistance: 200000)
        mapView.setCameraZoomRange(zoomRange, animated: true)

    }
}
private extension MKMapView {
    func centerToLocation(
        _ location: CLLocation,
        regionRadius: CLLocationDistance = 5000
        ) {
        let coordinateRegion = MKCoordinateRegion(
            center: location.coordinate,
            latitudinalMeters: regionRadius,
            longitudinalMeters: regionRadius)
        setRegion(coordinateRegion, animated: true)
    }
}
@available(iOS 13.0, *)
private func loadInitialData() {
  // 1
  guard
    let fileName = Bundle.main.url(forResource: "Weegee_2", withExtension: "geojson"),
    let artworkData = try? Data(contentsOf: fileName)
    else {
      return
  }

  do {
    // 2
    let features = try MKGeoJSONDecoder()
      .decode(artworkData)
      .compactMap { $0 as? MKGeoJSONFeature }
    // 3
    let validWorks = features.compactMap(Artwork.init)
    // 4
    artworks.append(contentsOf: validWorks)
  } catch {
    // 5
    print("Unexpected error: \(error).")
  }
}

@available(iOS 13.0, *)
extension ViewController: MKMapViewDelegate {
    // 1
    func mapView(
        _ mapView: MKMapView,
        viewFor annotation: MKAnnotation
        ) -> MKAnnotationView? {
        // 2
        guard let annotation = annotation as? Artwork else {
            return nil
        }
        // 3
        let identifier = "artwork"
        var view: MKMarkerAnnotationView
        // 4
        if let dequeuedView = mapView.dequeueReusableAnnotationView(
            withIdentifier: identifier) as? MKMarkerAnnotationView {
            dequeuedView.annotation = annotation
            view = dequeuedView
        } else {
            // 5
            view = MKMarkerAnnotationView(
                annotation: annotation,
                reuseIdentifier: identifier)
            view.canShowCallout = true
            view.calloutOffset = CGPoint(x: -5, y: 5)
            view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
        }
        return view
    }
}
...