0

1つのピンとユーザーの場所を持つmapViewがあります。VisibleMapRect両方のピンが見えるように設定しました。

私が抱えている問題はMKUserTrackingModeFollowWithHeading、ユーザーに動きの動きを表示するために使用していることです。このようにrectを設定すると、動きが非常にぎくしゃくします。これは、ユーザーの位置情報ピンが地図の中央にないためだと思います。

両方のピンを表示しながら、ユーザーの位置を中央に保つにはどうすればよいですか?

これは、場所を開始してrectを設定する私のコードです。[locationManager startUpdatingLocation];

    // Start heading updates.
    if ([CLLocationManager headingAvailable]) {
        locationManager.headingFilter = kCLHeadingFilterNone;
        [locationManager startUpdatingHeading];
        
        //set the view to fit both the pins 
        MKMapPoint annotationPoint = MKMapPointForCoordinate(MapView.userLocation.coordinate);
        MKMapRect zoomRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
        for (id <MKAnnotation> annotation in MapView.annotations)
        {
           if (![annotation isKindOfClass:[MKUserLocation class]] ) {
                MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
                MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
                zoomRect = MKMapRectUnion(zoomRect, pointRect);

           }
        }
        NSLog(@"%f",zoomRect.size.height);
        NSLog(@"%f",zoomRect.size.width);
        

        [MapView  setVisibleMapRect:zoomRect animated:NO];
       
    }

rectを設定する部分をコメントアウトしてみましたが、ユーザーの動きがスムーズなので、問題はこのコードであることがわかります。

また、rectを使用してrect後の中心点を設定してみました

[MapView setCenterCoordinate:MapView.userLocation.coordinate animated:YES];

これはうまくいかなかったようです。また、後でこれを設定すると、他のピンが表示されなくなる可能性があります。

4

2 に答える 2

2

現在の場所を含むすべての注釈を表示するには、次の方法を使用します

- (void)zoomToFitMapAnnotations:(MKMapView *)mapView {
    if ([mapView.annotations count] == 0) return;
    
    CLLocationCoordinate2D topLeftCoord;
    topLeftCoord.latitude = -90;
    topLeftCoord.longitude = 180;
    
    CLLocationCoordinate2D bottomRightCoord;
    bottomRightCoord.latitude = 90;
    bottomRightCoord.longitude = -180;
    
    for(id<MKAnnotation> annotation in mapView.annotations) {
        topLeftCoord.longitude = fmin(topLeftCoord.longitude, annotation.coordinate.longitude);
        topLeftCoord.latitude = fmax(topLeftCoord.latitude, annotation.coordinate.latitude);
        bottomRightCoord.longitude = fmax(bottomRightCoord.longitude, annotation.coordinate.longitude);
        bottomRightCoord.latitude = fmin(bottomRightCoord.latitude, annotation.coordinate.latitude);
    }
    
    MKCoordinateRegion region;
    region.center.latitude = topLeftCoord.latitude - (topLeftCoord.latitude - bottomRightCoord.latitude) * 0.5;
    region.center.longitude = topLeftCoord.longitude + (bottomRightCoord.longitude - topLeftCoord.longitude) * 0.5;
    region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;
    
    // Add a little extra space on the sides
    region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1;
    
    region = [mapView regionThatFits:region];
    [mapView setRegion:region animated:YES];
}
于 2013-02-01T14:30:27.110 に答える
2

私はこの方法を使用します:

- (void)setRegionFromCoordinates:(NSArray *)waypoints animated:(BOOL)animated {
    if (waypoints != nil) {
        CLLocationDegrees maxX = -DBL_MAX;                        
        CLLocationDegrees maxY = -DBL_MAX;
        CLLocationDegrees minX = DBL_MAX;                               
        CLLocationDegrees minY = DBL_MAX;

        for (NSUInteger i=0; i < waypoints.count; i++) {
            CLLocationCoordinate2D currentLocation = [waypoints objectAtIndex:i];

                MKMapPoint mapPoint = MKMapPointForCoordinate(currentLocation);

                if (mapPoint.x > maxX) {
                    maxX = mapPoint.x;
                }
                if (mapPoint.x < minX) {
                    minX = mapPoint.x;
                }
                if (mapPoint.y > maxY) {
                    maxY = mapPoint.y;
                }
                if (mapPoint.y < minY) {
                    minY = mapPoint.y;
                }

        }

        if (maxX != -DBL_MAX && minX != DBL_MAX) {
            MKMapRect mapRect = MKMapRectMake(minX,minY,maxX-minX,maxY-minY);
            [map setVisibleMapRect:mapRect edgePadding:UIEdgeInsetsMake(50.f, 50.f, 50.f, 50.f) animated:animated];
        }
    }
}
于 2013-02-01T15:08:24.363 に答える