2014-12-13 4 views
0

Извините, я прочитал кучу учебников о том, как создать пользовательский выносок для аннотации MapKit. Он работает с NSLog, но я не могу отобразить информацию в выносках.EDITED: MapKit Обозначения аннотации. Отрегулируйте размер UIPopoverController

У меня есть два типа значков на карте. Это мой метод viewForAnnotation:

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

    if (! [annotation isKindOfClass:[IGAMapAnnotation class]]) { 
     return nil; 
    } 

    IGAMapAnnotation *myLocation = (IGAMapAnnotation *) annotation; 

    self.typeIsFix = [myLocation.navaidType isEqualToString:@"FIX"]; 
    self.typeIsPort = [myLocation.navaidType isEqualToString:@"PORT"]; 

    int planeImageViewTag = 42; 

    NSString *reuseId; 

    if (self.typeIsPort) 
     reuseId = @"IGAMapAnnotationPort"; 

    else if (self.typeIsFix) 
     reuseId = @"IGAMapAnnotationFix"; 

    else 
     reuseId = @"IGAMapAnnotationOther"; 


    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; 

    if (annotationView == nil) 
    { 
     annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId]; 
     annotationView.enabled = YES; 

     UIButton *annotationInfo = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
     annotationView.rightCalloutAccessoryView = annotationInfo; 
     annotationView.canShowCallout = YES; 


     if (self.typeIsPort) 
     { 
      annotationView.image = [UIImage imageNamed:@"mapPORT.png"]; 
      annotationView.centerOffset = CGPointMake(0, 0); 

     } 

     else if (self.typeIsFix) 
     { 
      annotationView.image = [UIImage imageNamed:@"mapFIX.png"]; 
      annotationView.centerOffset = CGPointMake(0, 0); 

     } 

     else 
      return nil; 
    } 

    else 
    { 
     annotationView.annotation = annotation; 
    } 

    return annotationView; 
} 

Тогда у меня есть метод calloutAccessoryControlTapped

- (void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    IGAAnnotationInfoViewController *popOverCallout = [[IGAAnnotationInfoViewController alloc]init]; 

    UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:popOverCallout]; 

    popOver.popoverContentSize = CGSizeMake(300, 200); 

    [popOver presentPopoverFromRect:view.bounds 
          inView:view 
      permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 
} 

Я также создал UIViewController, который я назначенную UIPopoverController.

Теперь, когда я нажимаю кнопку на моей аннотации, я вижу пробел для текста. Отлично. Если я назначу текст на этикетке в UIViewController, он также прекрасно работает (следующий мой UIViewController.m):

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    txtCallout = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 300, 200) ]; 
    txtCallout.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:(14.0)]; 
    txtCallout.numberOfLines = 0; 
    txtCallout.clipsToBounds = YES; 
    txtCallout.backgroundColor = [UIColor clearColor]; 
    txtCallout.textColor = [UIColor blackColor]; 
    txtCallout.textAlignment = NSTextAlignmentLeft; 
    txtCallout.text = @"text\ntext\ntext"; 
    [self.view addSubview:txtCallout]; 
} 

Но как вставить текст из моего метода аннотаций? Также текст должен отличаться в зависимости от типа значка, например @ «PORT, PORT» или «FIX, FIX». Как мне это сделать?

EDIT:

мне удалось отобразить выноски с необходимой информацией передается. Моя последняя проблема заключается в том, что иногда моя выноска - 3 строки, иногда - целых 15. Как можно настроить выноску автоматически на количество строк в моей строке? Должен ли я изменить свой popoverContentSize или мой размер метки в UIViewController?

Большое вам спасибо!

ответ

0

Я выяснил, как настроить выноску Аннотации MK на UILabel.

Реализуйте метод calloutAccessoryControlTapped

- (void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 
{ 
    // OPTIONAL: Deselecting Annotation View when Callout is tapped 
    //[mapview deselectAnnotation:view.annotation animated:YES]; 

    NSString *calloutDetails; 

    IGAMapAnnotation *annotationTapped = (IGAMapAnnotation *)view.annotation; 

    calloutDetails = [NSString stringWithFormat:@"YOUR TEXT:\nYOURTEXT\n"]; 

    // Declare and initialize the UIViewController that has the label to contain the callout information 
    IGAAnnotationInfoViewController *detailViewController = [[IGAAnnotationInfoViewController alloc]initWithText:calloutDetails]; 

    UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:detailViewController]; 

    // Size of the UIPopoverController = size of the label + 40 pts 
    popOver.popoverContentSize = CGSizeMake(detailViewController.txtCallout.frame.size.width+40,detailViewController.txtCallout.frame.size.height+40); 

    // Show popover controller 
    [popOver presentPopoverFromRect:view.bounds 
          inView:view 
      permittedArrowDirections:UIPopoverArrowDirectionAny 
          animated:YES]; 
} 

Теперь IGAAnnotationInfoViewController.h

@interface IGAAnnotationInfoViewController : UIViewController { 
    CGRect calloutSize; 
} 

@property (strong,nonatomic) NSString *calloutInformation; 
@property (strong,nonatomic) IGACalloutLabel *txtCallout; 

-(IGAAnnotationInfoViewController*) initWithText : (NSString*) calloutText; 

IGAAnnotationInfoViewController.m

@implementation IGAAnnotationInfoViewController 

@synthesize calloutInformation,txtCallout; 

-(IGAAnnotationInfoViewController*) initWithText : (NSString*) calloutText { 
    self = [super init]; 

    if (self) { 
     calloutInformation = calloutText; 

     // Creating a label that will display the callout information (passed from IGAAcarasViewController - Map Annotation) 
     txtCallout = [[IGACalloutLabel alloc] initWithFrame:CGRectMake(20, 20, 0, 0)]; 

     txtCallout.lineBreakMode = NSLineBreakByWordWrapping; 
     txtCallout.numberOfLines=0; 
     txtCallout.backgroundColor = [UIColor clearColor]; 
     txtCallout.textColor=[UIColor blueColor]; 
     txtCallout.text = calloutInformation; 
     [txtCallout drawTextInRect:CGRectMake(10,10,0,0)]; 

     [txtCallout sizeToFit]; 
     [self.view addSubview:txtCallout]; 
    } 

    return self; 
} 

Наконец, подкласс класса UILabel:

implementation IGACalloutLabel 

@synthesize topInset, leftInset, bottomInset, rightInset; 

- (void)drawTextInRect:(CGRect)rect 
{ 
    UIEdgeInsets insets = {topInset,leftInset,bottomInset,rightInset}; 

    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
} 

С уважением,

Смежные вопросы