ios - 谷歌地图标记图标为带边框的圆形图片

标签 ios swift google-maps firebase uiimageview

我想做的是将谷歌地图标记设置为仅我从 firebase 下载的 UIImage。目前这是我的代码:

 if let downloadedImage = UIImage(data: data!) {

    let markerImageView: UIImageView? = nil

    markerImageView?.image = downloadedImage
    print(markerImageView?.image)
    markerImageView?.frame = CGRect(x: 0, y: 0, width: 50, height: 50)

    markerImageView?.layer.borderWidth = 1.0
    markerImageView?.layer.masksToBounds = false
    markerImageView?.layer.borderColor = UIColor.white.cgColor
    markerImageView?.layer.cornerRadius = (markerImageView?.frame.size.width)! / 2
    markerImageView?.clipsToBounds = true

    let actualFinalImage = markerImageView?.image

    marker.icon = actualFinalImage

}

我知道我正在从 firebase 获取图像并且该部分正在工作。但是,我认为问题出在这部分: letmarkerImageView: UIImageView? = nil 我认为将其设置为 nil 与标记图标冲突,这就是为什么这不起作用。但是,如果我取出 nil 部分,则会收到一条错误消息,指出在初始化markerImageView 之前我无法对其进行编辑。

如有任何帮助,我们将不胜感激!

最佳答案

更容易。我制作了一个 UIImage 扩展,可以将任何图像转换为圆形。 而不是仅仅调用该函数。

extension UIImage {
    func circularImage(_ radius: CGFloat) -> UIImage? {
        var imageView = UIImageView()
        if self.size.width > self.size.height {
            imageView.frame =  CGRect(x: 0, y: 0, width: self.size.width, height: self.size.width)
            imageView.image = self
            imageView.contentMode = .scaleAspectFit
        } else { imageView = UIImageView(image: self) }
        var layer: CALayer = CALayer()

        layer = imageView.layer
        layer.masksToBounds = true
        layer.cornerRadius = radius
        UIGraphicsBeginImageContext(imageView.bounds.size)
        layer.render(in: UIGraphicsGetCurrentContext()!)
        let roundedImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return roundedImage
    }
}

所以当你声明 gmsmarker 时就这样做

func downloadGMSMarkerImage(url: URL,marker : GMSMarker) {
    print("Download Started")
    getDataFromUrl(url: url) { data, response, error in
        guard let data = data, error == nil else { return }
        print(response?.suggestedFilename ?? url.lastPathComponent)
        print("Download Finished")
        DispatchQueue.main.async() {
            let pinImage = UIImage(data: data)
            let size = CGSize(width: 44, height: 44)
            UIGraphicsBeginImageContext(size)
            pinImage!.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
            let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
            marker.icon = resizedImage?.circularImage(22)//call function if want the image cirle

        }
    }
}

和 你会得到像这样的结果

enter image description here

关于ios - 谷歌地图标记图标为带边框的圆形图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43309563/

相关文章:

swift - 当另一个模块在 Swift 中具有具有自己名称的类型时,引用另一个模块中与当前模块中的类型同名的类型

ios - 当 UIViewController 在启动期间设置为 UIWindow 的根时,不会调用 viewWillAppear 和后续生命周期事件

ios - 如何将照片(以及标签和按钮)放入 ScrollView ,每次在 Storyboard 中添加新照片时让它变长

ios - 如何使用 Google Maps iOS SDK 获取地址组件的完整列表

javascript - 在谷歌地图 V3 上绘制阴影区域 - Javascript

ios - 更新计时器 UI 的最佳方式是什么

javascript - 如何将 HMHome 转换为 React Native 的 JavaScript?

iphone - iOS:使用 CLGeocoder 与 ReverseGeocoding。谷歌地理编码器 API

iphone - CorePlot ScatterPlot 滚动性能 iPhone4

iOS 前台观察器未被调用