Как исправить мерцание изображений после загрузки с URL и установки его в качестве GMSMarker? - PullRequest
0 голосов
/ 22 мая 2019

Это то, что я сделал до сих пор. Когда я вызываю функции «Применить изображение», у всех видимых маркеров установлены свои изображения, но возникают проблемы, когда я уменьшаю карты и проверяю другие маркеры, их изображения продолжают мерцать и не прекращаются. Также я хочу, чтобы мои изображения были круглыми, но они продолжают превращаться в шестиугольник. Вот изображение, показывающее проблему.

func showCurrentLocationWithOnlineMarkers() {
    guard let locationObj = locationManager.location else {
        return
    }
    viwMaps.delegate = self
    let coord = locationObj.coordinate
    userLat = coord.latitude
    userLng = coord.longitude
    let camera: GMSCameraPosition = GMSCameraPosition.camera(withLatitude: userLat, longitude: userLng, zoom: Float(17.0))
    viwMaps.isMyLocationEnabled = true
    viwMaps.settings.myLocationButton = true
    self.viwMaps.animate(to: camera)
    for data in arrGetDriverModal{
            let driver_lat = CLLocationDegrees(data.driver_lat ?? "")
            let driver_long = CLLocationDegrees(data.driver_long ?? "")
            let location = CLLocationCoordinate2D(latitude: driver_lat!, longitude: driver_long!)
            let marker = GMSMarker()
            marker.position = location
            marker.userData = data
        marker.map = self.viwMaps
            let imageURL = URL(string: API.imgbaseURL+data.driver_image!)
                self.applyImage(from: imageURL!, to: marker)
    }

}

func applyImage(from url: URL, to marker: GMSMarker) {
    let imageView = UIImageView(image: #imageLiteral(resourceName: "marker"))
    imageView.frame = CGRect.init(x: 0, y: 0, width: 44, height: 44)
    DispatchQueue.global(qos: .background).async {
        guard let data = try? Data(contentsOf: url),
            let image = UIImage(data: data)
            else { return }

        DispatchQueue.main.async {
            imageView.image = image
            imageView.layer.cornerRadius = 22
            imageView.clipsToBounds = true
            imageView.layer.masksToBounds = true
            marker.iconView = imageView
        }
    }
}

1 Ответ

0 голосов
/ 22 мая 2019

Создатели действуют как многократно используемые ячейки, поэтому сохранение изображений в кэш-памяти повысит вашу производительность. Для этого Kingfisher - хорошая библиотека. После установки и импорта вы можете использовать это в вашем случае;

func applyImage(from url: URL, to marker: GMSMarker) {
    let imageView = UIImage()
    imageView.frame = CGRect.init(x: 0, y: 0, width: 44, height: 44)

    let identifier =  "\(a specific name for each of your markers, could be coordinates or adress)"
    let url = URL(string: "your url")!
            let resource = ImageResource(downloadURL: url, cacheKey: identifier)
            imageView.kf.setImage(with: resource, placeholder: UIImage(named: 
          "placeholderIfYouHave.png")! )
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...