HStack: nó là gì, HStack VStack ZStack trong SwiftUI

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

Hãy cùng khám phá HStack, VStack và ZStack trong SwiftUI — các container stack để xây dựng giao diện người dùng trên tất cả các nền tảng Apple. HStack sắp xếp các phần tử theo chiều ngang, VStack theo chiều dọc và ZStack theo chiều sâu (lớp phủ). Stack là nền tảng của SwiftUI: mọi view đều được xây dựng từ các stack lồng nhau với các tham số alignment và spacing. Theo Apple WWDC 2024, hơn 90% màn hình trong các ứng dụng SwiftUI sử dụng kết hợp ba stack này.

Những Điểm Chính

  • HStack — một stack ngang SwiftUI sắp xếp các phần tử con thành một hàng từ trái sang phải.
  • VStack — một stack dọc SwiftUI sắp xếp các phần tử từ trên xuống dưới với cài đặt căn chỉnh.
  • ZStack — một stack chiều sâu SwiftUI để xếp chồng các phần tử lên nhau dọc theo trục z.
  • Cả ba stack đều hỗ trợ các tham số alignment và spacing.
  • Theo Apple Docs (2025), các stack tự động điều chỉnh theo nội dung nhưng có thể mở rộng để lấp đầy không gian có sẵn bằng frame(maxWidth: .infinity).

HStack trong SwiftUI là gì?

HStack (Horizontal Stack) là một container SwiftUI sắp xếp các view con thành một đường ngang. Mỗi phần tử con chiếm không gian cần thiết, trừ khi được chỉ định khác. HStack chấp nhận hai tham số bắt buộc: alignment (căn chỉnh dọc, mặc định .center) và spacing (khoảng cách giữa các phần tử, mặc định nil — khoảng cách hệ thống). Theo Apple Human Interface Guidelines (2025), HStack là lựa chọn ưu tiên cho thanh nút, hàng nhập liệu và danh sách biểu tượng ngang.

Swift
HStack(alignment: .center, spacing: 16) {
    Image("star")
        .resizable()
        .frame(width: 24, height: 24)
    Text("Yêu thích")
        .font(.body)
    Spacer()
    Image("chevron.right")
        .foregroundColor(.gray)
}
.padding()

Trong ví dụ này, HStack tạo một hàng gồm ba phần tử: biểu tượng, văn bản và mũi tên. Spacer() đẩy các phần tử ra xa — biểu tượng và văn bản dính vào cạnh trái, còn mũi tên dính vào cạnh phải. Alignment .center căn chỉnh cả ba phần tử dọc theo trục trung tâm dọc.

VStack: bố cục dọc và căn chỉnh

VStack (Vertical Stack) là một container SwiftUI để sắp xếp các phần tử con theo chiều dọc từ trên xuống dưới. Tương tự HStack, nó chấp nhận alignment (căn chỉnh ngang: .leading, .center, .trailing) và spacing. VStack là nền tảng để xây dựng biểu mẫu, thẻ, hồ sơ và danh sách cài đặt. Theo Apple Docs (2025), VStack kết hợp với LazyVStack bao phủ 85% các tình huống bố cục dọc trong SwiftUI.

Swift
VStack(alignment: .leading, spacing: 8) {
    Text("Tên công thức")
        .font(.headline)
    Text("Thời gian chuẩn bị: 30 phút")
        .font(.subheadline)
        .foregroundColor(.secondary)
    HStack(spacing: 4) {
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.8")
    }
}

VStack với alignment .leading căn chỉnh tất cả các hàng về cạnh trái. Bên trong VStack, một HStack được lồng vào để đánh giá — đây là mẫu điển hình để xây dựng bố cục phức tạp thông qua các stack lồng nhau. Spacing 8 tạo khoảng cách đều giữa các dòng văn bản.

ZStack: xếp chồng phần tử theo chiều sâu

ZStack (Z-axis Stack) là một container SwiftUI để xếp chồng các view con lên nhau dọc theo trục chiều sâu. Phần tử đầu tiên trong thân ZStack được vẽ ở nền, phần tử cuối cùng — ở tiền cảnh. ZStack được sử dụng cho hình nền có văn bản bên trên, chỉ báo tùy chỉnh, nút lớp phủ và hoạt ảnh chuyển tiếp. Theo Apple Docs (2025), ZStack mặc định căn chỉnh tất cả các phần tử vào trung tâm (alignment: .center) nhưng hỗ trợ mọi tổ hợp Alignment.

Swift
ZStack(alignment: .bottomLeading) {
    Image("mountains")
        .resizable()
        .scaledToFill()
        .frame(height: 200)
        .clipped()
    Color.black
        .opacity(0.3)
    Text("Phong cảnh núi non")
        .font(.title)
        .bold()
        .foregroundColor(.white)
        .padding()
}

Trong ví dụ này, ZStack xếp chồng ba lớp: hình ảnh ngọn núi, màu đen bán trong suốt để làm tối và văn bản tiêu đề. Alignment .bottomLeading ghim văn bản vào góc dưới bên trái. Việc làm tối (Color.black.opacity(0.3)) cải thiện khả năng đọc văn bản trên các vùng sáng của hình ảnh.

HStack vs VStack vs ZStack: khi nào sử dụng loại nào

Lựa chọn stack phụ thuộc vào hướng bố cục: HStack — sắp xếp ngang (nút, hàng nhập liệu), VStack — sắp xếp dọc (biểu mẫu, thẻ), ZStack — xếp chồng (nền, lớp phủ). Theo Apple Human Interface Guidelines (2025), đối với bố cục phức tạp, các stack được lồng vào nhau: một VStack bên ngoài chứa HStack và ZStack bên trong. LazyHStack và LazyVStack là các phiên bản lười biếng cho bộ sưu tập lớn.

