Я хочу потрясти маркер google map в iOS Swift


Я работаю над проектом, в котором хочу потрясти маркер на карте google. Я использую пользовательский значок маркера для представления на карте. Как будто голова человека трясется. Я не знаю, как это сделать, и много искал, но не нашел никакого решения.

2 2

2 ответа:

Вы можете добавить CAKeyframeAnimation или CABasicAnimation к вашему marker.iconView!.layer мы добавляем UIView с кадром больше, чем наш UIImageView внутри, тогда нам нужно настроить точку привязки вашего UIImageView снизу по вертикали и горизонтали по центру это будет точка, которая будет работать как ось в нашей анимации, наша анимация будет анимацией вращения в плоскости Z от -30 до 30 градусов для достижения желаемой анимации.Это самый простой способ сделать это, но вы также можете определить пользовательский класс и сделать много других вещи

    let marker = GMSMarker(position: CLLocationCoordinate2D(latitude: 22.404963, longitude: -79.961755))

    //we need a bigger UIView to avoid the clip problem with the UIImageView
    marker.iconView = UIView(frame: CGRect(x: 0, y: 0, width: 60, height: 40))
    let imageView = UIImageView(frame: CGRect(x: (marker.iconView?.frame.width)!/2 - 14, y: (marker.iconView?.frame.height)! - 36, width: 28, height: 36))
    imageView.contentMode = .scaleAspectFit
    imageView.image = UIImage(named: "iconomapa")
    marker.iconView?.addSubview(imageView)
    imageView.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0) //we need adjust anchor point to achieve the desired behavior
    imageView.layer.frame = CGRect(x: (marker.iconView?.frame.width)!/2 - 14, y: (marker.iconView?.frame.height)! - 36, width: 28, height: 36) //we need adjust the layer frame

    let animation = CAKeyframeAnimation()
    animation.keyPath = "transform.rotation.z"
    animation.values = [ 0, -30 * .pi / 180.0, 30 * .pi / 180.0 , 0]
    animation.keyTimes = [0, 0.33 , 0.66 , 1]
    animation.duration = 1;
    animation.isAdditive = false;
    animation.isRemovedOnCompletion = true
    animation.repeatCount = .infinity

    marker.iconView!.subviews[0].layer.add(animation, forKey: "shakeAnimation")
    marker.map = self.mapView

Вот как это выглядит

Введите описание изображения здесь

Надеюсь, это поможет

Вы можете использовать свойство marker для поворота маркера,

marker.rotation =  (you_angle_in_degree) * M_PI / 180.0f; 
 //  convert  degree to radian 

Анимациягоризонтальное встряхивание Вы можете получить через некоторый интервал времени изменение степени вращения, вы можете использовать таймер,

  // create a timer
  timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true)

 func timerAction() {
       // Place you aniamtion logic here , 
       // every 0.5 second change the rotation of your maker
    }