Граница (не В) пользовательской аннотации быстро при нажатии

Когда был выбран пользовательский вид моей аннотации (Pin) в MapView, мне нужна белая рамка ВНЕ моей аннотации.

(влево - нажал, вправо - не нажал

Также мне нужно в тени при нажатии. Но как я мог это сделать? (когда я снимаю выделение, аннотации должны оставаться в правильном стиле). Если я сделаю это с:

var newFrame: CGRect = view.frame; newFrame = newFrame.insetBy (dx: -borderWidth, dy: -borderWidth); view.frame = newFrame; в методе mapView (_ mapView: MKMapView, didSelect view: MKAnnotationView) и установите границу - мое изображение тоже увеличится, но это неправильно.

// My custom annotation
class CustomPointAnnotation: NSObject, MKAnnotation {
    var coordinate: CLLocationCoordinate2D
    var restoInfo: Restaurant?

    init(resto: Restaurant) {
        self.coordinate = resto.coordinate!
        self.restoInfo = resto
    }
}

// And func adding custom annotation on MapView
var restorationPin: CustomPointAnnotation!
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
    let cpa = annotation as? CustomPointAnnotation
    if cpa?.restoInfo == nil {
        return nil
    }

    let annotationView = MKAnnotationView(annotation: restorationPin, reuseIdentifier: "id")

    let icon = cpa?.restoInfo?.encodeBase64toImage(base64: (cpa?.restoInfo?.logoMap)!)

    annotationView.image = icon
    annotationView.layer.masksToBounds = true
    annotationView.contentMode = .scaleAspectFill
    annotationView.frame.size = CGSize(width: 45, height: 45)
    annotationView.layer.cornerRadius = 22.5
    return annotationView
}

person Владислав Фораф&    schedule 09.01.2018    source источник
comment
Вы изучали методы mapView didSelect и didDeselect MKAnnotationView из MKMapViewDelegate?   -  person Miket25    schedule 09.01.2018
comment
Сейчас там пусто. Я понятия не имею, как это сделать :(   -  person Владислав Фораф&    schedule 09.01.2018


Ответы (1)


Если вы реализуете следующие два метода для определения, когда аннотация выбрана / отменена, вы можете нарисовать / удалить белый кружок как UIView под аннотацией. Сначала в вашем контроллере представления установите делегата mapView.

self.mapView.delegate = self

Ниже приведены два метода обнаружения щелчка по аннотации.

func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    /*Make a white circle*/
    let whiteBackground = UIView(frame: CGRect(x: -27, y: -55, width: 80, height: 80))
    whiteBackground.backgroundColor = UIColor.white
    whiteBackground.layer.cornerRadius = 40

    /*Set circle's tag to 1*/
    whiteBackground.tag = 1
    /*Add the circle beneath the annotation*/
    view.insertSubview(whiteBackground, at: 0)
}

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) {
    /*Removing the white circle*/
    view.viewWithTag(1)?.removeFromSuperview()
}

Объяснение. При щелчке по аннотации вызывается метод didSelect, и белый кружок создается из UIView. Этот вид белого круга имеет тег 1 для удобства, когда его нужно удалить. Затем это представление будет вставлено как подпредставление, имеющее представление аннотации в качестве супервизора с нулевым индексом, чтобы оно отображалось за аннотацией. Метод didDeselect удаляет круг, ссылаясь на тег.

Лично вам лучше просто вставить белый кружок как UIImageView вместо того, чтобы делать круг из UIView, поскольку это менее хакерского.

Демо

Аннотация карты с белым кружком

person Miket25    schedule 09.01.2018