Cyborg는 IOS에 대한 Android의 vectordrawable의 일부 항구입니다. UIIMAGES, 아이콘 글꼴 및 Apple의 PDF 벡터 이미지 옵션을 대체 할 수 있습니다. VectorDrawable 형식은 여러 가지 장점을 제공합니다.
Cyborg는 또한 MacOS (Appkit), TVOS를 지원하며 Swiftui에서 사용할 수 있습니다. 그러나 이러한 구현은 현재 iOS 버전보다 덜 성숙합니다.
우리는 여러 대안에 대해 사이보그를 벤치마킹하여 드라이버 앱 아이콘 세트에 포함 된 50 개 이상의 아이콘을로드했습니다.
UIImage
보다 약간 느린 경향이 있습니다. 차이점은 실제로 밀리 초 분수에 있어야합니다.구문 분석 성능이 문제가되면 응용 프로그램에 적합한 캐싱 메커니즘을 구현하거나 Cyborg의 스레드 안전을 활용하여 기본 스레드에서 구문 분석을 수행 할 수 있습니다.
그로 인해 현재 많은 성능 개선 기회가 존재하므로 앞으로 성능이 향상 될 것입니다. 이 글을 쓰는 시점에서 Swift는 젊은 언어이며, 특히 현악기 생성, 폐쇄 및 소유권에서 성능 개선은 사이보그의 성과에 긍정적 인 영향을 미쳐야합니다.
기능의 전체 목록은 Android 문서에 열거되어 있습니다.
Cyborg는 Swift 패키지 관리자와 Carthage를 지원합니다.
Carthage를 사용하려면 :
github "uber/cyborg" ~> [desired version]
Swift 패키지 관리자를 사용하여 Cyborg를 Xcode 프로젝트에 추가하려면 Apple이 제공 한 지침을 따르십시오.
아래의 통합 단계를 수행 한 후 Cyborg를 사용하면 UIImage
사용하는 것보다 약간 더 많은 코드 만 있으면됩니다.
let vectorView = VectorView ( theme : myTheme )
vectorView . drawable = VectorDrawable . named ( " MyDrawable " )
Cyborg는 복잡한 사용 사례로 확장되도록 만들어졌으며 위의 클린 코드 샘플을 얻으려면 약간의 구성이 필요합니다.
시작하기 위해 최소한의 통합을 작성하는 방법을 살펴 보겠습니다.
VectordRawables의 가장 좋은 기능 중 하나는 런타임에 임의의 값을 교환하는 기능입니다. 잘 작성된 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 ( )
}
}
어떤 이유로 든 사이보그에 유효하지 않은 vectordrawable을 제공하는 경우 사이보그의 표준 생성 기능은 선택의 충돌보고 서비스에 대한 치명적이지 않은 오류 메시지를 제공하고 로컬로 디버그하는 데 사용할 수있는 상세한 오류 메시지를 제공합니다. 이것은 앱의 "플랫폼"레벨에서 처리 할 수 있으므로 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 파일에 유효한지를 보려고 할 수 있습니다.
디자이너가 디자이너가 Android 및 iOS 저장소로 가져올 수있는 리포에 새로운 자산을 직접 커밋 할 수 있도록 편리 할 수 있습니다.
정적 벡터 드로어블을 사용하는 UI의 정확성을 보장하는 가장 쉬운 방법은 iossnapshottestescase와 같은 도구를 사용하는 UI를 스냅 샷 테스트하는 것입니다. 이를 통해 컴파일러 검증이 아닌 코드가 기대치와 일치 할 수 있습니다.