【问题标题】:Zoom in a MKMapView programmatically以编程方式放大 MKMapView
【发布时间】:2010-11-05 03:08:42
【问题描述】:

我在 iPhone 应用程序中使用 MKMapView。当我单击按钮时,缩放级别必须增加。这是我的第一种方法:

MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];

但是,这段代码没有任何效果,因为我没有更新 longitudeDelta 值。所以我添加了这一行:

zoomIn.span.longitudeDelta *= 0.5;

现在它可以工作了,但只是有时。 latitudeDeltalongitudeDelta 不会以同样的方式变化,我的意思是,它们的值不成比例。知道如何解决这个问题吗?

【问题讨论】:

    标签: iphone mkmapview mapkit


    【解决方案1】:

    要缩小 5%,请将区域纬度/经度增量乘以 1.05

    let region = MKCoordinateRegion(center: mapView.centerCoordinate, span: MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*1.05, longitudeDelta: mapView.region.span.longitudeDelta*1.05))
    self.mapView.setRegion(region, animated: true)
    

    【讨论】:

      【解决方案2】:

      在 Swift 4.2 中

      let location = mapView.userLocation
      let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
      mapView.setRegion(region, animated: true)
      

      【讨论】:

        【解决方案3】:

        mapView.setRegion 方法在您的地图旋转时出现问题

        您可以通过mapView.camera.altitude 属性缩放地图,但它不是动画的:

        mapView.camera.altitude *= 1.05
        

        您可以创建新的相机对象并设置动画:

        let currentCamera = mapView.camera
        let newCamera: MKMapCamera
        if #available(iOS 9.0, *) {
            newCamera = MKMapCamera(lookingAtCenter: currentCamera.centerCoordinate, fromDistance: currentCamera.altitude * 2, pitch: currentCamera.pitch, heading: currentCamera.heading)
        } else {
            newCamera = MKMapCamera()
            newCamera.centerCoordinate = currentCamera.centerCoordinate
            newCamera.heading = currentCamera.heading
            newCamera.altitude = currentCamera.altitude * 2
            newCamera.pitch = currentCamera.pitch
        }
        
        mapView.setCamera(newCamera, animated: true)
        

        【讨论】:

          【解决方案4】:

          只是清理 dkdarel 的答案

          // delta is the zoom factor
          // 2 will zoom out x2
          // .5 will zoom in by x2
          - (void)zoomMap:(MKMapView*)mapView byDelta:(float) delta {
          
              MKCoordinateRegion region = mapView.region;
              MKCoordinateSpan span = mapView.region.span;
              span.latitudeDelta*=delta;
              span.longitudeDelta*=delta;
              region.span=span;
              [mapView setRegion:region animated:YES];
          
          }
          

          Swift 代码:

          func zoomMap(byFactor delta: Double) {
              var region: MKCoordinateRegion = self.mapView.region
              var span: MKCoordinateSpan = mapView.region.span
              span.latitudeDelta *= delta
              span.longitudeDelta *= delta
              region.span = span
              mapView.setRegion(region, animated: true)
          }
          

          【讨论】:

          • 我认为这将是一个正确的快速代码 func zoomRegion( region: inout MKCoordinateRegion, byFactor delta: Double) { var span: MKCoordinateSpan = region.span span.latitudeDelta *= delta span.longitudeDelta *= delta region.span = 跨度 }
          【解决方案5】:

          刚刚将dkardel的解决方案翻译成swift:

          @IBAction func zoomOutButtonClicked(sender: UIButton) {
              let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*2, longitudeDelta: mapView.region.span.longitudeDelta*2)
              let region = MKCoordinateRegion(center: mapView.region.center, span: span)
          
              mapView.setRegion(region, animated: true)
          }
          
          @IBAction func zoomInButtonClicked(sender: UIButton) {
              let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta/2, longitudeDelta: mapView.region.span.longitudeDelta/2)
              let region = MKCoordinateRegion(center: mapView.region.center, span: span)
          
              mapView.setRegion(region, animated: true)
          }
          

          【讨论】:

            【解决方案6】:
            - (IBAction)btnZoomInPressed
            {
                MKCoordinateRegion region;
                MKCoordinateSpan span;
                region.center.latitude = lati;
                region.center.longitude = longi;
                span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta /2.0002;
                span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta /2.0002;
                region.span=span;
                [viewMapSingleVenue setRegion:region animated:TRUE];
            }
            
            - (IBAction)btnZoomOutPressed
            {
                MKCoordinateRegion region;
                MKCoordinateSpan span;
                region.center.latitude = lati;
                region.center.longitude = longi;
                span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta *2;
                span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta *2;
                if(span.latitudeDelta < 200)
                {
                region.span=span;
                [viewMapSingleVenue setRegion:region animated:TRUE];
                }
            }
            

            【讨论】:

              【解决方案7】:

              这是我将地图移动到注释点并非常接近它缩放的方法。您可以轻松更改放大线CGFloat newLatDelta = 0.06f;

              - (void)moveMapToAnnotation:(MKPointAnnotation*)annotation
              {
                  CGFloat fractionLatLon = map.region.span.latitudeDelta / map.region.span.longitudeDelta;
                  CGFloat newLatDelta = 0.06f;
                  CGFloat newLonDelta = newLatDelta * fractionLatLon;
                  MKCoordinateRegion region = MKCoordinateRegionMake(annotation.coordinate, MKCoordinateSpanMake(newLatDelta, newLonDelta));
                  [map setRegion:region animated:YES];
              }
              

              【讨论】:

              • 这正是我一直在寻找的......谢谢兄弟
              【解决方案8】:

              这是一个更简单的解决方案:

              MKUserLocation *userLocation = mapView.userLocation;
              MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
                    userLocation.location.coordinate, 50, 50);
              [mapView setRegion:region animated:NO];
              

              【讨论】:

                【解决方案9】:

                我不知道这是否是正确的做法,但我正在使用它来放大和缩小。

                        case 0: { // Zoom In
                        //NSLog(@"Zoom - IN");
                        MKCoordinateRegion region;
                        //Set Zoom level using Span
                        MKCoordinateSpan span;  
                        region.center=mapView.region.center;
                
                        span.latitudeDelta=mapView.region.span.latitudeDelta /2.0002;
                        span.longitudeDelta=mapView.region.span.longitudeDelta /2.0002;
                        region.span=span;
                        [mapView setRegion:region animated:TRUE];
                    }
                        break;
                
                    // Zoom Out 
                    case 2: {
                        //NSLog(@"Zoom - OUT");
                        MKCoordinateRegion region;
                        //Set Zoom level using Span
                        MKCoordinateSpan span;  
                        region.center=mapView.region.center;
                        span.latitudeDelta=mapView.region.span.latitudeDelta *2;
                        span.longitudeDelta=mapView.region.span.longitudeDelta *2;
                        region.span=span;
                        [mapView setRegion:region animated:TRUE];
                    }
                

                【讨论】:

                • 这对我也有帮助,谢谢兄弟
                • 这工作正常,但是当我不断按下缩小按钮时,它在一定程度上给了我异常。我该如何预防?
                • 酷。除以 2.0002 而不是 2 有什么意义?只是好奇:)
                • hee Zoom -Out Code 在我连续按下时崩溃,你能告诉我如何解决吗?这是崩溃日志:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“无效区域
                【解决方案10】:

                我使用与您类似的代码,它似乎可以工作。可能发生的情况是您的增量变化不足以导致缩放级别从一个谷歌缩放级别增加到下一个。这也取决于地图的初始状态,这可以解释为什么它是间歇性的 - 那么在用户按下缩放按钮之前如何设置地图和缩放级别?

                您还可以查看 regionThatFits 方法,该方法将调整您提供的区域(名称来自内存,因为我手边没有苹果文档)。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2020-08-19
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多