دعنا نستكشف ما هي HStack و VStack و ZStack في SwiftUI — حاويات مكدسة لبناء واجهات المستخدم على جميع منصات Apple. HStack يرتب العناصر أفقيًا، VStack رأسيًا، و ZStack في العمق (تراكب). المكدسات هي أساس SwiftUI: أي عرض يُبنى من مكدسات متداخلة مع معاملات alignment و spacing. وفقًا لـ Apple WWDC 2024، أكثر من 90% من الشاشات في تطبيقات SwiftUI تستخدم مزيجًا من هذه المكدسات الثلاثة.
الخلاصة
HStack (Horizontal Stack) هو حاوية SwiftUI ترتب العروض الفرعية في خط أفقي. كل عنصر فرعي يأخذ المساحة التي يحتاجها، ما لم يُحدد خلاف ذلك. HStack يقبل معاملين إجباريين: alignment (محاذاة رأسية، افتراضيًا .center) و spacing (مسافة بين العناصر، افتراضيًا nil — مسافة النظام). وفقًا لـ Apple Human Interface Guidelines (2025)، HStack هو الخيار المفضل لأشرطة الأزرار وحقول الإدخال والقوائم الأفقية للأيقونات.
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 (Vertical Stack) هو حاوية SwiftUI لترتيب العناصر الفرعية عموديًا من الأعلى إلى الأسفل. مشابهًا لـ HStack، يقبل alignment (محاذاة أفقية: .leading, .center, .trailing) و spacing. VStack هو أساس بناء النماذج والبطاقات والملفات الشخصية وقوائم الإعدادات. وفقًا لـ Apple Docs (2025)، VStack مع LazyVStack يغطي 85% من سيناريوهات التخطيط العمودي في SwiftUI.
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 (Z-axis Stack) هو حاوية SwiftUI لتراكب العروض الفرعية فوق بعضها البعض على طول محور العمق. العنصر الأول في جسم ZStack يُرسم في الخلفية، والأخير — في المقدمة. يستخدم ZStack للصور الخلفية مع نص فوقها، والمؤشرات المخصصة، وأزرار التراكب، ورسوم متحركة للانتقال. وفقًا لـ Apple Docs (2025)، ZStack افتراضيًا يحاذي جميع العناصر إلى المركز (alignment: .center) لكنه يدعم أي توليفات Alignment.
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 — تراكب (خلفيات، تراكبات). وفقًا لـ Apple Human Interface Guidelines (2025)، للتخطيطات المعقدة تُداخل المكدسات داخل بعضها البعض: VStack خارجي يحتوي على HStack و ZStack بالداخل. LazyHStack و LazyVStack هما نسختان كسولتان للمجموعات الكبيرة.
| المكدس | المحور | Default Alignment | متى نستخدم | النسخة الكسولة |
|---|---|---|---|---|
| HStack | أفقي | .center | شريط أزرار، قوائم أفقية | LazyHStack |
| VStack | عمودي | .center | نماذج، ملفات شخصية، بطاقات | LazyVStack |
| ZStack | عمق (z) | .center | تراكب، خلفيات، تراكبات، شارات | لا يوجد |
معاملات alignment و spacing تمنح تحكمًا كاملاً في وضع العناصر الفرعية في مكدسات SwiftUI. Alignment في HStack يتحكم في المحاذاة الرأسية للعناصر ذات الارتفاعات المختلفة. VStack alignment يتحكم في المحاذاة الأفقية. Spacing يحدد المسافة بين جميع العناصر الفرعية في المكدس. وفقًا لـ SwiftUI Lab (2025)، يمكن أن يكون alignment قياسيًا (.top, .center, .bottom) أو مخصصًا عبر AlignmentID.
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 يحاذي العنوان الفرعي والوصف إلى الحافة اليسرى. الجمع بين alignments مختلفة داخل المكدسات المتداخلة يسمح بالتحكم الدقيق في التخطيط.
الواجهات الحقيقية تُبنى من خلال الجمع بين HStack و VStack و ZStack المتداخلة. بطاقة منتج هي مثال نموذجي: VStack خارجي يحتوي على صورة (ZStack مع تراكب)، عنوان (Text)، تقييم (HStack)، وسعر. وفقًا لـ Apple Sample Projects (2025)، عمق تداخل المكدسات نادرًا ما يتجاوز 4 مستويات — التداخل الأعمق يقلل من قراءة الكود والأداء.
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("هاتف ذكي 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 يرتبها عموديًا (من الأعلى إلى الأسفل). كلاهما يدعم alignment و spacing. HStack يحاذي رأسيًا (top, center, bottom)، VStack يحاذي أفقيًا (leading, center, trailing). يعتمد الاختيار على اتجاه التخطيط: استخدم HStack لصفوف الأزرار و VStack للنماذج.
ZStack و overlay هما نهجان مختلفان للتراكب. ZStack يدمج جميع العناصر الفرعية كأجزاء متساوية من التخطيط. overlay يلحق بعرض واحد ويمتد معه. وفقًا لـ SwiftUI Lab (2025)، overlay أفضل للعناصر الصغيرة فوق عرض واحد (شارة، أيقونة)، بينما ZStack للتراكبات الكاملة متعددة المكونات.
استخدم المُعدِّل .frame(maxWidth: .infinity) لـ HStack أو .frame(maxHeight: .infinity) لـ VStack. لجعل جميع العناصر الفرعية في HStack بنفس العرض، أضف .frame(maxWidth: .infinity) لكل منها. لـ VStack، استخدم .fixedSize(horizontal: false, vertical: true) لفرض الحجم الرأسي.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.