如何使用autolayout在MKAnnotation中显示多行?

时间:2016-10-24 09:19:07

标签: ios objective-c swift autolayout mapkit

enter image description here

我正在使用mapkit如何在 MKAnnotation视图中添加多行

每个注释都有标题和副标题。  我如何借助自动布局显示多行的子标题?

我发现它是答案.plz尝试我的答案。我们只需要在

中执行代码
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{   

}

这里我展示了如何将自动布局与MKAnnotation一起使用。

6 个答案:

答案 0 :(得分:7)

添加多行的扩展名:

import MapKit // must import MapKit for MKAnnotationView to get recognized

extension MKAnnotationView {

    func loadCustomLines(customLines: [String]) {
        let stackView = self.stackView()
        for line in customLines {
            let label = UILabel()
            label.text = line
            stackView.addArrangedSubview(label)
        }
        self.detailCalloutAccessoryView = stackView
    }



    private func stackView() -> UIStackView {
        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.distribution = .fillEqually
        stackView.alignment = .fill
        return stackView
    }
}

使用:

view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
view.canShowCallout = true
view.loadCustomLines(customLines: ["qqqq", "wwww", "eee"])

答案 1 :(得分:6)

我们可以在自动布局

的帮助下在MKAnnotation视图中显示多行

非常简单。

目标c

中的

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

        if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;
        if ([annotation isKindOfClass:[CustomAnnotation class]]) {
            CustomAnnotation *customAnnotation = (CustomAnnotation *) annotation;

            MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomAnnotation"];

            if (annotationView == nil)
                annotationView = customAnnotation.annotationView;
            else
                annotationView.annotation = annotation;

            //Adding multiline subtitle code 

            UILabel *subTitlelbl = [[UILabel alloc]init];
            subTitlelbl.text = @"sri ganganagar this is my home twon.sri ganganagar this is my home twon.sri ganganagar this is my home twon.  ";

            annotationView.detailCalloutAccessoryView = subTitlelbl;

            NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:subTitlelbl attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationLessThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:150];

             NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:subTitlelbl attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationGreaterThanOrEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1 constant:0];
            [subTitlelbl setNumberOfLines:0];
            [subTitlelbl addConstraint:width];
            [subTitlelbl addConstraint:height];




            return annotationView;
        } else
            return nil;
    }

输出

enter image description here

对于Swift

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {

        let identifier = "MyPin"

        if annotation.isKindOfClass(MKUserLocation) {
            return nil
        }

        var annotationView: MKPinAnnotationView? = mapView.dequeueReusableAnnotationViewWithIdentifier(identifier) as? MKPinAnnotationView

        if annotationView == nil {

            annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: identifier)
            annotationView?.canShowCallout = true

              let label1 = UILabel(frame: CGRectMake(0, 0, 200, 21))
            label1.text = "Some text1 some text2 some text2 some text2 some text2 some text2 some text2"
             label1.numberOfLines = 0
              annotationView!.detailCalloutAccessoryView = label1;

            let width = NSLayoutConstraint(item: label1, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.LessThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 200)
            label1.addConstraint(width)


            let height = NSLayoutConstraint(item: label1, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 90)
            label1.addConstraint(height)



        } else {
            annotationView!.annotation = annotation
        }
        return annotationView
    }


}

enter image description here

这里我使用 NSLayoutConstraint

我以编程方式创建了一个标签。在其上添加约束,然后在MKAnnotationView的detailCalloutAccessoryView中添加标签。

答案 2 :(得分:1)

使用自动布局,您可以键入以下内容:

let subtitleLabel = UILabel()
subtitleLabel.text = "Location updated\n" + dateFormatter.string(from: date)
subtitleLabel.numberOfLines = 0
subtitleLabel.font = UIFont.systemFont(ofSize: 14)
subtitleLabel.textColor = .lightGray
subtitleLabel.setContentCompressionResistancePriority(.required, for: .vertical)

annotationView?.detailCalloutAccessoryView = subtitleLabel

答案 3 :(得分:0)

如果你想点击多标签去某个地方,你需要: 1-在AnnotationView上创建以编程方式创建的UITapGestureRecognizer。 2-创建传递给手势选择器的函数。该函数采用UIGestureRecognizer类型的sender参数。有一个if语句,确保你将canshowcallout设置为true,这样你只需在它显示时单击以避免点击实际的pin本身。

所以在我的情况下,我有这个场景。这可能有助于某人: - 填充了不同位置单元格的tableView - 屏幕的上半部分是显示每个位置的图钉的地图 - 当您单击表格视图或地图中的图钉时,地图中心本身会显示图钉标注视图,这是一个带有图片的小视图,如果名称为多行,则会显示多行中的位置名称位置很长,以避免截断尾巴。 - 因为索引已经传递并在我们的代码中的任何地方使用以确定单击了哪个位置,所以我还必须使用它来在单击的位置的标注中显示正确的名称。 我遇到的问题是点击标签,因为我使用了annotationView.detailCalloutAccessoryView = myLabel。好像什么时候。你使用详细信息而不是右边或左边,即使从controlTapped地图委托功能中也没有获得点击。所以我必须在我之前谈到的手势选择器功能中执行以下操作: 确保你正在做一些守卫或者在这些检查中一起使用逗号。 - 通过let let = sender.view.tag检查视图标记 - 获取视图为MKPinAnnotationView:让view = sender.view为? MKPointAnnotationView - 检查标注以确保首先显示:view.canShowCallout - 然后在if或guard的花括号中你让index = tag并将索引传递给我的函数,该函数在视图上执行动作,在点击annotationView后转换到原生苹果地图。

  • 在注释之后的所有内容中,在我将此函数传递给手势识别器选择器之前所说的View委托函数

答案 4 :(得分:0)

5个步骤

我创建了一个标签,并将其添加到annotationView?.detailCalloutAccessoryView属性中(步骤5)。我还将标签的文本设置为annotation.subtitle文本(第2步和第4步)和.numberOfLines = 0

步骤在代码上方的注释中

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {

    if annotation.isKindOfClass(MKUserLocation) {
        return nil
    }

    let reuseIdentifier = "reuseIdentifier"

    var annotationView = mapView.mapView.dequeueReusableAnnotationView(withIdentifier: reuseIdentifier) as? MKPinAnnotationView

    if annotationView == nil {

        annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseIdentifier)

        // 1. set the annotationView's canShowCallout property to true
        annotationView?.canShowCallout = true

        // 2. get the subtitle text from the annontation's subtitle property
        let subtitleText = annotation.subtitle ?? "you have no subtitle"

        // 3. create a label for the subtitle text
        let subtitleLabel = UILabel()
        subtitleLabel.translatesAutoresizingMaskIntoConstraints = false

        // 4. set the subtitle's text to the label's text property and number of lines to 0
        subtitleLabel.text = subtitleText
        subtitleLabel.numberOfLines = 0

        // 5. set the annotation's detailCalloutAccessoryView property to the subtitleLabel
        annotationView?.detailCalloutAccessoryView = subtitleLabel

    } else {
        annotationView!.annotation = annotation
    }

    return annotationView
}

答案 5 :(得分:0)

<link rel="stylesheet" href="<?php url('/assets/css/main.css') ?>">