为啥 UIView 框架是由浮动组成的?
Posted
技术标签:
【中文标题】为啥 UIView 框架是由浮动组成的?【英文标题】:Why are UIView frames made up of floats?为什么 UIView 框架是由浮动组成的? 【发布时间】:2013-01-07 06:10:22 【问题描述】:从技术上讲,x、y、宽度和高度表示一组与像素相关的维度。一世 不能有 200.23422 像素那么为什么他们使用浮点数而不是整数?
【问题讨论】:
【参考方案1】:浮点数的原因是现代 CPU 和 GPU 经过优化,可以并行处理许多浮点数。 ios 和 Mac 都是如此。
使用 Quartz,您无需处理单个像素,但您绘制的所有内容始终是抗锯齿的。当您有一个坐标 1.0, 1.0 时,这实际上为坐标原点的 2x2 像素添加了颜色。
这就是为什么在整数坐标处绘制时可能会出现线条模糊的原因。在非视网膜上,您必须绘制 0.5 的偏移量。从技术上讲,您需要偏移 0.25 才能在 Retina 显示器上绘制精确的像素。虽然在那里它并不重要,因为在那个像素大小上你真的看不到它了。
长话短说:您不会直接处理像素,但图形引擎会为您在浮点坐标和像素之间映射。
【讨论】:
【参考方案2】:分辨率独立性。
您希望保持 UI 的数学表示尽可能准确,仅在您实际需要绘制到输出设备时才转换为像素 int 值(即使那样,也不是真的)。这样您就可以对视图应用任意数量的转换,并且仍然可以获得准确的结果。
此外,还可以渲染线条,例如,以半像素宽度甚至更小宽度呈现可见结果 - 系统使用智能抗锯齿来显示细线。
这与几十年来一直使用的矢量绘图原理相同(Adobe 的 PostScript、SVG 等)。事实上 Quartz 是基于 PDF 的,它是 PostScript 的现代版本。 NeXT 在当时使用了 Display PostScript,然后被认为是相当具有革命性的。
【讨论】:
【参考方案3】:尺寸实际上是在非视网膜屏幕上与像素具有 1 比 1 关系的点,但对于视网膜屏幕,1 点 = 2 像素。所以在视网膜屏幕上你实际上可以增加半个点。
【讨论】:
这并没有真正回答这个问题,这种浮动语法在视网膜之前就已经存在了。 这也是Resolution independence
的因素
我认为这是为了未来的证明。也许将来 1 点可能等于 4 个像素。所以 100.25 的维度是有意义的。以上是关于为啥 UIView 框架是由浮动组成的?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UIView 框架上的 observable 只在订阅后触发一次