pt — 这是什么,Points 和 iOS 中的缩放

作者: IT Sectr 发布日期: 2026-02-25 阅读时间: 8 分钟

pt — 点,iOS 和 macOS 中的逻辑测量单位,将界面从物理屏幕分辨率中抽象出来。一个 point 对应非 Retina 屏幕上的一个像素(@1x),以及 Retina 屏幕上的两个或三个像素(@2x, @3x)。本文解释了 pt 的工作原理、在不同屏幕上的缩放、CGPoint 和 UIFont.pointSize 的使用。

要点

  • pt — iOS 逻辑点,独立于物理屏幕分辨率
  • @1x, @2x, @3x — 缩放系数,确定每个点有多少像素
  • CGPoint — pt 中坐标的结构,所有定位操作的基础
  • UIFont.pointSize — 字体大小以点为单位,始终以 pt 返回
  • 距离屏幕的距离: iPhone 15 Pro — 460 PPI 像素密度下 1 pt = 3 px

iOS 中的 pt 是什么?

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 自动进行。

缩放系数:@1x, @2x, @3x

缩放系数(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 × 667750 × 1334@2x
iPhone 14390 × 8441170 × 2532@3x
iPhone 15 Pro Max430 × 9321290 × 2796@3x
iPad Pro 12.9"1024 × 13662048 × 2732@2x
iPad mini (6th gen)744 × 11331488 × 2266@2x

scale factor 的值可以通过 UIScreen.main.scale(对于 UIKit)和 @Environment(\.displayScale)(对于 SwiftUI)获得。在加载资源时使用:系统会自动从 Assets.xcassets 中选择带有 @2x 或 @3x 后缀的图片。开发者不应在 Retina 设备上加载 @1x 图片 — 这会降低性能和质量。

CGPoint 和点坐标

CGPoint 结构 — 用于在 iOS 和 macOS 中表示坐标的基本类型。包含两个字段:x(CGFloat)和 y(CGFloat),值以点为单位。CGPoint 用于所有 Apple 框架中:UIKit(frame.origin)、Core Graphics(CGContext)、SpriteKit(SKNode.position)、Core Animation(CALayer.position)。

swift
// 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 和排版

UIFont.pointSize 属性返回以点为单位的字体大小 — 这是 iOS 中排版的标准单位,继承自印刷业(1 pt = 1/72 英寸)。Apple 从 Mac OS 的第一个版本开始就使用 pt 表示字体。在 iOS 中,字体大小以点为单位通过 UIFont.systemFont(ofSize:) 或 SwiftUI Font.system(size:) 设置。

swift
// 在 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 vs px:区别

ptpx 之间的区别对于理解 iOS 开发至关重要。pt — 逻辑单位,px — 物理单位。一个点可以根据 scale factor 对应 1、2 或 3 个像素。开发者使用点,系统在光栅化阶段将其转换为像素。

特性ptpx
单位类型逻辑(设备无关)物理(硬件像素)
取决于分辨率
使用场景UIKit、SwiftUI、Core Graphics、布局图片、Metal、原始缓冲区
转换1 pt = scale × px(scale 从 1 到 3)1 px = pt / scale
示例(iPhone 15 Pro)393 × 852 pt1179 × 2556 px

关键结论:同一类别的所有设备上界面的点尺寸是相同的。375 pt 宽的屏幕 — 这既是 iPhone SE 也是 iPhone 14(基础型号)。区别仅在于这 375 pt 中容纳了多少物理像素。这确保了统一的 UI,无需为每个设备进行手动适配。

SwiftUI 中的 pt

SwiftUI 中,开发者不显式使用点 — 所有尺寸通过 Dp(设备无关点,pt 的等效项)给出。SwiftUI 在渲染时自动应用 scale factor,但通过 environment value displayScale 提供访问。

swift
// 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 和 px 之间的区别是什么?

pt — iOS 逻辑点,独立于屏幕分辨率。px — 显示器的物理像素。iPhone 15 Pro 上的一个点等于三个像素(@3x),iPad Pro 上等于两个(@2x)。开发者始终使用点。

如何知道设备的 scale factor?

在 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 样式会根据用户的无障碍设置自动缩放。

iOS 中的 Dynamic Type 是什么?

Dynamic Type — iOS 中的自动字体缩放系统,于 iOS 7 中推出。允许文本适应系统字体大小设置(Text Size)和无障碍参数(Bold Text、Larger Text)。通过 UIFontMetrics 或 SwiftUI Font 样式实现。

是否需要为 iOS 创建 @1x 资源?

不需要。现代 Apple 设备使用 @2x 或 @3x 的 Retina 显示屏。@1x 图片仅用于与无 Retina 的 iPad(iPad 2、iPad mini 1st gen)兼容。从 iOS 13 开始,所有设备至少支持 @2x。

总结

  • pt — iOS 逻辑单位,将界面从物理分辨率和 scale factor 中抽象出来
  • @2x 和 @3x — 针对 Retina 显示屏的缩放系数,确定每点的像素数
  • CGPoint — 点坐标的结构,UIKit 中所有定位操作的基础
  • UIFont.pointSize — 以点为单位字体大小,通过 UIFontMetrics 支持 Dynamic Type
  • SwiftUI 完全抽象了 pt,使用 Font 和 Dynamic Type 进行自动适配
  • 资源 iOS 应提供 @2x 和 @3x 格式,现代设备不需要 @1x
  • Dynamic Type — 强制性的无障碍机制,自动为用户缩放字体

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读