HStack: چیست، HStack VStack ZStack در SwiftUI

نویسنده: IT Sectr منتشر شده: 2026-02-24 زمان مطالعه: 7 دقیقه

بررسی می‌کنیم که HStack، VStack و ZStack در SwiftUI چیست — کانتینرهای استک برای ساخت رابط‌های کاربری در تمام پلتفرم‌های Apple. HStack عناصر را به صورت افقی، VStack — عمودی، ZStack — در عمق (روی هم) قرار می‌دهد. استک‌ها اساس SwiftUI هستند: هر نمای از استک‌های تو در تو با پارامترهای alignment و spacing ساخته می‌شود. به گزارش Apple WWDC 2024، بیش از 90٪ صفحه‌ها در اپلیکیشن‌های SwiftUI از ترکیب این سه استک استفاده می‌کنند.

نکات اصلی

  • HStack — استک افقی SwiftUI که عناصر فرزند را در یک ردیف از چپ به راست قرار می‌دهد.
  • VStack — استک عمودی SwiftUI که عناصر را از بالا به پایین با تنظیم تراز قرار می‌دهد.
  • ZStack — استک عمق SwiftUI برای قرار دادن عناصر روی هم در محور Z.
  • هر سه استک از پارامترهای alignment (تراز) و spacing (فاصله بین عناصر) پشتیبانی می‌کنند.
  • به گزارش Apple Docs (2025)، استک‌ها به طور خودکار با محتوا تنظیم می‌شوند، اما می‌توانند با frame(maxWidth: .infinity) در کل فضای موجود کشیده شوند.

HStack در SwiftUI چیست؟

HStack (Horizontal Stack) — کانتینری در SwiftUI است که نماهای فرزند را در یک خط افقی قرار می‌دهد. هر عنصر فرزند به اندازه نیاز خود فضا اشغال می‌کند، مگر اینکه خلاف آن مشخص شود. HStack دو پارامتر اجباری می‌پذیرد: alignment (تراز عمودی، پیش‌فرض .center) و spacing (فاصله بین عناصر، پیش‌فرض nil — فاصله سیستمی). به گزارش Apple Human Interface Guidelines (2025)، HStack انتخاب ارجح برای پنل‌های دکمه، ردیف‌های ورودی و لیست‌های افقی آیکون است.

Swift
HStack(alignment: .center, spacing: 16) {
    Image("star")
        .resizable()
        .frame(width: 24, height: 24)
    Text("علاقه‌مندی‌ها")
        .font(.body)
    Spacer()
    Image("chevron.right")
        .foregroundColor(.gray)
}
.padding()

در این مثال HStack یک ردیف از سه عنصر می‌سازد: آیکون، متن و فلش. Spacer() عناصر را از هم جدا می‌کند — آیکون با متن به لبه چپ و فلش به لبه راست چسبانده می‌شوند. Alignment .center هر سه عنصر را در محور عمودی وسط قرار می‌دهد.

VStack: چیدمان عمودی و تراز

VStack (Vertical Stack) — کانتینری در SwiftUI برای چیدمان عمودی عناصر فرزند از بالا به پایین. مشابه HStack، پارامترهای alignment (تراز افقی: .leading، .center، .trailing) و spacing را می‌پذیرد. VStack اساس ساخت فرم‌ها، کارت‌ها، پروفایل‌ها و لیست تنظیمات است. به گزارش Apple Docs (2025)، VStack همراه با LazyVStack 85٪ سناریوهای چیدمان عمودی در SwiftUI را پوشش می‌دهد.

Swift
VStack(alignment: .leading, spacing: 8) {
    Text("نام دستور غذا")
        .font(.headline)
    Text("زمان آماده‌سازی: 30 دقیقه")
        .font(.subheadline)
        .foregroundColor(.secondary)
    HStack(spacing: 4) {
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.8")
    }
}

