问题
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
andlongitudeDelta
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.029690First annotation Longitude:
72.527359Second annotation Latitude:
34.210855Second 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