2016-10-18 2 views
0

Я пытаюсь настроить пользовательский вид выноски с созданным мной xib, но он не отображается.Пользовательский вид выноски с xib

Мой XIB LocationInfo выглядит следующим образом enter image description here

Я создал пользовательский класс UIView для представления в моем XIb, чтобы установить фоновое изображение (не уверен, если это работает, так как я не смог показать XIB)

import Foundation 
import UIKit 
import MapKit 

class AddressView: MKPinAnnotationView{ 
    override func draw(_ rect: CGRect) { 
     super.draw(rect); 

     UIGraphicsBeginImageContext(self.frame.size) 
     UIImage(named: "Location.Info-background")?.draw(in: self.bounds) 
     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     self.backgroundColor = UIColor(patternImage: image!) 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     //todo 
    } 

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
     //todo 
     return nil 
    } 
} 

Мой пользовательский класс annotationpin следующим

import Foundation 
import MapKit 
import UIKit 

class MapPin: MKPointAnnotation{ 
    var name: String 
    var street: String 
    var type: String 
    var postCode: String 

    init(name: String, street: String, type: String, postCode: String){ 
     self.name = name 
     self.street = street 
     self.type = type 
     self.postCode = postCode 
    } 
} 

и я пытаюсь т o используйте это все, как показано на мой взгляд. Класс контроллера

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     CLGeocoder().reverseGeocodeLocation(manager.location!) { (placemarks, error) in 
      if (error != nil){ 
       return 
      } 
      if placemarks?.count != nil{ 
       let pm = (placemarks?[0])! as CLPlacemark 
       self.displayLocationInfo(placemark: pm) 
      } 
     } 

     let spanX = 0.00725 
     let spanY = 0.00725 
     locationManager.stopUpdatingLocation() 
     let location = locations.last! as CLLocation 
     let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) 
     let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: spanX, longitudeDelta: spanY)) 
     self.MapRSR.setRegion(region, animated: true) 
     self.MapRSR.delegate = self 

     let mapPin = MapPin(name: "", street: "", type: "", postCode: "") 
     mapPin.coordinate = center 
     mapPin.title = "test" 

     self.MapRSR.addAnnotation(mapPin) 
    } 


    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
     let pin = mapView.dequeueReusableAnnotationView(withIdentifier: "LocationInfo") ?? AddressView(annotation: annotation, reuseIdentifier: "LocationInfo") 
     pin.canShowCallout = true 
     return pin 
    } 

Он просто не покажет мой xib-обзор. Кто-нибудь знает, что я делаю неправильно, или как я могу добиться эффекта, который я хочу, что-то вроде этого. enter image description here

ответ

2

В didSelectAnnotationView загрузите xib из комплекта и добавьте подзаголовок в аннотацию. здесь CustomXibCallout является xib-файлом и CustomCalloutView является MKAnnotationView.

func mapView(mapView: MKMapView, didSelectAnnotationView view: MKAnnotationView) { 
    if view.annotation!.isKindOfClass(MKUserLocation){ 
     return 
    } 

    //Custom xib 
    let customView = (NSBundle.mainBundle().loadNibNamed("CustomXibCallout", owner: self, options: nil))[0] as! CustomCalloutView; 

    let calloutViewFrame = customView.frame; 

    customView.frame = CGRect(x: -calloutViewFrame.size.width/2.23, y: -calloutViewFrame.size.height-7, width: 315, height: 200) 

    view.addSubview(customView) 
} 

в didDeselectAnnotationView удалить добавленный вид

func mapView(mapView: MKMapView, didDeselectAnnotationView view: MKAnnotationView) 
{ 
    for childView:AnyObject in view.subviews{ 
     childView.removeFromSuperview(); 
    } 
} 

Example for CustomCallout

+0

эта часть 'пусть calloutViewFrame = customView.frame; customView.frame = CGRect (x: -calloutViewFrame.size.width/2.23, y: -calloutViewFrame.size.height-7, width: 315, height: 200) 'гарантирует, что представление не отображается. Когда я выберу это, это покажет, но не похоже, что это должно быть очевидно – NoSixties

+0

@NoSixties, это просто для установки нашего пользовательского размера аннотационного представления, в моем случае я использовал размеры этого фрейма для своих требований. В вашем случае установите свой размер независимо от того, что вы хотеть. – Jeyamahesan

+0

Я знаю, что я попытался установить его, но он, похоже, не работает для меня. – NoSixties

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