Canvas هو محرر معاينة تفاعلي في Xcode يعرض SwiftUI View في الوقت الفعلي دون تشغيل المحاكي. يتم تحديث Canvas تلقائياً مع كل تغيير في الكود ويدعم الإيماءات والتنقل والوضع الداكن. وفقاً لوثائق Apple Developer Documentation (2026)، يستخدم Canvas عملية عرض منفصلة PreviewProviderExtension، مما يتيح تحرير الكود ورؤية النتيجة فوراً دون إعادة ترجمة المشروع بالكامل. اقرأ المزيد عن SwiftUI في مقالة SwiftUI.
الخلاصة
Canvas هو محرر معاينة مدمج في Xcode، تم تقديمه لأول مرة في Xcode 11 مع SwiftUI. يقع في اللوحة اليمنى للمحرر بجانب الكود ويعرض معاينة حية لـ SwiftUI View الحالية. يعمل Canvas في الوقت الفعلي: كل تغيير في الكود ينعكس فوراً على المعاينة دون إعادة ترجمة يدوية.
من الناحية المعمارية، Canvas هو عملية منفصلة (Preview Provider Extension) يقوم Xcode بتشغيلها عند فتح Canvas. تقوم العملية بتحميل PreviewProvider المُجمَّع، وتعرض النتيجة عبر Metal، وتعرضها في لوحة المحرر. إذا لم يتم تنفيذ PreviewProvider، يعرض Canvas رسالة “Preview paused — No preview provider found”.
واجهة Canvas تتضمن شريط أدوات مع اختيار الجهاز والاتجاه ونظام الألوان والمقياس. تقوم أزرار Live Preview و Selectable و Embed In Diagram بتبديل أوضاع التفاعل. يدعم Canvas العرض المقسم: يمكن فتح عدة Canvas لملفات مختلفة في نفس مساحة العمل.
| عنصر Canvas | الغرض |
|---|---|
| محدد الجهاز | اختيار جهاز للمعاينة (iPhone, iPad, Apple Watch) |
| تبديل الاتجاه | التبديل بين الوضع الرأسي/الأفقي (iOS, iPadOS) |
| نظام الألوان | السمة الفاتحة/الداكنة |
| شريط تمرير Dynamic Type | مقياس الخط لاختبار إمكانية الوصول |
| Live Preview | الوضع التفاعلي مع دعم الإيماءات |
| الوضع القابل للتحديد | فحص عناصر الواجهة |
Live Preview هي الميزة الرئيسية لـ Canvas التي تجعل المعاينات تفاعلية. في هذا الوضع، يقوم Canvas بعرض View في عملية منفصلة ويمرر الإيماءات (النقر، التمرير، السحب) مرة أخرى إلى بيئة تشغيل SwiftUI. يمكن للمستخدم الضغط على الأزرار وملء حقول النص واختبار التنقل دون تشغيل المحاكي.
SwiftUI يعالج الإيماءات في Canvas من خلال نفس نظام الأحداث الموجود على الجهاز الحقيقي. الفرق في الأداء: يستخدم Canvas العرض عبر البرنامج من خلال Metal، بينما يستخدم المحاكي رسومات المضيف. هذا يعني أن الرسوم المتحركة المعقدة في Canvas قد تعمل بشكل أبطأ أو تظهر بشكل مختلف بصرياً.
تحديث Canvas يحدث على ثلاث مراحل. أولاً، يكتشف Xcode تغيير الملف ويقوم بتجميع PreviewProvider المُعدَّل فقط بشكل تدريجي. ثم يتم تحميل الوحدة الثنائية الجديدة في عملية PreviewProviderExtension. أخيراً، يعيد SwiftUI إنشاء View ويقوم بعرضها عبر Metal. تستغرق الدورة بأكملها من 0.5 إلى 2 ثانية اعتماداً على تعقيد View.
struct TappableButton: View {
@State private var count = 0
var body: some View {
Button("Tapped \(count) times") {
count += 1
}
.buttonStyle(.borderedProminent)
}
}
struct TappableButton_Previews: PreviewProvider {
static var previews: some View {
TappableButton()
}
}
التفاعلية: عند تشغيل Live Preview، يعمل الزر في Canvas كزر حقيقي — يزداد العداد مع كل نقرة، وتظهر حركة الضغط. هذا يتيح اختبار منطق الأزرار دون المحاكي.
الإعدادات الأساسية لـ Canvas متاحة من خلال قائمة Editor → Canvas أو من خلال أزرار شريط أدوات Canvas. تشمل الخيارات الرئيسية اختيار الجهاز والاتجاه والسمة الداكنة ومقياس Dynamic Type. للإعدادات الدائمة، استخدم معدّلات PreviewProvider في الكود.
الإعدادات المتقدمة تشمل: Auto Activate Preview — التنشيط التلقائي لـ Canvas عند فتح ملف SwiftUI؛ Live Preview — وضع الإيماءات؛ Draw Live Edges — عرض حدود العرض؛ Show Preview Sizes — حجم منطقة المعاينة. يحفظ Xcode هذه الإعدادات بشكل محمول في ملفات مساحة العمل/المشروع.
الإعداد البرمجي يمنح تحكماً أكثر دقة في Canvas. المعدّلات المطبقة في المعاينات تتجاوز إعدادات شريط الأدوات ويتم حفظها في الكود — يراها جميع أعضاء الفريق عبر git.
struct SettingsView_Previews: PreviewProvider {
static var previews: some View {
SettingsView()
.previewDevice("iPhone 16 Pro")
.previewLayout(.device)
.preferredColorScheme(.dark)
.dynamicTypeSize(.xxxLarge)
.previewDisplayName("Dark + XL Text")
}
}
previewLayout مع .device يعرض شاشة الجهاز بالكامل، بينما .sizeThatFits يعرض معاينة مضغوطة بحجم يتناسب مع المحتوى. للعناصر الصغيرة والمكونات الصغرى، استخدم .sizeThatFits — يوفر مساحة في المحرر.
مثال 1: اختبار التكيف. استخدم ForEach مع أجهزة متعددة وأنظمة ألوان للتأكد من أن الواجهة تبدو جيدة على جميع الشاشات. يقوم Canvas بتحديث جميع المعاينات في وقت واحد، مما يتيح اكتشاف مشكلات التخطيط قبل تشغيل المحاكي.
مثال 2: معاينة مع بيانات. لـ Views التي تعرض محتوى ديناميكياً (قوائم، ملفات شخصية، بطاقات)، قم بإنشاء عدة نسخ ببيانات مختلفة في المعاينات. هذا أسرع من التبديل بين الشاشات في المحاكي وإدخال البيانات.
مجموعة المعاينات عبر Group أو ForEach تتيح عرض جميع حالات المكون في لوحة واحدة. بالنسبة للقوائم، هذا مناسب بشكل خاص: القائمة الفارغة، التحميل، الخطأ، والقائمة الممتلئة مرئية في وقت واحد.
struct LoadingStateView: View {
let state: LoadingState
var body: some View {
switch state {
case .loading:
ProgressView()
case .loaded(let items):
List(items, id: \.self) { Text($0) }
case .error(let message):
Text(message).foregroundColor(.red)
}
}
}
struct LoadingStateView_Previews: PreviewProvider {
static var previews: some View {
Group {
LoadingStateView(state: .loading)
.previewDisplayName("Loading")
LoadingStateView(state: .loaded(["Item 1", "Item 2"]))
.previewDisplayName("Loaded")
LoadingStateView(state: .error("Failed to load"))
.previewDisplayName("Error")
}
}
}
Canvas والمحاكي يكملان بعضهما البعض، بدلاً من أن يحل أحدهما محل الآخر. Canvas مثالي للتكرار السريع أثناء التصميم: تحرير الكود مع ردود فعل فورية. المحاكي ضروري للتحقق النهائي: الأداء الحقيقي، الإيماءات المخصصة، تنبيهات النظام، والتكامل مع وظائف الأجهزة (الكاميرا، أجهزة الاستشعار).
وفقاً لمؤتمر WWDC 2024، تضع Apple Canvas كأداة للمراحل المبكرة من التطوير، والمحاكي لاختبارات التكامل. يُوصى بقضاء 60% من وقت تطوير واجهة المستخدم في Canvas و 40% — للاختبار على المحاكي أو الجهاز.
| الخاصية | Canvas | المحاكي |
|---|---|---|
| سرعة التحديث | 0.5–2 ثانية (تدريجي) | 10–60 ثانية (بناء كامل) |
| الإيماءات | أساسية (نقر، تمرير) | الكل (قرص، تدوير، لمس ثلاثي الأبعاد) |
| الكاميرا/الجيروسكوب | غير مدعومة | محاكاة |
| الرسوم المتحركة | محدودة | كاملة |
| إشعارات الدفع | غير مدعومة | مدعومة |
| الشبكة | عبر عملية Xcode | مكدس شبكة كامل |
توصية: صمم في Canvas، واختبر على المحاكي. استخدم Live Preview لمنطق الإيماءات للأزرار والتنقل، لكن الاختبارات النهائية للرسوم المتحركة وطلبات الشبكة ووظائف الأجهزة يجب أن تتم على المحاكي أو جهاز حقيقي.
نصيحة 1: استخدم الوضع القابل للتحديد. في الوضع القابل للتحديد (أيقونة المؤشر)، يمكنك النقر على أي عنصر في المعاينة ورؤية تسلسله الهرمي ومعدّلاته وإطاره في المفتش. هذا مفيد لتصحيح التخطيط: ترى فوراً الحشوة والإزاحة وحجم العنصر دون طباعة.
نصيحة 2: Embed In Diagram. يمكن لـ Canvas تجميع العناصر: حدد اثنتين أو أكثر من Views، انقر على Embed In Diagram — سيقوم Canvas بإنشاء VStack/HStack/ZStack وإعادة بناء الكود تلقائياً. هذا يسرع إنشاء التسلسل الهرمي المعقد دون كتابة الأقواس يدوياً.
نصيحة 3: مسح ذاكرة التخزين المؤقت لمعاينة Canvas. إذا توقف Canvas عن التحديث، امسح Product → Preview Cache. سيقوم Xcode بحذف ملفات PreviewProvider الثنائية المخزنة مؤقتاً وإعادة بنائها من الصفر. هذا يحل 90% من مشاكل تجميد Canvas.
Canvas البطيء يحدث عادة بسبب العدد الزائد من المعاينات. لـ Views المعقدة، استخدم معاينة واحدة فقط بدلاً من مجموعة من 6–8. أوقف تشغيل Live Preview لـ Views بدون إيماءات — الوضع الثابت يعرض بشكل أسرع. تأكد من أن PreviewProvider يستخدم بيانات وهمية بدلاً من طلبات الشبكة الحقيقية.
// Quick debug: minimal preview
struct ComplexView_Previews: PreviewProvider {
static var previews: some View {
ComplexView()
.previewLayout(.sizeThatFits) // compact mode
}
}
previewLayout(.sizeThatFits) هو أسرع وضع في Canvas لأنه يعرض محتوى View فقط بدون حدود الجهاز. استخدمه للتصميم اليومي، وقم بتشغيل .device فقط للفحوصات النهائية.
الأسئلة الشائعة
السبب الأكثر شيوعاً هو عدم وجود PreviewProvider لـ View الحالية. يتطلب Canvas تنفيذ بروتوكول PreviewProvider مع إرجاع View في خاصية previews. أسباب أخرى: خطأ في الترجمة في الكود، مشاكل مع DerivedData أو عدم بدء تشغيل عملية PreviewProviderExtension.
نعم، يدعم Xcode تصحيح أخطاء المعاينة من خلال Product → Preview → Debug Preview. بعد التنشيط، سيتم تنشيط نقطة التوقف في كود View عند عرض Canvas. هذا يتيح تحليل قيم المتغيرات في وقت التشغيل والتحقق من منطق العرض.
يدعم Canvas مكونات UIKit من خلال UIViewRepresentable و UIViewControllerRepresentable. ومع ذلك، لا يتم عرض بعض المكونات: MapKit, WebView, الفيديو عبر AVPlayer, وعروض Metal/GLKit المخصصة. لا يقوم Canvas بمحاكاة إمكانيات الأجهزة، لذا فإن الكاميرا وأجهزة الاستشعار غير متاحة.
قلل عدد المعاينات في Group (بحد أقصى 3–4)، استخدم previewLayout(.sizeThatFits) بدلاً من .device، أوقف Live Preview لـ Views بدون إيماءات. امسح Product → Preview Cache. تأكد من أن PreviewProvider لا يقوم بطلبات شبكة — استخدم بيانات وهمية.
لا يؤثر Canvas على حجم IPA النهائي — يتم ترجمة كود PreviewProvider فقط في تكوين Debug. أثناء التطوير، يضيف Canvas ما يصل إلى 100–200 ميجابايت من ذاكرة التخزين المؤقت في DerivedData، والتي تتم إدارتها تلقائياً بواسطة Xcode. يؤدي التنظيف المنتظم لـ DerivedData إلى تحرير المساحة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.