SwiftUI中如何按原尺寸渲染URL加载的@2x、@3x图片?
解决方案:基于图片点尺寸计算渲染高度
问题核心是混淆了UIImage的像素尺寸和iOS的点尺寸:你之前直接用image.size.height(像素高度)和28(点单位)比较,导致@3x图的60像素高度被误判为超过28点,错误限制了渲染高度。
正确做法是先将图片像素高度转换为点高度(除以图片的scale属性,@2x图scale为2,@3x为3),再与最大高度28点对比:
实现代码
// 计算目标渲染高度:取图片原有点高度和最大允许高度的较小值 let targetHeight = min(image.size.height / image.scale, 28) Image(uiImage: image) .resizable() .renderingMode(.template) .tint(Constants.Colors.logo) .scaledToFit() .frame(height: targetHeight)
逻辑说明
image.size.height是图片的像素高度,image.scale是图片的缩放因子,两者相除得到图片的点尺寸高度(即设计时的原始高度)。- 对于270×60的@3x图,计算得点高度为
60/3=20,小于28,因此frame高度设为20点,图片将按90×20的点尺寸渲染,不会被放大。 - 对于点高度超过28的Logo(比如某Logo设计为30点高度,对应@3x图像素高度为90),计算得
90/3=30,大于28,因此frame高度设为28点,图片按比例缩放至符合最大高度限制。
如果需要在View内部直接计算,可简化为:
Image(uiImage: image) .resizable() .renderingMode(.template) .tint(Constants.Colors.logo) .scaledToFit() .frame(height: min(image.size.height / image.scale, 28))
内容的提问来源于stack exchange,提问作者Shawn Frank
相关产品推荐
相关产品推荐

