为什么UIView框架由浮游物组成?

从技术上说,x,y,宽度和高度表示一组与像素相关的维度。 我不能有200.23422像素,为什么他们使用浮动而不是整数?

浮动的原因是,现代的CPU和GPU a被优化,以并行的方式处理许多浮点数。 iOS和Mac都是如此。

使用Quartz,你不能解决单个像素的问题,但是你绘制的所有东西都是反锯齿的。 当你有一个坐标1.0,1.0时,这实际上是在坐标原点的2×2像素上添加颜色。

这就是为什么你可能会得到模糊的线条,如果你在整数坐标绘制。 在非视网膜上,你可以用0.5来抵消。 从技术上讲,你需要抵消0.25以在Retina显示屏上绘制精确的像素。 虽然在那里并不重要,因为在像素尺寸上你不会再看到它了。

长话短说:你不直接寻址像素,但graphics引擎映射在浮点坐标和像素之间。

解决独立性。

你想保持你的UI的math表示尽可能准确,只有当你真正需要绘制到输出设备时才转换为像素int值(甚至不是真的)。 这样就可以将任意数量的转换应用于您的视图,并仍然可以得到准确的结果。

此外,可以渲染线条,例如半像素宽度,甚至更less的可见结果 – 系统使用智能抗锯齿来显示细线。

这与vector图几十年来一直使用的原理是一样的(Adobe的PostScript,SVG等)。 事实上,Quartz是基于PDF,这是PostScript的现代版本。 NeXT使用Display PostScript的时候,它被认为是相当革命性的。

尺寸实际上是在非视网膜屏幕上与像素具有1比1的关系,而对于视网膜屏幕1点= 2像素。 所以在视网膜屏幕上,你实际上可以增加半个点。