All Annotation is not visible to user in MKMapView

我怕爱的太早我们不能终老 提交于 2019-12-10 14:13:01

问题


I am using MKMapView and have added a number of annotation pins to the map. All annotation belong to different country, so i do not able to set all annotation visible to user.

Please do try using below latitude and longitude for annotation.

First annotation Latitude:23.029690

First annotation Longitude: 72.527359

Second annotation Latitude:34.210855

Second annotation Longitude: -118.622636

Code for add annotation to mapview.

CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([[dicObjects valueForKey:K_Latitude] doubleValue], [[dicObjects valueForKey:K_Longitude] doubleValue]);
MyCustomAnnotation *myCustomAnnotation = [[MyCustomAnnotation alloc]initWithTitle:[NSString stringWithFormat:@"%@           ",[dicObjects valueForKey:K_Title]] Subtitle:[NSString stringWithFormat:@"%@",[dicObjects valueForKey:K_SubTitle]] andDescritpion:[NSString stringWithFormat:@"%@",[dicObjects valueForKey:K_TitelDes]] withLocation:coordinate andImageName:[dicObjects valueForKey:K_Rating] andTagValue:intTempCounter];
[mapViewPledgeList addAnnotation:myCustomAnnotation];

MyCustomAnnotation.h

@interface MyCustomAnnotation : NSObject<MKAnnotation>

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (copy, nonatomic) NSString *title;
@property (copy, nonatomic) NSString *subTitle;
@property (copy, nonatomic) NSString *titleDescritpion;
@property (copy, nonatomic) NSString *strImageName;
@property  int intTagValue;


- (id)initWithTitle:(NSString *)newTitle Subtitle:(NSString *)subTitle andDescritpion:(NSString *)titleDescritpion withLocation:(CLLocationCoordinate2D)location andTagValue:(int) intTag;
- (MKAnnotationView *)annotationView;
- (id)initWithTitle:(NSString *)newTitle Subtitle:(NSString *)subTitle andDescritpion:(NSString *)titleDescritpion withLocation:(CLLocationCoordinate2D)location andImageName:(NSString*) strImageName andTagValue:(int) intTag;
@end

MyCustomAnnotation.m

#import "MyCustomAnnotation.h"

@implementation MyCustomAnnotation


#pragma mark - Custom Annotation View Setup
- (MKAnnotationView *)annotationView{

    MKAnnotationView *annotationView = [[MKAnnotationView alloc]initWithAnnotation:self reuseIdentifier:K_ID_CUSTOM_ANNOTATION];
    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    annotationView.image = kImage(_strImageName);

    UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    button.frame = CGRectMake(0, 0, 23, 23);
    button.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
    [button setImage:[[UIImage imageNamed:@"NextArrow"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
    annotationView.rightCalloutAccessoryView = button;

    return annotationView;
}

- (id)initWithTitle:(NSString *)newTitle Subtitle:(NSString *)subTitle andDescritpion:(NSString *)titleDescritpion withLocation:(CLLocationCoordinate2D)location andImageName:(NSString*) strImageName andTagValue:(int) intTag{

    self = [super init];

    if(self){
        _title = newTitle;
        _subTitle = subTitle;
        _titleDescritpion = titleDescritpion;
        _coordinate = location;


        if ([strImageName intValue] == 1) {
            _strImageName = @"MapViewPinRed";

        }else if([strImageName intValue] == 2){
            _strImageName = @"MapViewPinOrange";

        }else if ([strImageName intValue] == 3){
            _strImageName = @"MapViewPinYellow";

        }else if ([strImageName intValue] == 4){
            _strImageName = @"MapViewPinLightGreen";

        }else{
            _strImageName = @"MapViewPinGreen";

        }
    }

    return self;
}

    @end

I was try below solution but it is not working.

1) Using MKMapRectUnion

 MKMapRect zoomRect = MKMapRectNull;
    for (id <MKAnnotation> annotation in mapViewPledgeList.annotations)
    {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        zoomRect = MKMapRectUnion(zoomRect, pointRect);
    }
    [mapViewPledgeList setVisibleMapRect:zoomRect animated:YES];

2) Using showAnnotations

 [mapViewPledgeList showAnnotations:mapViewPledgeList.annotations animated:YES];

Issue:- suggest any solution so all annotation keep visible to user.


回答1:


Don't forget to add annotation to the map. Maybe this could be the problem

[self.mapView addAnnotation:point]; 



回答2:


You need to tell the mapView the correct value of region which is of type MKCoordinateRegion. You need to do some calculations before you could tell the mapView to show correct region.

A. Find out value of following variables by lopping through all available coordinates array.

CLLocationDegrees minLatitude = // To be calculated
CLLocationDegrees maxLatitude = // To be calculated

CLLocationDegrees minLongitude = // To be calculated
CLLocationDegrees maxLongitude = // To be calculated

B. Calculate center coordinate for map.

CLLocationCoordinate2D center = 
CLLocationCoordinate2DMake((maxLatitude+minLatitude)/2, (maxLongitude+minLongitude)/2);

C. Calculate latitudeDelta and longitudeDelta values -

CLLocationDegrees latitudeDelta = ABS(maxLatitude-minLatitude)*2;
CLLocationDegrees longitudeDelta = ABS(maxLongitude-minLongitude)*2;

D. Calculate span

MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);

