Swift.Сделайте аннотацию вида карты плавным переходом к новому аннотации View - PullRequest
0 голосов
/ 30 января 2019

У меня есть mapView с движущейся аннотацией.Скажем, на нем изображен автомобиль, движущийся по дороге.Пользователь может изменить свой транспортный режим с автомобиля на мотоцикл.Я не могу получить аннотацию для плавного перехода от изображения автомобиля (типа CarAnnotation) к аннотации велосипеда (BikeAnnotation).Я пробовал различные способы создания цепочек анимации в методе didUpdateLocations, но обычно происходит следующее: старая (автомобильная) аннотация быстро исчезает, а новая (велосипедная) аннотация появляется через несколько секунд и, кажется, анимируется из небольшого случайного смещениянаправление (не из позиции, из которой была удалена старая удаленная аннотация).Как я могу изящно анимировать?

    /// Main locmanager delegate method. sent when USER moves according to vars in loc man setup ie .best & 10m
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    // -----------------------
    // Checks and setup

    // check user
    guard let uid = uid else { return }

    // check location not nil
    guard let userLocation = locations.last else { return }

    // check accuracy. if first run (userLoc=nil) let code continue
    let accuracy = userLocation.horizontalAccuracy
    if self.userLocation != nil && (accuracy < 0 || accuracy > reqAccuracy) {
        return // wait for next didUpdateLoc call
    }

    // set userlocation prop
    self.userLocation = userLocation

    //TODO: should allow user to scroll map to look at different area, with button & timer to return
    // should have button to allow to return to current location or automatically return
    // switch to indicate user is zooming, panning needed. should only set region if the user has not panned away

    // set map region
    let span = MKCoordinateSpanMake(0.01, 0.01)
    let region = MKCoordinateRegionMake(userLocation.coordinate, span)
    mapView.setRegion(region, animated: true)


    // -----------------------
    // Create annotations

    // check mode
    guard let mode = self.transportMode else { return } // ider transport mode

    // create new or reused ann
    let ann = Annotation.createOrUpdateAnnotation(uid: uid, user: .ider(mode: mode), userLocation: userLocation, prevAnn: annotations[uid])

    // set status (for tint). also done in idReq status var observer
    if let annStatusString = self.idRequest?.latestStatus?.desc() {
        let annStatus = _IDRequestStatus.init(rawValue: annStatusString)
        ann.requestStatus = annStatus
    }

    // check if ann type (transport mode proxy) has changed from prev ann
    if let prevAnn = annotations[uid], !ann.isEqual(prevAnn) {
        // add new ann to map

        // animate removal of prev ann view
        let prevAnnView = mapView.view(for: prevAnn)
        UIView.animate(withDuration: 0.4, animations: {
            prevAnnView?.alpha = 0
            self.mapView.addAnnotation(ann)
        }) { (finished) in
            self.mapView.removeAnnotation(prevAnn)
            prevAnnView?.alpha = 1.0 //reset alpha for view reuse
        }
    } else {
        // same ann type (transport mode proxy)

        // add to map
        mapView.addAnnotation(ann)

        // animate to new location
        UIView.animate(withDuration: 0.4) {
            ann.annLocation = userLocation  // update the cllocation of the userAnn to trigger movement
        }
    }

    // -----------------------
    // save ann

    // save to dic
    self.annotations[uid] = ann

    // save to database
    saveIderLocationToGeoFirestore()

} // didUpdateLocation
...