这个起因是因为最近在写新项目,关于字体的通用代码没有导进来,然后UI同学在检查页面的时候发现在plus上字体小了,然后进行了一系列的深究
- 先说一下以前的解决方案, 判断如果是 plus机型那就把字体大小+1(或者+2, 这个不用死扣 反正也就视觉上差不多,但是没有理论根据)
- 网上的文章千千万,质量参差不齐 请阅读并实践之后再得出结论,不要上来就 要demo 拿了代码就直接往项目里面扔,有时候会死的很惨(下面会说)
- 解决方案很简单, 核心在于 UI同学给你的设计稿 是PX单位 还是PT单位
首先来看一下iOS的UIFont 到底是怎么回事
class func systemFont(ofSize fontSize: CGFloat) -> UIFont
image.png
fontSize这个参数需要的数值单位 是 points
但是! 苹果的这个 points 和 百度到的 pt(磅)这个单位 虽然叫一个名字,但不是一回事
Points Versus Pixels
In iOS there is a distinction between the coordinates you specify in your drawing code and the pixels of the underlying device. When using native drawing technologies such as Quartz, UIKit, and Core Animation, the drawing coordinate space and the view’s coordinate space are both logical coordinate spaces, with distances measured in points. These logical coordinate systems are decoupled from the device coordinate space used by the system frameworks to manage the pixels onscreen.
The system automatically maps points in the view’s coordinate space to pixels in the device coordinate space, but this mapping is not always one-to-one. This behavior leads to an important fact that you should always remember:
One point does not necessarily correspond to one physical pixel.
The purpose of using points (and the logical coordinate system) is to provide a consistent size of output that is device independent. For most purposes, the actual size of a point is irrelevant. The goal of points is to provide a relatively consistent scale that you can use in your code to specify the size and position of views and rendered content. How points are actually mapped to pixels is a detail that is handled by the system frameworks. For example, on a device with a high-resolution screen, a line that is one point wide may actually result in a line that is two physical pixels wide. The result is that if you draw the same content on two similar devices, with only one of them having a high-resolution screen, the content appears to be about the same size on both devices.
Note: In the context of PDF rendering and printing, Core Graphics defines "point" using the industry standard mapping of one point to 1/72 of an inch.
如果没看懂啥意思, 给你转换成一句简单的 如果是 一个 750 * 300 px的图 你只需要知道 代码中的尺寸是是 375*150 就好,
至于你百度搜索到的 关于pt和px的转换相关的文章 什么 72/96 或者是 1/72 这类的 文章表述的都没错, 但是请记住 这些计算方式不适合iOS!!!
如果你去搜索 iOS字体适配相关的文章,可能映入你眼帘的 会是什么 啊 @3x的屏幕 缩放比是3, @2x屏幕的缩放比是 2, 所以 在@3x的屏幕上 你的文字 就要 用 fontSize * 1.5 就可以啦~
比如 上图是设计稿,你可以这样试试 将字体大小乘个1.5, 我保证 你们亲爱的UI同学 分分钟能骂你祖宗十八辈的
3891540990781_.pic_hd.jpg
同学,老年机啦有没有, 难道都是 云开发? 既然写成文章就要负点责任好不啦
其实,你是被绕进去了, 想一下 全国 叫 小明的人有的是, 不是所有的小明都是你认识的那个小明的,
所以 不要拿pt(磅)转px的公式带入到 iOS 字体的大小设置中
一般设计同学给的设计稿都是基于4.7寸的屏幕(即 750 x 1334), 所以只要记住一点 2px = 1points 就好了
那么其实适配 puls机型的字体很简单,想一下UI上是怎么做适配的?
// UI基于 4.7寸型号屏幕做的设计稿
let KAdaptedHeight = UIScreen.main.bounds.size.width / 375.0
UI适配 都是这样做出来的吧?
那么 字体也一样
UIFont.systemFont(ofSize: fontSize * KAdaptedHeight)
这样就可以了,保准你们可爱的UI同学 不会再来找你们字体相关的麻烦
网友评论