pt — 点,iOS 和 macOS 中的逻辑测量单位,将界面从物理屏幕分辨率中抽象出来。一个 point 对应非 Retina 屏幕上的一个像素(@1x),以及 Retina 屏幕上的两个或三个像素(@2x, @3x)。本文解释了 pt 的工作原理、在不同屏幕上的缩放、CGPoint 和 UIFont.pointSize 的使用。
要点
pt(point)— iOS 中的逻辑测量单位,允许开发者用抽象的坐标描述界面,独立于显示器的物理分辨率。Apple 在 2010 年随 iPhone 4 和 Retina 显示屏的推出引入了 point 的概念。在 Retina 之前,开发者直接使用像素 — 一个 UI 像素等于一个物理像素。
iOS 的坐标系建立在点上:点 (0,0) 位于屏幕左上角,X 轴向右,Y 轴向下。屏幕上以点为单位的大小对每类设备保持恒定:iPhone SE — 375×667 pt,iPhone 15 Pro — 393×852 pt,iPad — 768×1024 pt(竖屏),1024×768 pt(横屏)。物理分辨率可能是 1179×2556 px(iPhone 15 Pro)— 但开发者使用的是点。
根据 Apple Human Interface Guidelines,点是 UIKit 的基本抽象。所有框架 — UIKit、SwiftUI、Core Graphics、SpriteKit — 都以点为单位工作。到像素的转换在渲染阶段通过 UIScreen.nativeScale 自动进行。
缩放系数(scale factor)决定多少个物理像素对应一个逻辑点。Apple 使用三个级别:@1x — 1 pt = 1 px(无 Retina 的 iPad mini,旧型号),@2x — 1 pt = 2 px(2020 年以前的大多数 iPhone,iPad Retina),@3x — 1 pt = 3 px(iPhone X 及更新版本,包括 iPhone 15 Pro)。
| 设备 | pt 尺寸 | px 尺寸 | 缩放 |
|---|---|---|---|
| iPhone SE (3rd gen) | 375 × 667 | 750 × 1334 | @2x |
| iPhone 14 | 390 × 844 | 1170 × 2532 | @3x |
| iPhone 15 Pro Max | 430 × 932 | 1290 × 2796 | @3x |
| iPad Pro 12.9" | 1024 × 1366 | 2048 × 2732 | @2x |
| iPad mini (6th gen) | 744 × 1133 | 1488 × 2266 | @2x |
scale factor 的值可以通过 UIScreen.main.scale(对于 UIKit)和 @Environment(\.displayScale)(对于 SwiftUI)获得。在加载资源时使用:系统会自动从 Assets.xcassets 中选择带有 @2x 或 @3x 后缀的图片。开发者不应在 Retina 设备上加载 @1x 图片 — 这会降低性能和质量。
CGPoint 结构 — 用于在 iOS 和 macOS 中表示坐标的基本类型。包含两个字段:x(CGFloat)和 y(CGFloat),值以点为单位。CGPoint 用于所有 Apple 框架中:UIKit(frame.origin)、Core Graphics(CGContext)、SpriteKit(SKNode.position)、Core Animation(CALayer.position)。
// CGPoint — 使用点坐标
import UIKit
// 创建点
let point = CGPoint(x: 100.0, y: 200.0)
print("坐标:\(point.x), \(point.y)")
// 数学运算
let offset = CGPoint(x: 16.0, y: 8.0)
let translated = CGPoint(
x: point.x + offset.x,
y: point.y + offset.y
)
// 点之间的距离
func distance(from a: CGPoint, to b: CGPoint) -> CGFloat {
let dx = b.x - a.x
let dy = b.y - a.y
return sqrt(dx * dx + dy * dy)
}
// 将点转换为像素
extension CGPoint {
func toPixels(scale: CGFloat) -> CGPoint {
CGPoint(x: x * scale, y: y * scale)
}
}示例中的 toPixels 方法演示了通过 UIScreen.main.scale 将点转换为物理像素。在 UIKit 中,这种转换在渲染时自动发生,但在 Core Graphics 和使用 Metal 时,开发者可能需要显式转换为像素。所有动画计算、碰撞检测和布局都以点为单位执行。
UIFont.pointSize 属性返回以点为单位的字体大小 — 这是 iOS 中排版的标准单位,继承自印刷业(1 pt = 1/72 英寸)。Apple 从 Mac OS 的第一个版本开始就使用 pt 表示字体。在 iOS 中,字体大小以点为单位通过 UIFont.systemFont(ofSize:) 或 SwiftUI Font.system(size:) 设置。
// 在 Swift 中使用 UIFont.pointSize
import UIKit
// 创建以 pt 为单位大小的字体
let titleFont = UIFont.systemFont(ofSize: 28.0, weight: .bold)
let bodyFont = UIFont.systemFont(ofSize: 17.0)
let captionFont = UIFont.systemFont(ofSize: 12.0)
// 读取 pointSize
print("标题大小:\(titleFont.pointSize) pt")
// 动态类型 — 自动缩放
let scaledFont = UIFontMetrics.default.scaledFont(for: bodyFont)
print("已缩放:\(scaledFont.pointSize) pt")
// 比较字体大小
func font(from size: CGFloat, weight: UIFont.Weight) -> UIFont {
UIFont.systemFont(ofSize: size, weight: weight)
}UIFontMetrics — 动态字体缩放机制,于 iOS 11 中添加。它根据用户的无障碍设置(Settings > Display & Brightness > Text Size)自动调整 pointSize。如果不使用 UIFontMetrics,字体将不会被缩放,这违反了 WCAG 的无障碍要求。
pt 和 px 之间的区别对于理解 iOS 开发至关重要。pt — 逻辑单位,px — 物理单位。一个点可以根据 scale factor 对应 1、2 或 3 个像素。开发者使用点,系统在光栅化阶段将其转换为像素。
| 特性 | pt | px |
|---|---|---|
| 单位类型 | 逻辑(设备无关) | 物理(硬件像素) |
| 取决于分辨率 | 否 | 是 |
| 使用场景 | UIKit、SwiftUI、Core Graphics、布局 | 图片、Metal、原始缓冲区 |
| 转换 | 1 pt = scale × px(scale 从 1 到 3) | 1 px = pt / scale |
| 示例(iPhone 15 Pro) | 393 × 852 pt | 1179 × 2556 px |
关键结论:同一类别的所有设备上界面的点尺寸是相同的。375 pt 宽的屏幕 — 这既是 iPhone SE 也是 iPhone 14(基础型号)。区别仅在于这 375 pt 中容纳了多少物理像素。这确保了统一的 UI,无需为每个设备进行手动适配。
在 SwiftUI 中,开发者不显式使用点 — 所有尺寸通过 Dp(设备无关点,pt 的等效项)给出。SwiftUI 在渲染时自动应用 scale factor,但通过 environment value displayScale 提供访问。
// SwiftUI — 使用点和 scale factor
import SwiftUI
struct ContentView: View {
@Environment(\.displayScale) private var displayScale
var body: some View {
VStack(spacing: 16) {
Text("标题")
.font(.system(size: 28, weight: .bold))
Text("示例的主要文本")
.font(.body)
HStack {
Text("Scale factor:")
.font(.caption)
Text("\(displayScale, specifier: "%.1f")")
.font(.caption.weight(.bold))
}
}
.padding(20)
.frame(width: 300)
}
}SwiftUI 在框架层面抽象了 pt。.font(.body) 自动使用 Dynamic Type — 字体大小根据用户设置进行调整。SwiftUI 不允许以像素为单位设置字体大小 — 只能通过 Font 和排版系统。这保证了界面的无障碍性,无需开发者额外努力。
常见问题
pt — iOS 逻辑点,独立于屏幕分辨率。px — 显示器的物理像素。iPhone 15 Pro 上的一个点等于三个像素(@3x),iPad Pro 上等于两个(@2x)。开发者始终使用点。
在 UIKit 中:UIScreen.main.scale。在 SwiftUI 中:@Environment(\.displayScale)。典型值:1.0(@1x)、2.0(@2x)、3.0(@3x)。iPhone 15 Pro Max 上的值是 3.0。
Apple 推荐正文使用 17 pt(UIFontTextStyle.body)。标题使用 28–34 pt。说明文字使用 12–13 pt。Dynamic Type 样式会根据用户的无障碍设置自动缩放。
Dynamic Type — iOS 中的自动字体缩放系统,于 iOS 7 中推出。允许文本适应系统字体大小设置(Text Size)和无障碍参数(Bold Text、Larger Text)。通过 UIFontMetrics 或 SwiftUI Font 样式实现。
不需要。现代 Apple 设备使用 @2x 或 @3x 的 Retina 显示屏。@1x 图片仅用于与无 Retina 的 iPad(iPad 2、iPad mini 1st gen)兼容。从 iOS 13 开始,所有设备至少支持 @2x。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。