pt — khái niệm, Points và tỷ lệ trong iOS

Tác giả: IT Sectr Đã đăng: 2026-02-25 Thời gian đọc: 8 phút

pt — points, đơn vị đo lường logic trong iOS và macOS, trừu tượng hóa giao diện khỏi độ phân giải vật lý của màn hình. Một point tương ứng với một pixel trên màn hình không Retina (@1x) và hai hoặc ba pixel trên Retina (@2x, @3x). Bài viết này giải thích nguyên lý hoạt động của pt, tỷ lệ trên các màn hình khác nhau, cách sử dụng CGPoint và UIFont.pointSize.

Những điểm chính

  • pt — điểm logic của iOS, độc lập với độ phân giải màn hình vật lý
  • @1x, @2x, @3x — hệ số tỷ lệ xác định bao nhiêu pixel tương ứng với một điểm
  • CGPoint — cấu trúc cho tọa độ trong pt, nền tảng của mọi thao tác định vị
  • UIFont.pointSize — kích thước phông chữ theo điểm, luôn trả về bằng pt
  • Khoảng cách màn hình: iPhone 15 Pro — 1 pt = 3 px ở mật độ pixel 460 PPI

pt là gì trong iOS?

pt (point) — đơn vị đo lường logic trong iOS cho phép nhà phát triển mô tả giao diện bằng các tọa độ trừu tượng, độc lập với độ phân giải vật lý của màn hình. Apple giới thiệu khái niệm points cùng với việc ra mắt iPhone 4 và màn hình Retina vào năm 2010. Trước Retina, các nhà phát triển sử dụng trực tiếp pixel — một pixel giao diện tương ứng với một pixel vật lý.

Hệ tọa độ iOS được xây dựng trên các điểm: điểm (0,0) nằm ở góc trên bên trái màn hình, trục X hướng sang phải, trục Y hướng xuống dưới. Kích thước màn hình tính theo điểm không đổi cho mỗi loại thiết bị: iPhone SE — 375×667 pt, iPhone 15 Pro — 393×852 pt, iPad — 768×1024 pt (dọc), 1024×768 pt (ngang). Độ phân giải vật lý có thể là 1179×2556 px (iPhone 15 Pro) — nhưng nhà phát triển làm việc với các điểm.

Theo Apple Human Interface Guidelines, các điểm là sự trừu tượng hóa cơ bản của UIKit. Tất cả các framework — UIKit, SwiftUI, Core Graphics, SpriteKit — hoạt động theo điểm. Việc chuyển đổi sang pixel diễn ra tự động trong giai đoạn kết xuất thông qua UIScreen.nativeScale.

Hệ số tỷ lệ: @1x, @2x, @3x

Hệ số tỷ lệ xác định bao nhiêu pixel vật lý tương ứng với một điểm logic. Apple sử dụng ba cấp độ: @1x — 1 pt = 1 px (iPad mini không Retina, các mẫu cũ), @2x — 1 pt = 2 px (hầu hết iPhone trước 2020, iPad Retina), @3x — 1 pt = 3 px (iPhone X trở lên, bao gồm iPhone 15 Pro).

Thiết bịKích thước theo ptKích thước theo pxTỷ lệ
iPhone SE (thế hệ thứ 3)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 (thế hệ thứ 6)744 × 11331488 × 2266@2x

Hệ số tỷ lệ có thể truy cập thông qua UIScreen.main.scale (cho UIKit) và @Environment(\.displayScale) (cho SwiftUI). Nó được sử dụng khi tải tài nguyên: hệ thống tự động chọn hình ảnh có hậu tố @2x hoặc @3x từ Assets.xcassets. Nhà phát triển không nên tải ảnh @1x trên thiết bị Retina — điều này làm giảm hiệu suất và chất lượng.

CGPoint và tọa độ theo điểm

Cấu trúc CGPoint là kiểu cơ bản để biểu diễn tọa độ trong iOS và macOS. Nó chứa hai trường: x (CGFloat) và y (CGFloat), các giá trị được chỉ định theo điểm. CGPoint được sử dụng trong tất cả các framework của Apple: UIKit (frame.origin), Core Graphics (CGContext), SpriteKit (SKNode.position), Core Animation (CALayer.position).

swift
// CGPoint — làm việc với tọa độ theo điểm
import UIKit

