奇奇怪怪的imageSize

438 阅读2分钟

背景

为了控制应用的包大小,工程里大多采用Assets进行图片的管理。在做UI需求时,经常会使用autolayout+intrinsicContentSize来进行布局,但是可能出现image的大小不符合预期,或者指定了imageView的大小但是展示出来是糊的

这都跟image的分辨率和缩放因子有关系

先介绍一些前置知识:

  • UIImage.size得到的是point size,也叫图片尺寸。等于图片分辨率/scale。也就是100100分辨率的图片,如果scale为2,那么通过size得到的值就为5050
  • UIImageView的intrinsicContentSize(叫做固有大小,在自动布局时如果没有指定大小,布局系统会拿这个值)等于imageView.image.size

解释下出现上面问题的原因:

  • View大小不对

    • UIImage.size有问题
  • 图片糊了

    • 图片分辨率小于视图大小

那么图片是我们自己添加进去的,添加之前的分辨率我们都知道,为什么会出现上面的情况呢?

原来使用Assets进行图片的管理,会改变图片的分辨率和缩放因子。具体可以使用如下实验证明

验证

分别将pdf图片、png图片拖到1x, 2x, 3x, single scale。build之后使用:

xcrun assetutil --info Assets.car

访问图片数据,数据格式如下:

(下面直接给结论)

为了更好地理解下面结论里的计算公式,需要约定一些值的意义:

  • screenScale:设备屏幕的缩放因子
  • assetsScale:将图片拖到Assets时选择的缩放因子,例如将图片放到1x,则assetsScale=1
  • pixelSize:图片的分辨率

结论

  • pdf类型

    • scale = screenScale
    • pixelSize = originalSize / assetsScale * screenScale
  • 非pdf类型

    • scale = assetsScale
    • pixelSize = originalSize

建议

  • PDF文件使用signal scale
  • png要求给到2X和3X