VStack با alignment .leading تمام ردیف‌ها را به لبه چپ تراز می‌کند. داخل VStack یک HStack برای امتیاز قرار گرفته است — این یک الگوی معمول ساخت چیدمان‌های پیچیده از طریق استک‌های تودرتو است. Spacing 8 فاصله یکنواختی بین ردیف‌های متن ایجاد می‌کند.

ZStack: قرار دادن عناصر روی هم در عمق

ZStack (Z-axis Stack) — کانتینری در SwiftUI برای قرار دادن نماهای فرزند روی هم در محور عمق. اولین عنصر در بدنه ZStack در پس‌زمینه و آخرین عنصر در پیش‌زمینه رسم می‌شود. ZStack برای تصاویر پس‌زمینه با متن روی آن، نشانگرهای سفارشی، دکمه‌های روی هم و انیمیشن‌های انتقال استفاده می‌شود. به گزارش Apple Docs (2025)، ZStack به طور پیش‌فرض همه عناصر را در مرکز تراز می‌کند (alignment: .center)، اما از هر ترکیبی از Alignment پشتیبانی می‌کند.

Swift
ZStack(alignment: .bottomLeading) {
    Image("mountains")
        .resizable()
        .scaledToFill()
        .frame(height: 200)
        .clipped()
    Color.black
        .opacity(0.3)
    Text("منظره کوهستان")
        .font(.title)
        .bold()
        .foregroundColor(.white)
        .padding()
}

در این مثال ZStack سه لایه را روی هم قرار می‌دهد: تصویر کوهستان، رنگ سیاه نیمه شفاف برای تیره‌کردن و متن با عنوان. Alignment .bottomLeading متن را به گوشه پایین چپ می‌چسباند. تیره‌کردن (Color.black.opacity(0.3)) خوانایی متن را در بخش‌های روشن تصویر بهبود می‌بخشد.

مقایسه HStack، VStack و ZStack: چه زمانی از کدام استفاده کنیم

انتخاب استک به جهت چیدمان بستگی دارد: HStack — چیدمان افقی (دکمه‌ها، ردیف‌های ورودی)، VStack — چیدمان عمودی (فرم‌ها، کارت‌ها)، ZStack — قرار دادن روی هم (پس‌زمینه‌ها، روکش‌ها). به گزارش Apple Human Interface Guidelines (2025)، برای چیدمان‌های پیچیده استک‌ها در یکدیگر قرار می‌گیرند: VStack بیرونی شامل HStack و ZStack در داخل است. LazyHStack و LazyVStack نسخه‌های تنبل برای مجموعه‌های بزرگ هستند.

استکمحورAlignment پیش‌فرضچه زمانی استفاده کنیمنسخه تنبل
HStackافقی.centerردیف دکمه‌ها، لیست‌های افقیLazyHStack
VStackعمودی.centerفرم‌ها، پروفایل‌ها، کارت‌هاLazyVStack
ZStackعمق (z).centerروی هم گذاری، پس‌زمینه، روکش، نشانندارد

Alignment و Spacing: تنظیم دقیق استک‌ها

پارامترهای alignment و spacing کنترل کامل بر قرارگیری عناصر فرزند در استک‌های SwiftUI می‌دهند. Alignment در HStack تراز عمودی عناصر با ارتفاع متفاوت را مدیریت می‌کند. Alignment در VStack تراز افقی را مدیریت می‌کند. Spacing فاصله بین همه عناصر فرزند در استک را تعیین می‌کند. به گزارش SwiftUI Lab (2025)، alignment می‌تواند هم استاندارد (.top، .center، .bottom) و هم سفارشی از طریق AlignmentID باشد.

Swift
HStack(alignment: .top, spacing: 12) {
    Text("عنوان")
        .font(.largeTitle)
    VStack(alignment: .leading) {
        Text("زیرعنوان")
        Text("توضیحات با متن اضافی")
            .font(.caption)
            .foregroundColor(.gray)
    }
}
.padding()