// Tạo một điểm
let point = CGPoint(x: 100.0, y: 200.0)
print("Tọa độ: \(point.x), \(point.y)")

// Các phép toán
let offset = CGPoint(x: 16.0, y: 8.0)
let translated = CGPoint(
    x: point.x + offset.x,
    y: point.y + offset.y
)

// Khoảng cách giữa các điểm
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)
}

// Chuyển đổi điểm thành pixel
extension CGPoint {
    func toPixels(scale: CGFloat) -> CGPoint {
        CGPoint(x: x * scale, y: y * scale)
    }
}

Phương thức toPixels trong ví dụ minh họa việc chuyển đổi điểm thành pixel vật lý thông qua UIScreen.main.scale. Trong UIKit, quá trình chuyển đổi này diễn ra tự động trong quá trình kết xuất, nhưng trong Core Graphics và khi làm việc với Metal, nhà phát triển có thể cần chuyển đổi tường minh sang pixel. Tất cả tính toán hoạt ảnh, phát hiện va chạm và bố cục đều được thực hiện theo điểm.

UIFont.pointSize và kiểu chữ

Thuộc tính UIFont.pointSize trả về kích thước phông chữ theo điểm — đây là đơn vị kiểu chữ tiêu chuẩn trong iOS, kế thừa từ ngành in ấn (1 pt = 1/72 inch). Apple đã sử dụng pt cho phông chữ từ những phiên bản đầu tiên của Mac OS. Trong iOS, kích thước phông chữ được chỉ định theo điểm thông qua UIFont.systemFont(ofSize:) hoặc thông qua SwiftUI Font.system(size:).

swift
// Làm việc với UIFont.pointSize trong Swift
import UIKit

// Tạo phông chữ với kích thước bằng pt
let titleFont = UIFont.systemFont(ofSize: 28.0, weight: .bold)
let bodyFont = UIFont.systemFont(ofSize: 17.0)
let captionFont = UIFont.systemFont(ofSize: 12.0)

// Đọc pointSize
print("Kích thước tiêu đề: \(titleFont.pointSize) pt")

// Dynamic Type — điều chỉnh tỷ lệ tự động
let scaledFont = UIFontMetrics.default.scaledFont(for: bodyFont)
print("Đã điều chỉnh tỷ lệ: \(scaledFont.pointSize) pt")

// So sánh kích thước phông chữ
func font(from size: CGFloat, weight: UIFont.Weight) -> UIFont {
    UIFont.systemFont(ofSize: size, weight: weight)
}

UIFontMetrics là cơ chế điều chỉnh tỷ lệ phông chữ động được thêm vào iOS 11. Nó tự động điều chỉnh pointSize dựa trên cài đặt trợ năng của người dùng (Settings > Display & Brightness > Text Size). Nếu không sử dụng UIFontMetrics, phông chữ sẽ không được điều chỉnh tỷ lệ, vi phạm các yêu cầu trợ năng WCAG.

pt so với px: khác biệt

Sự khác biệt giữa ptpx rất quan trọng để hiểu về phát triển iOS. pt là đơn vị logic, px là đơn vị vật lý. Một điểm có thể tương ứng với 1, 2 hoặc 3 pixel tùy thuộc vào hệ số tỷ lệ. Nhà phát triển làm việc với các điểm, hệ thống chuyển đổi chúng thành pixel ở giai đoạn rasterization.

Đặc điểmptpx
Loại đơn vịLogic (không phụ thuộc thiết bị)Vật lý (pixel phần cứng)
Phụ thuộc độ phân giảiKhông
Nơi sử dụngUIKit, SwiftUI, Core Graphics, bố cụcHình ảnh, Metal, raw buffer
Chuyển đổi1 pt = scale × px (tỷ lệ từ 1 đến 3)1 px = pt / scale
Ví dụ (iPhone 15 Pro)393 × 852 pt1179 × 2556 px

Kết luận chính: kích thước giao diện tính theo điểm giống nhau trên tất cả các thiết bị cùng loại. Màn hình rộng 375 pt — áp dụng cho cả iPhone SE và iPhone 14 (mẫu cơ bản). Sự khác biệt duy nhất là có bao nhiêu pixel vật lý nằm gọn trong 375 pt đó. Điều này đảm bảo giao diện người dùng thống nhất mà không cần điều chỉnh thủ công cho từng thiết bị.

pt trong SwiftUI