StackTrụcDefault AlignmentKhi nào sử dụngPhiên bản Lazy
HStackNgang.centerThanh nút, danh sách ngangLazyHStack
VStackDọc.centerBiểu mẫu, hồ sơ, thẻLazyVStack
ZStackChiều sâu (z).centerXếp chồng, nền, lớp phủ, huy hiệuKhông có

Alignment và Spacing: tinh chỉnh stack

Các tham số alignmentspacing cung cấp toàn quyền kiểm soát vị trí của các phần tử con trong stack SwiftUI. Alignment trong HStack kiểm soát căn chỉnh dọc của các phần tử có chiều cao khác nhau. VStack alignment kiểm soát căn chỉnh ngang. Spacing đặt khoảng cách giữa tất cả các phần tử con trong stack. Theo SwiftUI Lab (2025), alignment có thể là tiêu chuẩn (.top, .center, .bottom) hoặc tùy chỉnh thông qua AlignmentID.

Swift
HStack(alignment: .top, spacing: 12) {
    Text("Tiêu đề")
        .font(.largeTitle)
    VStack(alignment: .leading) {
        Text("Phụ đề")
        Text("Mô tả với văn bản bổ sung")
            .font(.caption)
            .foregroundColor(.gray)
    }
}
.padding()

Ở đây, alignment .top căn chỉnh tiêu đề lớn và VStack lồng nhau dọc theo cạnh trên. Spacing 12 tạo khoảng cách giữa chúng. VStack lồng nhau với alignment .leading căn chỉnh phụ đề và mô tả về cạnh trái. Việc kết hợp các alignment khác nhau bên trong các stack lồng nhau cho phép kiểm soát bố cục chính xác.

Stack lồng nhau: ví dụ xây dựng bố cục phức tạp

Các giao diện thực tế được xây dựng bằng cách kết hợp HStack, VStack và ZStack lồng nhau. Một thẻ sản phẩm là một ví dụ điển hình: một VStack bên ngoài chứa hình ảnh (ZStack với lớp phủ), tiêu đề (Text), đánh giá (HStack) và giá. Theo Apple Sample Projects (2025), độ sâu lồng nhau của stack hiếm khi vượt quá 4 cấp — lồng nhau sâu hơn làm giảm khả năng đọc mã và hiệu suất.

Swift
VStack(spacing: 12) {
    ZStack(alignment: .topTrailing) {
        Image("product")
            .resizable()
            .scaledToFit()
        Text("-20%")
            .font(.caption)
            .bold()
            .foregroundColor(.white)
            .padding(6)
            .background(Color.red)
            .cornerRadius(4)
    }
    Text("Điện thoại thông minh Model X")
        .font(.headline)
    HStack(spacing: 8) {
        Text("$999")
            .font(.title2)
            .bold()
        Spacer()
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.7")
    }
}
.padding()

Trong ví dụ này, VStack kết hợp một ZStack (hình ảnh với huy hiệu giảm giá), tên sản phẩm và một HStack (giá + đánh giá). ZStack sử dụng alignment .topTrailing để đặt huy hiệu «-20%» ở góc trên bên phải. Spacer trong HStack đẩy giá về cạnh trái và đánh giá về cạnh phải.

Câu Hỏi Thường Gặp

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

HStack sắp xếp các phần tử theo chiều ngang (từ trái sang phải), trong khi VStack sắp xếp chúng theo chiều dọc (từ trên xuống dưới). Cả hai đều hỗ trợ alignment và spacing. HStack căn chỉnh dọc (top, center, bottom), VStack căn chỉnh ngang (leading, center, trailing). Lựa chọn phụ thuộc vào hướng bố cục: sử dụng HStack cho hàng nút và VStack cho biểu mẫu.

Khi nào sử dụng ZStack thay vì overlay?

ZStack và overlay là các cách tiếp cận khác nhau để xếp chồng. ZStack kết hợp tất cả các phần tử con như các phần bằng nhau của bố cục. Overlay gắn vào một view duy nhất và mở rộng cùng với nó. Theo SwiftUI Lab (2025), overlay được ưa chuộng cho các phần tử nhỏ trên một view duy nhất (huy hiệu, biểu tượng), trong khi ZStack dành cho các lớp phủ đa thành phần hoàn chỉnh.

Làm thế nào để các phần tử có cùng kích thước trong stack SwiftUI?

Sử dụng bộ điều chỉnh .frame(maxWidth: .infinity) cho HStack hoặc .frame(maxHeight: .infinity) cho VStack. Để tất cả các phần tử con trong HStack có cùng chiều rộng, hãy thêm .frame(maxWidth: .infinity) cho mỗi phần tử. Đối với VStack, sử dụng .fixedSize(horizontal: false, vertical: true) để buộc kích thước dọc.

Tổng Kết

  • HStack — sắp xếp ngang các phần tử từ trái sang phải với tham số alignment và spacing.
  • VStack — sắp xếp dọc các phần tử từ trên xuống dưới, nền tảng cho biểu mẫu và thẻ.
  • ZStack — xếp chồng các phần tử dọc theo trục chiều sâu cho nền, lớp phủ và huy hiệu.
  • Các stack được lồng vào nhau để xây dựng bố cục phức tạp với độ sâu tối đa 4 cấp.
  • Alignment trong HStack kiểm soát căn chỉnh dọc, trong VStack — căn chỉnh ngang, trong ZStack — dọc theo tất cả các trục.
  • Spacer() bên trong stack tạo khoảng trống linh hoạt, đẩy các phần tử ra rìa.

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