در اینجا alignment .top عنوان بزرگ و VStack تودرتو را به لبه بالایی تراز می‌کند. Spacing 12 فاصله بین آنها ایجاد می‌کند. VStack تودرتو با alignment .leading زیرعنوان و توضیحات را به لبه چپ تراز می‌کند. ترکیب alignment مختلف در داخل استک‌های تودرتو امکان کنترل دقیق چیدمان را فراهم می‌کند.

استک‌های تودرتو: مثال‌هایی از ساخت چیدمان‌های پیچیده

رابط‌های واقعی با ترکیب HStack، VStack و ZStack تودرتو ساخته می‌شوند. کارت محصول — یک مثال معمول: VStack بیرونی شامل تصویر (ZStack با روکش)، عنوان (Text)، امتیاز (HStack) و قیمت است. به گزارش Apple Sample Projects (2025)، عمق تودرتویی استک‌ها به ندرت از ۴ سطح بیشتر می‌شود — تودرتویی عمیق‌تر خوانایی کد و عملکرد را کاهش می‌دهد.

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("Smartfon Model X")
        .font(.headline)
    HStack(spacing: 8) {
        Text("$999")
            .font(.title2)
            .bold()
        Spacer()
        Image("star.fill")
            .foregroundColor(.yellow)
        Text("4.7")
    }
}
.padding()

در این مثال VStack شامل ZStack (تصویر با نشان تخفیف)، نام محصول و HStack (قیمت + امتیاز) است. ZStack از alignment .topTrailing برای قرار دادن نشان «-20%» در گوشه بالا سمت راست استفاده می‌کند. Spacer در HStack قیمت را به لبه چپ و امتیاز را به لبه راست می‌چسباند.

سوالات متداول

تفاوت بین HStack و VStack چیست؟

HStack عناصر را افقی (از چپ به راست) و VStack عمودی (از بالا به پایین) قرار می‌دهد. هر دو از alignment و spacing پشتیبانی می‌کنند. HStack تراز عمودی (top، center، bottom) و VStack تراز افقی (leading، center، trailing) را انجام می‌دهد. انتخاب به جهت چیدمان بستگی دارد: برای ردیف دکمه‌ها از HStack و برای فرم از VStack استفاده کنید.

چه زمانی به جای overlay از ZStack استفاده کنیم؟

ZStack و overlay رویکردهای متفاوتی برای قرار دادن روی هم هستند. ZStack همه عناصر فرزند را به عنوان بخش‌های هم‌ارز چیدمان ترکیب می‌کند. Overlay به یک نما متصل می‌شود و همراه با آن کشیده می‌شود. به گزارش SwiftUI Lab (2025)، overlay برای عناصر کوچک روی یک نما (نشان، آیکون) و ZStack برای روکش‌های کامل چندجزئی مناسب‌تر است.

چگونه عناصر را در استک SwiftUI هم اندازه کنیم؟

از modifier .frame(maxWidth: .infinity) برای HStack یا .frame(maxHeight: .infinity) برای VStack استفاده کنید. برای اینکه همه عناصر فرزند در HStack عرض یکسانی داشته باشند، به هر کدام .frame(maxWidth: .infinity) اضافه کنید. برای VStack — .fixedSize(horizontal: false, vertical: true) برای اندازه اجباری عمودی.

خلاصه

  • HStack — چیدمان افقی عناصر از چپ به راست با پارامترهای alignment و spacing.
  • VStack — چیدمان عمودی عناصر از بالا به پایین، اساس فرم‌ها و کارت‌ها.
  • ZStack — قرار دادن عناصر روی هم در محور عمق برای پس‌زمینه، روکش و نشان.
  • استک‌ها برای ساخت چیدمان‌های پیچیده با حداکثر عمق ۴ سطح در یکدیگر قرار می‌گیرند.
  • Alignment در HStack تراز عمودی، در VStack تراز افقی و در ZStack تراز در همه محورها را کنترل می‌کند.
  • Spacer() در داخل استک‌ها فاصله‌های انعطاف‌پذیر ایجاد می‌کند و عناصر را به لبه‌ها می‌چسباند.

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید