I am using MKMapview in my i
You can use custom view for each annotation with one UIView
, one UIImageView
and one Label to display different value. This will be done within the method - (MKAnnotationView *)mapView:(MKMapView *)newMapView viewForAnnotation:(id )newAnnotation
. You have to take UIView
double in size with transparent color with respect to UIImageView
to make more precise view on zoom in and zoom out in mapview.
Code-----
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
static NSString * const kPinAnnotationIdentifier = @"PinIdentifier";
if(annotation == self._mapView.userLocation)
{
return nil;
}
MyAnnotation *myAnnotation = (MyAnnotation *)annotation;
MKAnnotationView *newAnnotation = (MKAnnotationView*)[self._mapView dequeueReusableAnnotationViewWithIdentifier:kPinAnnotationIdentifier];
if(!newAnnotation){
newAnnotation = [[MKAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:@"userloc"];
}
NSDictionary *dict=[alertInfoArray objectAtIndex:myAnnotation.ann_tag];
UIView *anView=[[UIView alloc] init];
anView.backgroundColor=[UIColor clearColor];
UIImageView *bgImg=[[UIImageView alloc] init];
bgImg.image=[UIImage imageNamed:@""];
bgImg.backgroundColor=[UIColor clearColor];
UIImageView *imgView=[[UIImageView alloc] init];
imgView.tag=myAnnotation.ann_tag;
UILabel *lblName=[[UILabel alloc] init];
lblName.font=[UIFont systemFontOfSize:12];
lblName.textAlignment=UITextAlignmentCenter;
lblName.textColor=[UIColor whiteColor];
lblName.backgroundColor=[UIColor clearColor];
lblName.text=TEXT YOU WANT ;
newAnnotation.frame=CGRectMake(0, 0, 70, 212);
anView.frame=CGRectMake(0, 0, 70, 212);
bgImg.frame=CGRectMake(0, 0, 70, 106);
bgImg.image=[UIImage imageNamed:@"thumb-needhelp.png"];
imgView.frame=CGRectMake(8,25,55,48);
imgView.image=[UIImage imageNamed:@"girl-default.png"];
lblName.frame=CGRectMake(5,79,60,10);
[anView addSubview:bgImg];
[bgImg release];
[anView addSubview:imgView];
[imgView release];
[newAnnotation addSubview:anView];
[anView release];
newAnnotation.canShowCallout=YES;
[newAnnotation setEnabled:YES];
return newAnnotation;
}
Hope this helps.
MKAnnotation
)MKAnnotationView
)Make sure you define the title, background image, and other elements of your custom annotation in the AnnotationView
class as properties.
Override the following method, and set the values of the properties you defined in AnnotationView
class.
- (MKAnnotationView*) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{
if ([<Object of CustomAnnotation class> isKindOfClass:[MKUserLocation class]])
return nil;
CustomAnnotation* custom_anno = (CustomAnnotation*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"custom_annotation"];
if (!custom_anno){
custom_anno = [[CustomAnnotation alloc] initWithAnnotation:annotation reuseIdentifier:@"custom_annotation"];
custom_anno.frame = CGRectMake(0, 0, 250, 57.5);
custom_anno.canShowCallout = NO;//CHange if you want to change callout behaviour (thats is it's abilty to apper). I set it top no because i did not want a callout.
UIImageView* icon = [[UIImageView alloc] initWithFrame:CGRectMake(5, 5, 40, 40)];
[icon setImageWithURL:<your image> placeholderImage:<your placeholder image>];//placeholder image = nil if you do not want one.
icon.backgroundColor = [UIColor lightGrayColor];
UILabel* name = [[UILabel alloc] initWithFrame:CGRectMake(50, 5, 200, 20)];
name.text = nameValue;
UILabel* category = [[UILabel alloc] initWithFrame:CGRectMake(50, 25, 200, 20)];
category.text = otherValue;
[custom_anno addSubview:icon];
[custom_anno addSubview:name];
[custom_anno addSubview:category];
}
return custom_anno;
}
My custom annotation class was 'Annotation' and custom annotation view class was 'CustomAnnotation'. Change according to your needs.
After this, just create an object of the Annotation
class, and use it.
EDIT :
Make sure you override the follwing method int he custom annotation view class:
in .h:
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier;
in .m:
- (id)initWithAnnotation:(id<MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self) {
}
return self;
}
EDIT 2 :
You may use it in your view controller like this :
MKMapView* cellMap = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 290, 100)];
cellMap.delegate = self;
cellMap.userInteractionEnabled = NO;
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(<your coordinates>);
MKCoordinateSpan span = MKCoordinateSpanMake(0.04, 0.04);
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
cellMap.showsUserLocation = NO;
[cellMap setRegion:region animated:YES];
Annotation* anon = [[Annotation alloc] init];
anon.coordinate = center;
[cellMap addAnnotation:anon];
[checkIn addSubview:cellMap];