背景
为了控制应用的包大小,工程里大多采用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