Trong SwiftUI, nhà phát triển không làm việc trực tiếp với các điểm — tất cả kích thước được chỉ định thông qua Dp (điểm không phụ thuộc thiết bị, tương đương với pt). SwiftUI tự động áp dụng hệ số tỷ lệ trong quá trình kết xuất nhưng cung cấp quyền truy cập thông qua giá trị môi trường displayScale.

swift
// SwiftUI — làm việc với điểm và hệ số tỷ lệ
import SwiftUI

struct ContentView: View {
    @Environment(\.displayScale) private var displayScale

    var body: some View {
        VStack(spacing: 16) {
            Text("Tiêu đề")
                .font(.system(size: 28, weight: .bold))

            Text("Văn bản nội dung mẫu")
                .font(.body)

            HStack {
                Text("Hệ số tỷ lệ:")
                    .font(.caption)
                Text("\(displayScale, specifier: "%.1f")")
                    .font(.caption.weight(.bold))
            }
        }
        .padding(20)
        .frame(width: 300)
    }
}

SwiftUI trừu tượng hóa pt ở cấp độ framework. .font(.body) tự động sử dụng Dynamic Type — kích thước phông chữ điều chỉnh theo cài đặt của người dùng. SwiftUI không cho phép chỉ định kích thước phông chữ bằng pixel — chỉ thông qua Font và hệ thống kiểu chữ. Điều này đảm bảo khả năng truy cập giao diện mà không cần nỗ lực thêm từ nhà phát triển.

Các câu hỏi thường gặp

Sự khác biệt giữa pt và px là gì?

pt — điểm logic của iOS, không phụ thuộc vào độ phân giải màn hình. px — pixel vật lý của màn hình. Một điểm trên iPhone 15 Pro tương đương ba pixel (@3x), trên iPad Pro — hai (@2x). Nhà phát triển luôn làm việc với các điểm.

Làm thế nào để biết hệ số tỷ lệ của thiết bị?

Trong UIKit: UIScreen.main.scale. Trong SwiftUI: @Environment(\.displayScale). Giá trị điển hình: 1.0 (@1x), 2.0 (@2x), 3.0 (@3x). Trên iPhone 15 Pro Max, giá trị là 3.0.

Nên sử dụng kích thước phông chữ nào cho văn bản nội dung?

Apple khuyến nghị 17 pt cho văn bản chính (UIFontTextStyle.body). Cho tiêu đề — 28–34 pt. Cho chú thích — 12–13 pt. Các kiểu Dynamic Type tự động điều chỉnh tỷ lệ dựa trên cài đặt trợ năng của người dùng.

Dynamic Type trong iOS là gì?

Dynamic Type — hệ thống điều chỉnh tỷ lệ phông chữ tự động của iOS được giới thiệu trong iOS 7. Nó cho phép văn bản thích ứng với cài đặt kích thước phông chữ hệ thống (Text Size) và các tham số trợ năng (Bold Text, Larger Text). Được triển khai thông qua UIFontMetrics hoặc các kiểu SwiftUI Font.

Có cần tạo tài nguyên @1x cho iOS không?

Không. Các thiết bị Apple hiện đại sử dụng màn hình Retina với @2x hoặc @3x. Hình ảnh @1x chỉ cần thiết để tương thích với iPad không Retina (iPad 2, iPad mini thế hệ thứ nhất). Kể từ iOS 13, tất cả các thiết bị đều hỗ trợ ít nhất @2x.

Tổng kết

  • pt — đơn vị logic của iOS, trừu tượng hóa giao diện khỏi độ phân giải vật lý và hệ số tỷ lệ
  • @2x và @3x — hệ số tỷ lệ cho màn hình Retina xác định số pixel trên mỗi điểm
  • CGPoint — cấu trúc cho tọa độ theo điểm, nền tảng của mọi thao tác định vị trong UIKit
  • UIFont.pointSize — kích thước phông chữ theo điểm với hỗ trợ Dynamic Type qua UIFontMetrics
  • SwiftUI trừu tượng hóa hoàn toàn pt, sử dụng Font và Dynamic Type để tự động thích ứng
  • Tài nguyên iOS nên được cung cấp ở @2x và @3x, @1x không cần thiết cho thiết bị hiện đại
  • Dynamic Type — cơ chế trợ năng bắt buộc tự động điều chỉnh tỷ lệ phông chữ cho người dùng

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm