已编辑:地图套件注释标注.调整 UIPopoverController 的大小



抱歉,我读了一堆教程,如何为MapKit注释创建自定义标注。它适用于 NSLog,但我无法在标注中显示信息。

我在地图上有两种类型的图标。这是我的观点注释方法:

-(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;
}

然后我有一个标注附件控件点击方法

- (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 = @"textntextntext";
    [self.view addSubview:txtCallout];
}

但是如何从注释方法插入文本呢?此外,文本必须根据图标类型而有所不同,例如@"PORT,PORT"或@"FIX,FIX"。我该怎么做?

编辑:

我已经设法显示带有必要信息的标注。我的最后一个问题是,有时我的标注是 3 行,有时 - 多达 15 行。如何使标注自动调整为字符串中的行数?我应该在UIViewController中修改我的popoverContentSize还是我的标签大小?

非常感谢!

我已经想出了如何将 MK 注释标注调整为 UILabel。

实现标注附件控件点击方法

- (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:nYOURTEXTn"];
    // 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)];
}

问候

相关内容

  • 没有找到相关文章

最新更新