تغيير لون الأيقونات في iOS وWatchKit: tintColor للمبتدئين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا لا تريد الأيقونات تغيير لونها؟ التعرف على tintColor

\n\n

تخيل: أنت تكتب تطبيقًا لـ iPhone أو Apple Watch. صمم المصمم مجموعة جميلة من الأيقونات السوداء. تضعها في UIImageView، وتطبق tintColor — ولا يحدث شيء. تظل الأيقونة سوداء كما كانت. هل هذا مألوف؟ هذا السؤال هو أحد أكثر الأسئلة شيوعًا على Stack Overflow، واليوم سنقوم بتحليله على المستوى الجزيئي.

\n\n

المشكلة هي أن tintColor يعمل فقط مع الصور الموجودة في وضع Template Image. إذا قمت ببساطة بتعيين لون لصورة عادية (Original Image)، سيتجاهل النظام طلبك. دعنا نتعلم كيفية التحكم في هذه الآلية.

\n\n

ما هو Template Image وما الغرض منه؟

\n\n

في iOS وWatchKit، تنقسم جميع الصور إلى نوعين:

\n
    \n
  • Original Image — صورة عادية بكل ألوانها. لا يمكن تلوينها عبر tintColor.
  • \n
  • Template Image — صورة حيث يعتبر اللون هو قناة ألفا (الشفافية) فقط. تصبح جميع البكسلات المرئية "فارغة" — وهي جاهزة لقبول أي لون تحدده.
  • \n
\n\n

عند تطبيق tintColor على Template Image، يقوم النظام بتعبئة جميع المناطق غير الشفافة باللون المحدد. هذا مثالي للأيقونات والأزرار وعناصر الواجهة التي يجب أن تتكيف مع سمة التطبيق.

\n\n

طرق تغيير tintColor في iOS (Swift)

\n\n

1. أسهل طريقة: عبر Interface Builder

\n

إذا كنت تعمل في Storyboard أو XIB:

\n
    \n
  1. اختر UIImageView أو UIButton الخاص بك.
  2. \n
  3. في مفتش الخصائص، ابحث عن حقل Render Mode.
  4. \n
  5. اضبطه على Template Image.
  6. \n
  7. الآن ستعمل خاصية Tint في المفتش.
  8. \n
\n\n

2. الطريقة البرمجية: كود Swift

\n

إليك كيفية القيام بذلك بشكل صحيح:

\n\n
// تحميل الصورة\nlet originalImage = UIImage(named: "myIcon")\n\n// تحويلها إلى Template\nlet templateImage = originalImage?.withRenderingMode(.alwaysTemplate)\n\n// تطبيقها على UIImageView\nimageView.image = templateImage\nimageView.tintColor = UIColor.systemBlue
\n\n

الطريقة الأساسية هي withRenderingMode(.alwaysTemplate). تقول للنظام: "لا تهتم بالألوان الأصلية، سأقوم بتلوينها بنفسي".

\n\n

3. تغيير اللون لـ UIButton

\n

بالنسبة للأزرار، العملية مشابهة ولكن هناك فارق بسيط:

\n\n
button.setImage(UIImage(named: "heart")?.withRenderingMode(.alwaysTemplate), for: .normal)\nbutton.tintColor = UIColor.red
\n\n

لاحظ: نحن نطبق withRenderingMode مباشرة على الصورة التي نضبطها للزر.

\n\n

خصائص tintColor في WatchKit

\n

تطوير Apple Watch له قيوده الخاصة. في WatchKit لا يوجد UIImageView — بدلاً من ذلك يُستخدم WKInterfaceImage. وهنا يعمل tintColor بشكل مختلف.

\n\n

النهج الصحيح لـ WatchKit

\n
// في InterfaceController.swift\n@IBOutlet weak var watchImage: WKInterfaceImage!\n\noverride func awake(withContext context: Any?) {\n    super.awake(withContext: context)\n    \n    // تعيين الصورة\n    watchImage.setImage(UIImage(named: "watchIcon"))\n    \n    // تطبيق اللون\n    watchImage.setTintColor(UIColor.green)\n}
\n\n

هام: الطريقة تُسمى setTintColor(_:)، وليس مجرد tintColor. ونعم، يجب أن تكون الصورة بتنسيق Template Image. في WatchKit يتم ذلك عبر السمة Render As في كتالوج الأصول.

\n\n

مثال عملي: إنشاء أيقونة متكيفة

\n

دعنا نجمع كل شيء معًا. لنفترض أن لدينا تطبيقًا مع تبديل بين السمة الداكنة والفاتحة. يجب أن تغير أيقونة الإعدادات لونها حسب السمة.

\n\n
class SettingsView                

المدونات

توصيات الكتب