如何使用detailCalloutAccessoryView更改标注气泡的默认背景颜色

时间:2016-09-13 10:30:52

标签: swift mkmapview mkannotation swift3 mkannotationview

在我的应用程序中,我有以下的消息。

我已经使用自定义detailCalloutAccessoryView实现了一个自定义标注气泡,里面有两个标签。

我知道如何使用此行更改detailCalloutAccessoryView的颜色。

view.detailCalloutAccessoryView?.backgroundColor = UIColor.red

但是我无法弄清楚如何改变主气泡的背景颜色(现在它是透明的灰色/白色)。使用view.detailCalloutAccessoryView?.backgroundColor = UIColor.red行,我的calloutbubble看起来像这样:

enter image description here

但我希望我的自定义气泡看起来像这样:

enter image description here

这是我的viewFor注释方法:

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

        if annotation is MKUserLocation {
            return nil
        }

        let identifier = "pin"
        var view : MKAnnotationView

        if let dequedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) {
            dequedView.annotation = annotation

            view = dequedView

        } else {
            view = MKAnnotationView(annotation: annotation, reuseIdentifier: identifier)

            view.canShowCallout = true

        }

             let pinImage = UIImage.init(named: "customPin")


        DispatchQueue.main.async(execute: {

            view.detailCalloutAccessoryView?.backgroundColor = UIColor.red

        })

        view.image = pinImage

        configureDetailView(annotationView: view)
        return view
    }

我在Xcode 8 w / Swift 3中工作。

知道如何将标题的字体类型和默认黑色从黑色更改为另一种颜色也很有趣。 在详细视图中,我可以轻松更改xib文件中自定义标签的颜色,但不知道如何访问默认标题属性。

4 个答案:

答案 0 :(得分:2)

CONVERT是一个私人课程。如果您想要自定义标注视图:

  1. 停用标准标注UIViewCallout

  2. 使用您的自定义view.canShowCallout = false实施MKMapViewDelegate方法进行标注:

    UIView

答案 1 :(得分:1)

我已根据您的要求创建了代码,请找到以下网址下载代码并进行审核。

链接:https://www.dropbox.com/s/o2howwqceq8rsgu/MapInformation.zip?dl=0

  

环境:Xcode 8和Swift3

突出显示我已完成的代码。

我采用的方法是显示Popup(UIPresentationController)而不是callout。有关详细信息,请参阅以下代码。

A)我曾使用UIButton在MapView上显示注释,并在用户点击时显示弹出窗口。

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

        if annotation is MKUserLocation {
            return nil
        }

        let identifier = "pin"
        var annotationView = self.mapView.dequeueReusableAnnotationView(withIdentifier: identifier) as! AnnotationView?

        if annotationView == nil {

            annotationView = AnnotationView(annotation: annotation, reuseIdentifier: identifier)
            annotationView?.canShowCallout = false
        }

        else {
            annotationView?.annotation = annotation
        }

        //Take the UIButton and implement the touchupinside action for showing the popup.
        let pinImage = UIImage.init(named: "customPin")
        annotationView?.frame = CGRect(x: 0, y: 0, width: (pinImage?.size.width)!, height: (pinImage?.size.width)!)
        annotationView?.mapPin = UIButton(frame: (annotationView?.frame)!);
        annotationView?.mapPin.addTarget(self, action: #selector(ViewController.showPopup(sender:)), for: .touchUpInside)

        annotationView?.addSubview((annotationView?.mapPin)!)
        annotationView?.mapPin.setImage(pinImage, for: .normal)

        return annotationView
    }

B)当用户点击注释时显示弹出窗口。

func showPopup(sender: UIButton!) {

        let popupVC = self.storyboard?.instantiateViewController(withIdentifier: "Popup") as? Popup
        popupVC?.preferredContentSize = CGSize(width: 250, height: 150)
        popupVC?.modalPresentationStyle = UIModalPresentationStyle.popover

        let rect = sender.superview?.convert(sender.frame, to: self.view)
        popupVC?.popoverPresentationController?.delegate = self;
        popupVC?.popoverPresentationController?.sourceView = self.view
        popupVC?.popoverPresentationController?.sourceRect = rect!
        popupVC?.popoverPresentationController?.backgroundColor = UIColor.red

        self.present(popupVC!, animated: true, completion: nil)
    }

<强> 注意

  

如果要将弹出颜色从红色更改为其他不同的颜色   然后你可以通过改变颜色名称来进行单行编码。

     

popupVC?.popoverPresentationController?。backgroundColor = UIColor.red

请查看以下屏幕截图。

enter image description here

答案 2 :(得分:1)

   func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
        
        //design your custom view and set it to detailCalloutAccessoryView

        view.detailCalloutAccessoryView = yourDetailView
        detail.superview?.superview?.backgroundColor = yourColor
        // This view is type of MKSmallCalloutView
    }

答案 3 :(得分:0)

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    for v in view.subviews{
        if v.subviews.count > 0{
            v.subviews[0].backgroundColor = UIColor.red
        }
    }
}

change bubble and label both color

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    for v in view.subviews{
        if v.subviews.count > 0 {
            let colloutView = v.subviews[0]
            colloutView.backgroundColor = UIColor(red: 0.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 0.8)
            if colloutView.subviews.count > 0 {
                if colloutView.subviews[0].subviews.count > 0{
                    colloutView.subviews[0].subviews.forEach { (view) in
                        if let label = view as? UILabel{
                            label.textColor = UIColor.white
                        }
                    }
                }
            }
        }
    }
}