E. Calculate region and tell your mapView to show this -

MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
[mapView setRegion:region animated:YES];

There are a few more considerations while doing this like how much max/min latitudeDelta and longitudeDelta you wish to support. That can be applied to Step C when you are calculating the values.

Hope this helps.




回答3:


You need to inform mapview to perfect region so all the annotation pins are visible.

below swift code help you.

extension MKMapView {
    func getAllAnnotationExpectCurrntLocation() -> [MKAnnotation] {
        var arrAnnotion: [MKAnnotation] = self.annotations
        arrAnnotion = arrAnnotion.filter { $0 !== self.userLocation }
        return arrAnnotion
    }

    func zoomToFitMapAnnotations() {
        guard self.annotations.count != 0 else {
            return
        }

        var topLeftCordinate = CLLocationCoordinate2D(latitude: -90, longitude: 180)
        var bottomRightCordinate = CLLocationCoordinate2D(latitude: 90, longitude: -180)

        for ann in self.getAllAnnotationExpectCurrntLocation() {
            topLeftCordinate.longitude = fmin(topLeftCordinate.longitude, ann.coordinate.longitude)
            topLeftCordinate.latitude = fmax(topLeftCordinate.latitude, ann.coordinate.latitude)

            bottomRightCordinate.longitude = fmax(bottomRightCordinate.longitude, ann.coordinate.longitude)
            bottomRightCordinate.latitude = fmin(bottomRightCordinate.latitude, ann.coordinate.latitude)
        }

        let latitude = topLeftCordinate.latitude - ((topLeftCordinate.latitude - bottomRightCordinate.latitude) * 0.5)
        let longitude = topLeftCordinate.longitude + ((bottomRightCordinate.longitude - topLeftCordinate.longitude) * 0.5)

        let latitudeDelta = fabs(topLeftCordinate.latitude - bottomRightCordinate.latitude) * 1.1
        let longitudeDelta = fabs(bottomRightCordinate.longitude - topLeftCordinate.longitude) * 1.1
        let span: MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)

        let centerCordinate: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
        let region: MKCoordinateRegion = MKCoordinateRegion(center: centerCordinate, span: span)
        let newregion = self.regionThatFits(region)
        self.setRegion(newregion, animated: true)

    }
}



回答4:


Q] All annotation keep visible to user.

  • Unfortunately, it is not possible to set minimum zoom level less then the MKMapView minimum limit.

  • Also in apple official map application below point is not visible at same time

    First annotation Latitude:23.029690

    First annotation Longitude: 72.527359

    Second annotation Latitude: 34.210855

    Second annotation Longitude: -118.622636

Note: We can't zoom in Map View after it's minimum limit.



来源:https://stackoverflow.com/questions/44156227/all-annotation-is-not-visible-to-user-in-mkmapview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!