Cyborg هو منفذ جزئي لـ Android's VectordRawable إلى iOS. الغرض منه هو بديل ل uiimages وخطوط الأيقونة وخيار صورة ناقلات PDF من Apple. يوفر تنسيق VectordRawable عددًا من المزايا:
يدعم Cyborg أيضًا MacOS (APPKIT) و TVOS ويمكن استخدامه من Swiftui. ومع ذلك ، كن على علم بأن هذه التطبيقات أقل نضجًا حاليًا من إصدار iOS.
قمنا بتقييم Cyborg مع عدد من البدائل ، وقمنا بتحميل أكثر من 50 أيقونات موجودة في مجموعة أيقونة تطبيق برنامج التشغيل لدينا.
UIImage
. يجب أن تكون الاختلافات في كسور المللي ثانية في الممارسةإذا أصبح تحليل الأداء مشكلة ، فقد ترغب في تنفيذ آلية التخزين المؤقت مناسبة لتطبيقك ، أو الاستفادة من سلامة مؤشر ترابط Cyborg لأداء تحليل الخيط الرئيسي.
مع ذلك ، توجد العديد من فرص تحسين الأداء حاليًا ، لذلك يجب أن يتحسن الأداء في المستقبل. اعتبارًا من كتابة هذه السطور ، تعتبر Swift لغة شابة ، وتحسينات الأداء عليها ، لا سيما في إنشاء السلسلة والإغلاق والملكية ، يجب أن يكون لها أيضًا تأثير إيجابي على أداء Cyborg.
يتم تعداد القائمة الكاملة للميزات في وثائق Android.
يدعم Cyborg مدير الحزمة Swift و Carthage.
للتثبيت باستخدام قرطاج:
github "uber/cyborg" ~> [desired version]
لإضافة Cyborg إلى مشروع Xcode باستخدام Swift Package Manager ، اتبع الإرشادات التي قدمتها Apple.
بعد اتباع خطوات التكامل أدناه ، يتطلب استخدام Cyborg رمزًا أكثر بقليل من استخدام UIImage
:
let vectorView = VectorView ( theme : myTheme )
vectorView . drawable = VectorDrawable . named ( " MyDrawable " )
تم تصنيع Cyborg لتوسيع نطاق الحالات المعقدة ، وعلى هذا النحو يتطلب القليل من التكوين للحصول على عينة الكود النظيفة أعلاه.
دعونا نرى كيفية كتابة الحد الأدنى من التكامل للبدء:
واحدة من أفضل ميزات VectordRawables هي القدرة على المبادلة في القيم التعسفية في وقت التشغيل. يمكن أن تؤدي الأصول التي تم تأليفها بشكل جيد إلى تغيير ألوانها استجابةً للتغيرات في حالة التطبيق ، مثل الوضع الليلي.
ومع ذلك ، فإن الوصول إلى هذه الميزات القوية يتطلب منا كتابة موضوعنا ومقدمي الموارد:
class Theme : Cyborg . ThemeProviding {
func colorFromTheme ( named _ : String ) -> UIColor {
return . black
}
}
class Resources : ResourceProviding {
func colorFromResources ( named _ : String ) -> UIColor {
return . black
}
}
على افتراض أن الموارد لا تتغير أبدًا ، يمكننا الآن كتابة المهيمنة الراحة الموضحة في عينة الكود الأول:
fileprivate let resources = Resources ( )
extension VectorDrawable {
public convenience init ( theme : Theme ) {
self . init ( theme : theme , resources : resources ( )
}
}
إذا قمت ، لسبب ما ، بتقديم VectordRawable غير صالح إلى Cyborg ، فإن وظيفة الإنشاء القياسية في Cyborg ستمنحك رسالة خطأ مفصلة يمكنك الإبلاغ عنها كخدمة غير مميتة لخدمة الإبلاغ عن تصادمك من اختيارك واستخدامها لتصحيح الأخطاء محليًا. يمكن التعامل مع هذا على مستوى "النظام الأساسي" في التطبيق الخاص بك ، مما يسمح لك بكتابة رمز يفترض أن التحليل ينجح دائمًا ، تمامًا مثل Uiimage:
extension VectorDrawable {
public static func named ( _ name : String ) -> VectorDrawable ? {
return Bundle . main . url ( forResource : name , withExtension : " xml " ) . flatMap { url in
switch VectorDrawable . create ( from : url ) {
case . ok ( let drawable ) :
return drawable
case . error ( let error ) :
myAssertionFailureThatAlsoReportsToBackend ( " Could not create a vectordrawable named ( name ) ; the error was ( error ) " )
return nil
}
}
}
كما قد تكون قد لاحظت بالفعل ، يتم كتابة كائنات الموضوع والموارد التي كتبتها في قسم سابق. لمنع المشكلات المتعلقة بالأصول التي تشير إلى ألوان السمة أو الموارد غير الموجودة غير الموجودة ، قد ترغب في ترتبات ملفات XML للتأكد من أنها صالحة.
قد تجد أنه من المريح السماح للمصممين بالالتزام بأصول جديدة مباشرةً إلى إعادة الريبو التي يمكن سحبها إلى repos Android و iOS من قبل المصممين.
إن أسهل طريقة لضمان صحة واجهة المستخدم التي تستخدم سحب المتجهات الثابتة هي اختبار لقطة واجهة المستخدم التي تستخدمها باستخدام أداة مثل eossnapshottestcase. سيضمن ذلك أن أي رمز لا يطابق توقعاتك.