Могу ли я получить баллы UIScreen за баллы GMSMarker?

Я включил представление карты Google в свой проект и успешно показываю на нем маркер. Карта Google обеспечивает только всплывающую анимацию маркера. я хочу анимацию падения для маркеров.

Я успешно реализовал анимацию радиуса, увеличивая и уменьшая масштаб, но мне нужна анимация падения маркера.

Итак, моя идея заключается в том, что если я получу точную точку маркера в UIScreen, то я перетащу булавку в верхнюю часть экрана, что создаст эффект анимации опускания.

наконец, я получил анимацию падения из приведенного ниже кода, но есть одна проблема: я не получил идеальных точек от просмотра карты, чтобы показать анимацию падения.

//Drop pin
    func setMarker(latitude : Double, longitude : Double, isForJobLocation : Bool = false){

        let point = mapView.projection.point(for: CLLocationCoordinate2D(latitude: latitude, longitude:  longitude))
        let viewPoints = UIApplication.shared.keyWindow!.convert(point, from: mapView)

        print(viewPoints)

        self.showAnimatation(xPosition: viewPoints.x, yPosition: viewPoints.y) {

            let marker1 = GMSMarker(position: CLLocationCoordinate2D(latitude: latitude, longitude:  longitude))
            marker1.icon = UIImage(named: "mapLoadingPin")
            marker1.map = self.mapView
        }

    }

    func showAnimatation(xPosition : CGFloat, yPosition : CGFloat, completion : @escaping (() -> ())){

        let imageView = UIImageView(frame: CGRect(x: xPosition, y: yPosition - 100, width: 44, height: 44))
        imageView.image = UIImage(named: "mapLoadingPin")
        self.view.addSubview(imageView)

        UIView.animate(withDuration: 1.0, animations: {
            imageView.frame.origin.y = yPosition
            self.view.layoutIfNeeded()
        }) { (true) in
            imageView.removeFromSuperview()
            completion()
        }
    }

Помогите мне, пожалуйста. Любая помощь будет оценена по достоинству.


person Jitendra Modi    schedule 13.11.2018    source источник


Ответы (2)


Я вижу две проблемы в вашем коде:

  1. Вы конвертируете CGPoint из вашего mapView в систему координат keyWindow. Но затем вы добавляете свой imageView в свое представление, используя CGPoint, рассчитанный для вашего окна.

  2. Вы не принимаете во внимание размер imageViews. Я предполагаю, что ваше изображение маркера должно быть размещено горизонтально по центру над точкой на карте. (но это зависит от дизайна вашего изображения маркера)


Следующие изменения должны решить вашу проблему:

  • Преобразуйте начало GMSMarkers в систему координат parentView вашего imageView. Заменять

    let viewPoints = UIApplication.shared.keyWindow!.convert(point, from: mapView)

    с

    let viewPoints = self.view.convert(point, from: mapView)

  • Учитывайте размер imageViews. Происхождение вашего imageView (после анимации) должно быть (xPosition — imageView.width/2, yPosition — imageView.height). В вашем примере замените

    let imageView = UIImageView(frame: CGRect(x: xPosition, y: yPosition - 100, width: 44, height: 44))

    с

    let imageView = UIImageView(frame: CGRect(x: xPosition - 22, y: yPosition - 44 - 100, width: 44, height: 44))


Если это не должно решить вашу проблему, помогите нам помочь вам, предоставив снимок экрана, показывающий неуместные изображения.

person Robin Schmidt    schedule 22.11.2018

Я протестировал ваш код, и ваша проблема заключается в использовании origin.y для вашего фрейма imageView.

Точка, указывающая координаты начала координат прямоугольника.

Согласно документу Apple, происхождение представляет собой minX и minY вашего CGRect. Итак, вы должны реорганизовать свою позицию как таковую:

imageView.frame.origin.y = yPosition - imageView.bounds.height
person Li Sim    schedule 23.11.2018