2016-09-13 13 views
4

내 앱에는 다음과 같은 봉합사가 있습니다.detailCalloutAccessoryView를 사용하여 설명 선 거품의 기본 배경색을 변경하는 방법

내부에 두 개의 레이블이있는 사용자 정의 detailCalloutAccessoryView가있는 사용자 정의 콜 아웃 풍선을 구현했습니다.

이 줄을 사용하여 detailCalloutAccessoryView의 색상을 변경하는 방법을 알고 있습니다.

view.detailCalloutAccessoryView?.backgroundColor = UIColor.red 

하지만 주요 거품의 배경 색상을 변경하는 방법을 알아낼 수 없습니다 (지금은 흰색/회색 투명).

enter image description here

을하지만 내 사용자 정의 거품은 다음과 같이 할 : view.detailCalloutAccessoryView?.backgroundColor = UIColor.red 라인으로 내 calloutbubble은 다음과 같습니다 여기

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 (스위프트 3)에서 작업 중입니다.

글꼴 유형과 기본 검정색을 검정색에서 다른 색상으로 변경하는 방법을 아는 것도 재미있을 것입니다. 자세히보기에서 xib 파일에서 내 사용자 지정 레이블의 색을 쉽게 변경할 수 있지만 기본 제목 속성에 액세스하는 방법을 알지 못합니다.

답변

1

나는 코드를 생성 한 사용자의 요구 사항은 코드를 다운로드하고 검토하기위한 URL을 찾으십시오.

링크 : https://www.dropbox.com/s/o2howwqceq8rsgu/MapInformation.zip?dl=0

환경 : 엑스 코드 8 Swift3

강조 내가했던 코드.

나는 콜 아웃 대신 팝업 (UIPresentationController)을 표시하는 방법을 택했습니다. 자세한 내용은 아래 코드를 참조하십시오.

가) 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

UIViewCallout은 개인 클래스입니다. 사용자 정의 콜 아웃 뷰를 원하는 경우 :

  1. 해제의 standart은 선 view.canShowCallout = false

  2. 선에 대한 사용자 정의 UIViewMKMapViewDelegate 메소드를 구현 : 대한

    func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) { 
        let redCalloutView = RedCalloutView(view.annotation) 
        view.addSubview(redCalloutView) 
    } 
    
    func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) { 
        view.subviews.forEach { 
         if $0 is RedCalloutView { 
          $0.removeFromSuperview() 
         } 
        } 
    }