Cyborgは、AndroidのiOSに可能なVectordRawawableの部分的なポートです。これは、UIIMAGE、アイコンフォント、AppleのPDFベクトル画像オプションの代替品として意図されています。 VectordRawableフォーマットは、多くの利点を提供します。
Cyborgは、MacOS(AppKit)、TVOSもサポートしており、Swiftuiから使用できます。ただし、これらの実装は現在、iOSバージョンよりも成熟度が低いことに注意してください。
ドライバーアプリのアイコンセットに含まれる50以上のアイコンをロードして、サイボーグに多くの代替品に対してベンチマークしました。
UIImage
よりも少し遅い傾向があります。違いは、実際にはミリ秒の分数にあるはずです解析パフォーマンスが問題になる場合、アプリケーションに適したキャッシュメカニズムを実装するか、サイボーグのスレッドの安全性を活用してメインスレッドからの解析を実行することをお勧めします。
とはいえ、現在、多くのパフォーマンス改善の機会が存在するため、将来的にはパフォーマンスが向上するはずです。この執筆時点では、Swiftは若い言語であり、特に文字列の作成、閉鎖、所有権において、パフォーマンスの改善もCyborgのパフォーマンスにプラスの影響を与えるはずです。
機能の完全なリストは、Androidドキュメントに列挙されています。
Cyborgは、Swift Package ManagerとCarthageをサポートしています。
Carthageを使用してインストールするには:
github "uber/cyborg" ~> [desired version]
Swift Package Managerを使用してXcodeプロジェクトにCyborgを追加するには、Appleが提供する指示に従ってください。
以下の統合手順に従った後、Cyborgを使用するには、 UIImage
使用するよりもわずかに多くのコードだけが必要です。
let vectorView = VectorView ( theme : myTheme )
vectorView . drawable = VectorDrawable . named ( " MyDrawable " )
Cyborgは、複雑な使用ケースまでスケールアップするように作られているため、上記のクリーンコードサンプルを取得するには、少し構成が必要です。
開始するための最小限の統合を書く方法を見てみましょう:
VectordRawablesの最良の特徴の1つは、実行時に任意の値で交換できることです。よく著者のVectordRawableアセットは、ナイトモードなどのアプリ状態の変化に応じて色を変更できます。
ただし、これらの強力な機能にアクセスするには、独自のテーマとリソースプロバイダーを書く必要があります。
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 ( )
}
}
何らかの理由で、Cyborgに無効なVectordrawawを提供する場合、Cyborgの標準作成関数は、選択したクラッシュレポートサービスの非致命的であると報告し、ローカルでデバッグするために使用できる詳細なエラーメッセージを提供します。これは、アプリの「プラットフォーム」レベルで処理でき、解析が常に成功すると仮定するコードを作成できます。
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ファイルが有効であることを確認するためにXMLファイルを並べることをお勧めします。
デザイナーがデザイナーがAndroidおよびiOSリポジトリに引き込むことができるレポに新しい資産を直接コミットできるようにするのが便利な場合があります。
静的ベクトルの引き分けを使用するUIの正しさを確保する最も簡単な方法は、IOSSNapShottestCaseなどのツールを使用してそれらを使用するUIをスナップショットテストすることです。これにより、コンパイラで検証されていないコードがあなたの期待に合っていることが保証されます。