Cyborg est un port partiel de Vectordrawable d'Android pour iOS. Il est destiné à un remplacement pour les UIImages, les polices d'icônes et l'option d'image vectorielle PDF d'Apple. Le format Vectordrawable offre un certain nombre d'avantages:
Cyborg prend également en charge MacOS (AppKit), TVOS, et peut être utilisé à partir de Swiftui. Cependant, sachez que ces implémentations sont actuellement moins matures que la version iOS.
Nous avons comparé Cyborg contre un certain nombre d'alternatives, chargeant les 50+ icônes contenues dans le jeu d'icônes de notre application Driver.
UIImage
. Les différences devraient être dans les fractions des millisecondes dans la pratiqueSi les performances de l'analyse deviennent un problème, vous souhaiterez peut-être mettre en œuvre un mécanisme de mise en cache approprié pour votre application ou profiter de la sécurité du fil de Cyborg pour effectuer l'analyse du fil principal.
Cela dit, de nombreuses opportunités d'amélioration des performances existent actuellement, de sorte que les performances devraient s'améliorer à l'avenir. Au moment d'écrire ces lignes, Swift est une jeune langue, et des améliorations des performances, en particulier dans la création de cordes, les fermetures et la propriété devraient également avoir un impact positif sur les performances de Cyborg.
La liste complète des fonctionnalités est énumérée dans la documentation Android.
Cyborg soutient Swift Package Manager et Carthage.
Pour installer en utilisant Carthage:
github "uber/cyborg" ~> [desired version]
Pour ajouter Cyborg à un projet Xcode à l'aide de Swift Package Manager, suivez les instructions fournies par Apple.
Après avoir suivi les étapes d'intégration ci-dessous, l'utilisation de Cyborg ne nécessite que légèrement plus de code que d'utiliser un UIImage
:
let vectorView = VectorView ( theme : myTheme )
vectorView . drawable = VectorDrawable . named ( " MyDrawable " )
Cyborg est conçu pour évoluer vers des cas d'utilisation complexe, et en tant que tels nécessitent un peu de configuration pour obtenir l'échantillon de code propre ci-dessus.
Voyons comment rédiger l'intégration minimale pour commencer:
L'une des meilleures fonctionnalités de VectordRawables est la possibilité d'échanger des valeurs arbitraires au moment de l'exécution. Well l'auteur Vectordrawable Assets peut modifier leurs couleurs en réponse aux changements de l'état de l'APP, comme un mode nocturne.
Cependant, avoir accès à ces fonctionnalités puissantes nous oblige à écrire nos propres fournisseurs de thème et de ressources:
class Theme : Cyborg . ThemeProviding {
func colorFromTheme ( named _ : String ) -> UIColor {
return . black
}
}
class Resources : ResourceProviding {
func colorFromResources ( named _ : String ) -> UIColor {
return . black
}
}
En supposant que les ressources ne changent jamais, nous pouvons maintenant écrire l'initialisateur de commodité représenté dans le premier exemple de code:
fileprivate let resources = Resources ( )
extension VectorDrawable {
public convenience init ( theme : Theme ) {
self . init ( theme : theme , resources : resources ( )
}
}
Si, pour une raison quelconque, vous fournissez un VectorDrawable non valide à Cyborg, la fonction de création standard dans Cyborg vous donnera un message d'erreur détaillé que vous pouvez signaler en tant que non mortel au service de déclaration de crash de votre choix et utiliser pour déboguer localement. Cela peut être géré au niveau "plate-forme" de votre application, vous permettant d'écrire du code qui suppose que l'analyse réussit toujours, tout comme avec 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
}
}
}
Comme vous l'avez peut-être déjà remarqué, les objets de thème et de ressource que vous avez écrits dans une section précédente sont à frappe avec fardeau. Pour éviter les problèmes avec des actifs qui font référence à des couleurs de thème ou de ressources inexistantes, vous voudrez peut-être mettre à foulonner les fichiers XML pour vous assurer qu'ils sont valides.
Vous pouvez trouver pratique de permettre aux concepteurs de commettre de nouveaux actifs directement dans un dépôt qui peut être tiré dans vos dépeintes Android et iOS par des concepteurs.
Le moyen le plus simple d'assurer l'exactitude de vos interfaces utilisateur qui utilisent des dessins vectoriels statiques est de tester les interfaces intermédiaires qui les utilisent à l'aide d'un outil comme iossnapshottestcase. Cela garantira que tout code qui n'est pas vérifié par compilateur correspond à vos attentes.