更新注释视图时如何在自定义注释引脚中制作动画

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

添加自定义注释引脚

带有默认地图视图引脚的 Swift Mapview 自定义调出视图

尝试自定义注释引脚