菜鸟教程小白 发表于 2022-12-11 18:28:40

ios - MKOverlayRenderer 拉伸(stretch)图像


                                            <p><p>我想在 map 叠加层中放置一张图片,该叠加层将与 map 一起缩放。使用下面的代码,图像会出现在 mapView 中,但会被拉伸(stretch)以适应 View 。如何在叠加层内保持图像的原始纵横比?</p>

<p><strong>MapOverlay.swift</strong></p>

<pre><code>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
    }
}
</code></pre>

<p><strong>MapOverlayView.swift</strong></p>

<pre><code>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)
    }
}
</code></pre>

<p><strong>ViewController.swift</strong></p>

<pre><code>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 = mapview.visibleMapRect
      let overlay = MapOverlay(coord: location, rect: rec)
      mapview.add(overlay)
    }

}

extension ViewController: MKMapViewDelegate {

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -&gt; MKOverlayRenderer {

      if overlay is MapOverlay {
            let logo = UIImage(named: &#34;swift&#34;)
            let overlayView = MapOverlayView(overlay: overlay, overlayImage: logo)
            return overlayView
      } else {
            return MKPolylineRenderer()
      }
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在你的 ViewController.swift 中,在 viewDidLoad() 中,</p>

<pre><code>let rec = mapview.visibleMapRect
</code></pre>

<p>改变这个,<code>rec</code>应该和使用的图片大小完全一样。</p>

<pre><code>            let location = //Give your location here in CLLocationCoordinate2D
            //1. Show direction Using Overlays
            let span = MKCoordinateSpanMake(1.0, 1.0)
            let region = MKCoordinateRegion(center: location, span: span)
            let mapRect: MKMapRect = helperClass.MKMapRectForCoordinateRegion(region: region)
            let overlay = MapOverlay(identifier: title, coord: location, rect: mapRect)
            mapView.add(overlay)
</code></pre>

<p>获取MKMapRect的函数</p>

<pre><code>func MKMapRectForCoordinateRegion(region:MKCoordinateRegion) -&gt; MKMapRect {
      let topLeft = CLLocationCoordinate2D(latitude: region.center.latitude + (region.span.latitudeDelta/2), longitude: region.center.longitude - (region.span.longitudeDelta/2))
      let bottomRight = CLLocationCoordinate2D(latitude: region.center.latitude - (region.span.latitudeDelta/2), longitude: region.center.longitude + (region.span.longitudeDelta/2))

      let a = MKMapPointForCoordinate(topLeft)
      let b = MKMapPointForCoordinate(bottomRight)

      return MKMapRect(origin: MKMapPoint(x:min(a.x,b.x), y:min(a.y,b.y)), size: MKMapSize(width: abs(a.x-b.x), height: abs(a.y-b.y)))
    }
</code></pre>

<p>示例项目可以在 <a href="https://github.com/abin0992/AnimatedMapOverlay" rel="noreferrer noopener nofollow">link</a> 中找到</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - MKOverlayRenderer 拉伸(stretch)图像,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41429515/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41429515/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - MKOverlayRenderer 拉伸(stretch)图像