更新注释视图时如何在自定义注释引脚中制作动画
Posted
技术标签:
【中文标题】更新注释视图时如何在自定义注释引脚中制作动画【英文标题】:How to do animation in custom annotation pin when update annotation view 【发布时间】:2016-03-20 19:07:13 【问题描述】:我想做动画,比如“当滚动collection view cell
时注释针在滚动结束时向上/向下。但是如何做动画,比如注释针在开始滚动时向上/在滚动结束时注释针向下collection view
//code --> For Scrolling
func scrollViewDidEndDecelerating(scrollView: UIScrollView)
if scrollView == collectionView
NSLog("page collection %d",Int(scrollView.contentOffset.x/scrollView.frame.size.width))
self.UpdateMapAnotationPin(Int(scrollView.contentOffset.x/scrollView.frame.size.width))
// -->When Update Pin
func UpdateMapAnotationPin(vIndex : Int)
if self.mapAnnotations.count != 0
let info = self.mapAnnotations[vIndex]
let aView = map.viewForAnnotation(info)
info.imageName = "ic_map_pin1"
info.tagPin = vIndex
aView?.image = UIImage(named: info.imageName)
if aView != nil
self.animationWithView(aView!)
// --> For animation
func animationWithView(mkView : MKAnnotationView)
let point:MKMapPoint = MKMapPointForCoordinate(mkView.annotation!.coordinate);
let endFrame:CGRect = mkView.frame;
mkView.frame = CGRectMake(mkView.frame.origin.x, mkView.frame.origin.y - 20, mkView.frame.size.width, mkView.frame.size.height);
let delay = 0.03
UIView.animateWithDuration(0.5, delay: delay, options: UIViewAnimationOptions.CurveLinear, animations:() in
mkView.frame = endFrame
, completion:(Bool) in
UIView.animateWithDuration(0.05, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations:() in
mkView.transform = CGAffineTransformMakeScale(1.0, 1.0) , completion: (Bool) in
UIView.animateWithDuration(0.3, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations:() in
mkView.transform = CGAffineTransformIdentity
, completion: nil)
)
)
【问题讨论】:
旁注,UpdateMapAnotationPin
缺少结尾
意味着您需要刷新地图,并且在滚动图钉时隐藏所有图钉并在完成滚动图钉显示后。我说的对吗?
不,不是任何时候都不会隐藏引脚
【参考方案1】:
我认为您希望像 AirBnb 应用注释那样制作动画。 您必须通过调用它的 viewforAnimation 方法来选择图钉
步骤 1.通过像这样分配自定义ID来使用注释
class GridAnnotation: NSObject ,MKAnnotation
var title: String?
var coordinate: CLLocationCoordinate2D
var info: String
var index: String
init(title: String, coordinate: CLLocationCoordinate2D, info: String,index: String)
self.title = title
self.coordinate = coordinate
self.info = info
self.index = index
override func viewDidLoad()
super.viewDidLoad()
let annotationStart = GridAnnotationStart(title: "", coordinate: firstLocation.coordinate, info: "\(zoneCreateModal.id)",index: "\(0)")
self.mapVw.addAnnotation(annotationSta
rt)
2.获取所有注解
let arrAllAnnotations = self.mapVw.annotations.filter $0 !== self.mapVw.userLocation
for someAnnotation in annotationsToRemove
let strId = "Your current id"
if someAnnotation.isKind(of: AnnotationModal.self)
let annotaion = someAnnotation as! AnnotationModal
if annotaion.info == strId
//Call view for animation
self.mapVw.selectAnnotation(someAnnotation, animated: true)
self.mapVw.view(for: someAnnotation)
5.在viewForAnnotation中设置新选中注解的类型
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
if (annotation.isKind(of: MKUserLocation.self))
return nil
if annotation.isKind(of: GridAnnotationZoomModal.self)
let anView = MKAnnotationView(annotation: annotation, reuseIdentifier: "landingPoints")
let annotationInfo = annotation as! GridAnnotationZoomModal
imgView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
if anView.isSelected == true
imgView.image = UIImage(named: "Your selected image name")
else
imgView.image = UIImage(named: "Your image not selected name")
anView.isDraggable = false
anView.isEnabled = true
anView.isUserInteractionEnabled = true
anView.tag = Int(annotationInfo.index)!
anView.addSubview(imgView)
anView.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
anView.centerOffset = CGPoint(x: 0,y: -15)
return anView
return nil
【讨论】:
以上是关于更新注释视图时如何在自定义注释引脚中制作动画的主要内容,如果未能解决你的问题,请参考以下文章
Swift - MKAnnotationView 地图引脚的自定义 UIView