Size Class là một cơ chế trong iOS cho bố cục thích ứng, chia tất cả thiết bị thành hai loại trên mỗi trục: Compact (hẹp/ngắn) và Regular (rộng/dài). Sự kết hợp của các giá trị này xác định cách giao diện hiển thị trên iPhone, iPad, Mac Catalyst và CarPlay. Theo Apple Human Interface Guidelines, 2024, Size Class cho phép xây dựng một storyboard duy nhất cho tất cả thiết bị bằng Auto Layout và UITraitCollection. Hệ thống hoạt động trên tất cả thiết bị iOS kể từ iOS 8.
Những điểm chính
Size Class là một phân loại màn hình trừu tượng trong iOS, được Apple giới thiệu trong iOS 8 để thống nhất bố cục thích ứng. Thay vì kiểm tra một mẫu thiết bị cụ thể, Size Class xác định hai đặc tính: không gian ngang và dọc có sẵn. Mỗi đặc tính nhận một trong hai giá trị — Compact (không gian hạn chế) hoặc Regular (không gian đủ). Sự kết hợp của các giá trị này tạo thành một bộ sưu tập đặc điểm (trait collection), được truyền đến tất cả các phần tử giao diện.
Trước Size Class, các nhà phát triển tạo storyboard riêng cho iPhone và iPad hoặc sử dụng kiểm tra UI_USER_INTERFACE_IDIOM() trong mã. Điều này dẫn đến trùng lặp mã, storyboard phình to và khó khăn trong việc hỗ trợ kích thước màn hình mới. Size Class đã giải quyết vấn đề bằng cách cung cấp một hệ thống phổ quát: nhà phát triển cấu hình giao diện cho 4 tổ hợp Compact/Regular và iOS tự động chọn tổ hợp phù hợp. Với sự ra đời của Split View trên iPad và các kích thước iPhone khác nhau, hệ thống trở nên không thể thiếu cho bố cục thích ứng.
Size Class được iOS tính toán dựa trên chiều rộng và chiều cao màn hình hiện tại, có tính đến hướng và đa nhiệm. Các giá trị không gắn với pixel cụ thể — nó là một danh mục logic. Ví dụ: iPhone 16 Pro ở hướng dọc có ngang là Compact và dọc là Regular. Cùng iPhone ở hướng ngang — Compact trên cả hai trục. iPad trong Split View với ứng dụng ở 1/3 màn hình nhận ngang là Compact, mặc dù ở chế độ toàn màn hình nó là Regular. Hệ thống tự động cập nhật Size Class khi thay đổi hướng hoặc Split View.
Size Class sử dụng bốn tổ hợp của hai giá trị trên hai trục. Mỗi tổ hợp có ứng dụng riêng tùy thuộc vào loại thiết bị và hướng của nó. Hiểu các tổ hợp này là nền tảng để thiết kế giao diện thích ứng cho iOS. Hệ thống bao phủ tất cả thiết bị Apple hiện tại: iPhone, iPad, Mac Catalyst và CarPlay. Apple khuyên nên bắt đầu thiết kế với tổ hợp wAny hAny (bố cục cơ bản) và tinh chỉnh cho các tổ hợp cụ thể.
wCompact hRegular — iPhone ở hướng dọc (trừ Plus/Max trong một số trường hợp). wCompact hCompact — iPhone SE/6/7/8 ở hướng ngang. wRegular hRegular — iPad toàn màn hình ở bất kỳ hướng nào, iPhone Plus/Max ở hướng ngang. wRegular hCompact — iPad ở hướng ngang với nội dung hẹp. Mỗi tổ hợp xác định ràng buộc và phần tử nào đang hoạt động. Nhà phát triển có thể đặt giao diện cho từng tổ hợp riêng biệt trong Interface Builder.
Trên Mac Catalyst, Size Class luôn là wRegular hRegular — giao diện kích thước đầy đủ. Điều này có nghĩa là phiên bản Mac của ứng dụng iPad nhận được không gian tối đa. Nhà phát triển có thể sử dụng kiểm tra bổ sung qua UIScreen.traitCollection.userInterfaceIdiom để phân biệt Mac với iPad. Size Class trên Mac hoạt động ổn định, nhưng ứng dụng Catalyst thường yêu cầu thích ứng bổ sung cho chuột và bàn phím vượt quá Size Class.
Size Class xác định ràng buộc Auto Layout nào đang hoạt động, phần tử giao diện nào hiển thị và cách bố trí các subview. Nhà phát triển có thể đặt các ràng buộc khác nhau cho các Size Class khác nhau và iOS tự động chuyển đổi chúng khi bộ sưu tập đặc điểm thay đổi. Ví dụ: trên iPad (wRegular hRegular), bảng có chi tiết hiển thị ở chế độ Master-Detail, trên iPhone (wCompact hRegular) — ở Navigation Stack. Đây là kịch bản chính của bố cục thích ứng với Size Class.
Trong Interface Builder, nhà phát triển chọn tổ hợp Size Class qua nút Vary for Traits và thêm ràng buộc chỉ áp dụng cho tổ hợp đó. Các ràng buộc được đặt cho wAny hAny luôn áp dụng. Các ràng buộc được đặt cho tổ hợp cụ thể chỉ kích hoạt khi Size Class khớp. Nếu không có ràng buộc đặc biệt nào được đặt cho tổ hợp, các ràng buộc cơ bản được sử dụng. Khi Size Class thay đổi, iOS tạo hiệu ứng chuyển tiếp giữa các bộ ràng buộc.
Cờ Installed trong Interface Builder cho phép ẩn phần tử cho các Size Class cụ thể. Nhà phát triển đánh dấu phần tử là Uninstalled cho tổ hợp đã chọn. Ví dụ: nút Details chỉ hiển thị trên iPad (wRegular hRegular) và ẩn trên iPhone. Điều này đơn giản hơn quản lý isHidden trong mã. Để ẩn theo chương trình, ghi đè traitCollectionDidChange hoặc sử dụng phương thức willTransition, kiểm tra Size Class hiện tại.
Interface Builder cung cấp công cụ trực quan Vary for Traits để làm việc với Size Class. Nhà phát triển chọn tổ hợp mong muốn (chiều rộng và chiều cao) và Interface Builder hiển thị xem trước màn hình cho tổ hợp đó. Tất cả các thay đổi về ràng buộc, kích thước, phông chữ và khả năng hiển thị được thực hiện trong chế độ này chỉ áp dụng cho Size Class đã chọn. Thoát khỏi chế độ sẽ lưu cài đặt. Cách tiếp cận này thay thế nhu cầu viết mã thích ứng cho các thiết bị khác nhau.
Để cấu hình Size Class trong Interface Builder, nhà phát triển mở storyboard, chọn view controller và nhấp vào nút Vary for Traits ở bảng dưới cùng. Sau đó chọn Width (Compact, Regular hoặc Any) và Height (Compact, Regular hoặc Any). Giao diện chuyển sang chế độ chỉnh sửa cho tổ hợp đã chọn. Tất cả thay đổi ràng buộc, thêm hoặc xóa phần tử chỉ áp dụng cho tổ hợp này. Sau khi hoàn tất thiết lập, nhà phát triển thoát khỏi chế độ — các thay đổi được lưu cho tổ hợp Size Class cụ thể.
Apple khuyên bắt đầu với bố cục cơ bản cho wAny hAny (tổ hợp cơ bản bao phủ tất cả thiết bị). Sau đó tinh chỉnh bố cục cho các tổ hợp có vấn đề: wCompact hRegular (iPhone dọc) và wRegular hRegular (iPad). Không nên cấu hình mọi tổ hợp — chỉ những tổ hợp nơi bố cục bị hỏng. Cấu hình quá mức làm phức tạp việc bảo trì. Để điều chỉnh phông chữ chính xác, hãy sử dụng Dynamic Type thay vì Size Class: phông chữ tự động thích ứng với kích thước màn hình.
UITraitCollection là một lớp iOS chứa Size Class hiện tại và các đặc điểm môi trường khác (force touch, tỷ lệ màn hình, ngữ cảnh giao diện người dùng). Mỗi UIView và UIViewController có traitCollection riêng, kế thừa từ cha. Nhà phát triển lấy Size Class qua traitCollection.horizontalSizeClass và traitCollection.verticalSizeClass, trả về UIUserInterfaceSizeClass (.compact, .regular hoặc .unspecified). Các thay đổi Size Class được theo dõi bằng cách ghi đè traitCollectionDidChange.
Xem xét một ví dụ về thích ứng bố cục UICollectionView với Size Class. Trên iPad (wRegular hRegular) sử dụng UICollectionViewCompositionalLayout với hai cột, trên iPhone (wCompact hRegular) — với một cột. Mã kiểm tra Size Class ngang và chọn bố cục phù hợp. Khi xoay hoặc chuyển sang Split View, iOS gọi traitCollectionDidChange và bộ điều khiển chuyển đổi bố cục với hiệu ứng.
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
if traitCollection.horizontalSizeClass == .Compact {
collectionView.collectionViewLayout = SingleColumnLayout()
} else {
collectionView.collectionViewLayout = DoubleColumnLayout()
}
}
Phương thức traitCollectionDidChange được gọi khi bất kỳ thay đổi Size Class nào: xoay thiết bị, vào/ra Split View, kết nối màn hình ngoài. Trong phương thức này, nhà phát triển cập nhật bố cục, tải lại bộ sưu tập, cập nhật ưu tiên ràng buộc hoặc thay đổi khả năng hiển thị phần tử. Điều quan trọng là kiểm tra xem Size Class có thực sự thay đổi hay không, không phải đặc điểm khác: so sánh traitCollection.horizontalSizeClass với previousTraitCollection?.horizontalSizeClass. Tối ưu hóa ngăn chặn việc vẽ lại không cần thiết khi force touch hoặc tỷ lệ màn hình thay đổi.
Các thiết bị Apple khác nhau có tổ hợp Size Class khác nhau và nhà phát triển phải tính đến các đặc điểm này. iPhone ở hướng dọc — wCompact hRegular, ở hướng ngang — phụ thuộc vào mẫu: iPhone SE/6/7/8 (wCompact hCompact), iPhone X và mới hơn (wCompact hCompact hoặc wCompact hRegular tùy theo nội dung). iPad ở chế độ toàn màn hình — wRegular hRegular, trong Split View — có thể là wCompact hRegular (1/3 màn hình) hoặc wRegular hRegular (2/3 màn hình). Mac Catalyst — luôn wRegular hRegular.
Trên iPhone, Size Class ổn định cho hầu hết các mẫu, nhưng có sắc thái. iPhone Plus (6+, 7+, 8+) và Max (X, XS, 11 Pro, 13–16 Pro Max) ở hướng ngang có wRegular hCompact — giống iPad mini. Điều này cho phép đặt nội dung trên hai cột trên iPhone lớn ở hướng ngang. iPhone SE (thế hệ 1–3) ở hướng ngang — wCompact hCompact. Size Class dọc trên tất cả iPhone ở hướng dọc là Regular, ngoại trừ iPhone SE ở hướng ngang nơi nó là Compact. Ngang luôn là Compact cho hướng dọc và ngang (trừ Plus/Max ở hướng ngang).
iPad ở chế độ toàn màn hình — wRegular hRegular, cung cấp tính linh hoạt bố cục tối đa. Trong Split View, hành vi thay đổi: nếu ứng dụng chiếm 1/3 màn hình (Slide Over hoặc Split ở 1/3), Size Class ngang trở thành Compact, mặc dù dọc vẫn là Regular. Ở 2/3 màn hình — wRegular hRegular. Nhà phát triển nên kiểm tra giao diện ở tất cả các chế độ Split View, vì Size Class thay đổi động. Apple khuyên sử dụng Size Class cùng với UISplitViewController để có hành vi nhất quán trên iPad.
Câu hỏi thường gặp
Size Class là hệ thống rời rạc với 4 tổ hợp, trong khi điểm ngắt CSS là hệ thống liên tục với số lượng điểm tùy ý. Size Class trừu tượng hóa khỏi kích thước màn hình cụ thể, nhóm thiết bị theo hành vi. Điểm ngắt CSS gắn với pixel, Size Class — gắn với danh mục logic Compact/Regular.
iPhone Plus/Max ở hướng ngang có chiều rộng màn hình đủ để hiển thị nội dung trên hai cột (giống iPad mini). Apple gán ngang là Regular để nhà phát triển có thể sử dụng bố cục nhiều cột mà không cần kiểm tra bổ sung. Đây là ngoại lệ cho quy tắc Compact trên iPhone.
Size Class được iOS xác định dựa trên đặc tính thực tế của thiết bị và không thể thay đổi từ mã ứng dụng. Nhà phát triển chỉ có thể phản ứng với giá trị hiện tại. Giao diện hệ thống có thể ghi đè Size Class cho các phần tử hệ thống, nhưng trong ứng dụng điều này là không thể.
SwiftUI không sử dụng Size Class trực tiếp — thay vào đó, nhà phát triển sử dụng bộ điều chỉnh @Environment(\.horizontalSizeClass) để đọc giá trị hiện tại. SwiftUI cung cấp các công cụ cấp cao hơn: Size Classes và AnyLayout với giao thức Layout cho bố cục thích ứng.
Có, khi kết nối màn hình ngoài qua Stage Manager hoặc Sidecar, iOS cập nhật Size Class. Màn hình ngoài thường nhận wRegular hRegular, trong khi màn hình chính giữ Size Class của nó. traitCollectionDidChange được gọi cho các cửa sổ trên mỗi màn hình một cách độc lập.
Tổng kết
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.
Đọc thêm