Google Maps iOS SDK GMSURLTileLayer 颜色与透明度显示异常
问题根因
Google Maps iOS SDK 内置的 GMSURLTileLayer 加载PNG瓦片时,默认会对图像的alpha通道执行预乘处理,当你的PNG瓦片采用非预乘alpha格式时,透明区域就会被叠加半透明白色遮罩。Android端和Web端的SDK默认兼容两种alpha格式,所以不会出现该问题。
解决方案
放弃使用封装好的 GMSURLTileLayer,自定义继承 GMSTileLayer 的子类,自行处理瓦片加载和alpha通道渲染逻辑即可解决。
步骤1:实现自定义瓦片图层类
class CustomTransparentTileLayer: GMSTileLayer { override func requestTileFor(x: UInt, y: UInt, zoom: UInt, receiver: GMSTileReceiver) { // 拼接瓦片地址 guard let tileUrl = URL(string: "https://aerocast.s3.amazonaws.com/radar/klix/lixtileskml/\(zoom)/\(x)/\(y).png") else { receiver.receiveTileWith(x: x, y: y, zoom: zoom, image: nil) return } // 异步下载瓦片 URLSession.shared.dataTask(with: tileUrl) { data, response, error in // 下载失败直接返回空瓦片 guard let data = data, error == nil, let rawImage = UIImage(data: data) else { receiver.receiveTileWith(x: x, y: y, zoom: zoom, image: nil) return } // 重绘图像修正alpha通道,关闭预乘逻辑 UIGraphicsBeginImageContextWithOptions(rawImage.size, false, rawImage.scale) rawImage.draw(at: .zero) let processedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // 返回处理后的瓦片 receiver.receiveTileWith(x: x, y: y, zoom: zoom, image: processedImage) }.resume() } }
步骤2:替换原有图层初始化逻辑
把你原来viewDidLoad中创建GMSURLTileLayer的代码替换为如下内容:
let tilelayer = CustomTransparentTileLayer() tilelayer.zIndex = 100 tilelayer.map = mapView tilelayer.opacity = 1.0
优化建议
你可以在自定义图层中加入内存+磁盘缓存逻辑,避免重复下载相同瓦片,提升地图滑动流畅度。
内容的提问来源于stack exchange,提问作者jeffb
相关产品推荐
相关产品推荐

