【问题标题】:How to fix flickering images after downloading from URL and setting it as GMSMarker?从 URL 下载并将其设置为 GMSMarker 后如何修复闪烁的图像?
【发布时间】:2019-10-08 12:29:10
【问题描述】:

这是我到目前为止所做的。当我调用函数应用图像时,视图中的所有标记都设置了它们的图像,但是当我缩小地图并检查其他标记时会出现问题,它们的图像会一直闪烁并且不会停止。我也希望我的图像是圆形的,但它们会不断变成六边形。 Here is the gif showing the problem.

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
        }
    }
}

【问题讨论】:

    标签: swift google-maps google-maps-markers


    【解决方案1】:

    Makers 有点像可重复使用的单元格,因此将图像保存到缓存会提高您的性能。要做到这一点,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")! )
        }
    }
    

    【讨论】:

    • 谢谢,我试试看!
    • 如果有帮助请不要忘记将其标记为真实,谢谢
    猜你喜欢
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多