У меня есть 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