You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:57:22