如果僅支持iOS 15+/macOS 12+,並且不在乎動畫圖像格式,請嘗試Swiftui的異步圖像
sdwebimageswiftui是一個SwiftUI圖像加載框架,它基於SDWebimage。
它帶來了SDWebimage的所有喜歡的功能,例如異步圖像加載,內存/磁盤緩存,動畫圖像播放和表演。
該框架提供了不同的視圖結構,API與SwiftUI框架指南相匹配。如果您熟悉Image ,您會發現易於使用WebImage和AnimatedImage 。
從v3.0.0來看,可以為Visionos平台編輯SDWebimagesWiftUI。但是,由於缺乏軟件包管理器支持(需要工具更新),因此我們不支持Cocoapods/spm。
您只能使用Xcode的內置軟件包管理器依賴項來構建Visionos。
要運行visionos示例,您需要克隆並同時添加SDWebImage和SDWebImageSwiftUI ,打開SDWebImageSwiftUI.xcworkspace並拖動這些文件夾以成為本地軟件包依賴關係,請參閱:將包裝依賴性編輯為本地軟件包,
如果您真的想構建框架而不是使用Xcode的軟件包依賴項,請按照以下手冊步驟進行操作:
SDWebImage.xcodeproj和構建Visionos平台的SDWebImage目標(如果需要,請更改MACH_O_TYPE到靜態庫)Carthage/Build/visionOS上創建目錄,然後復制SDWebImage.frameworkSDWebImageSwiftUI.xcodeproj並構建SDWebImageSwiftUI visionOS目標由於SDWeBimagesWiftUI建立在SDWebimage之上,因此它既可以提供盒子外功能,又提供您在現實世界應用中可能想要的高級功能。在需要時檢查我們的Wiki:
您還可以通過SDWebimage從現有社區中獲得所有利益。您可以通過編碼器插件,通過SDWEBIMAGEPHOTOSPLUGIN,通過FireBaseui進行的Firebase集成等等,可以通過編碼器插件獲得大量的圖像格式支持(GIF/APNG/WebP/heif/avif/svg/pdf)。
除了所有這些功能外,我們還對Swiftui進行優化,例如綁定,查看修飾符,使用相同的設計模式成為一名優秀的Swiftui公民。
該框架正在大量開發中,建議盡可能多地使用最新版本(包括sdwebimage依賴性)。
該框架遵循語義版本控制。每個源折斷API更改都會碰到主要版本。
此項目使用保留更改格式以記錄更改。檢查版本之間的更改changelog.md。更改也將在發布頁面中更新。
歡迎所有問題報告,功能請求,貢獻和GitHub星星。如果您發現此框架有用,希望有積極的反饋和促銷。
iOS 14(MACOS 11)介紹了SwiftUI 2.0,它保持最多的API兼容,但會改變許多內部行為,從而破壞了SDWeBimagesWiftUI的功能。
來自v3.0.0,sdwebimageswiftui降低iOS 13支持。要在iOS 13上使用,請檢查最新的v2.x版本(或使用2.x分支)。
由於SDWebimage 6.0將引入混合的Swift/OBJC代碼庫,因此此存儲庫將遷移到SDWebimage Core Repo中。
但是不用擔心,我們將使用自動交叉模塊覆蓋層,手段,您可以使用:
import SwiftUI
import SDWebImage做類似的作品:
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
您將自動鏈接SDWebImageSwiftUI ,該庫的命名仍將保存在SPM目標中。因此,對於大多數人來說,過渡很順利,我不想碰到另一個主要版本。 3.x是SDWebimagesWiftui專用repo的最終版本
注意:對於超級高級用戶,如果您使用一些自定義的Swift工具鏈,請確保通過-Xfrontend -enable-cross-import-overlays
SdwebimagesWiftUI可通過Swift Package Manager獲得。
對於應用集成,您應該使用Xcode 12或更高版本,以將此軟件包添加到應用程序目標中。為此,請使用XCode查看有關逐步教程的應用程序添加軟件包依賴項。
對於下游框架作者,您應該在git repo中創建一個Package.swift文件,然後添加以下行以標記您的框架,取決於我們的sdwebimageswiftui。
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) 可通過可可錄提供SDWebimagesWiftUI。要安裝它,只需將以下行添加到您的podfile:
pod 'SDWebImageSwiftUI' SdwebimagesWiftUI可通過迦太基購買。
github "SDWebImage/SDWebImageSwiftUI"
WebImage加載網絡圖像 var body : some View {
WebImage ( url : URL ( string : " https://nokiatech.github.io/heif/content/images/ski_jump_1440x960.heic " ) ) { image in
image . resizable ( ) // Control layout like SwiftUI.AsyncImage, you must use this modifier or the view will use the image bitmap size
} placeholder : {
Rectangle ( ) . foregroundColor ( . gray )
}
// Supports options and context, like `.delayPlaceholder` to show placeholder only when error
. onSuccess { image , data , cacheType in
// Success
// Note: Data exist only when queried from disk cache or network. Use `.queryMemoryData` if you really need data
}
. indicator ( . activity ) // Activity Indicator
. transition ( . fade ( duration : 0.5 ) ) // Fade Transition with duration
. scaledToFit ( )
. frame ( width : 300 , height : 300 , alignment : . center )
}注意:使用Image進行內部實現的WebImage ,這是SwiftUI佈局和動畫系統的最佳兼容性。但是,與不支持動畫圖像或向量圖像的Swiftui Image不同, WebImage也支持動畫圖像(默認情況下,v2.0.0)。
但是, WebImage動畫提供了簡單的常見用例,因此仍然建議使用AnimatedImage用於諸如漸進式動畫渲染或矢量圖像渲染之類的高級控件。
@ State var isAnimating : Bool = true
var body : some View {
WebImage ( url : URL ( string : " https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif " ) , isAnimating : $isAnimating ) ) // Animation Control, supports dynamic changes
// The initial value of binding should be true
. customLoopCount ( 1 ) // Custom loop count
. playbackRate ( 2.0 ) // Playback speed rate
. playbackMode ( . bounce ) // Playback normally to the end, then reversely back to the start
// `WebImage` supports advanced control just like `AnimatedImage`, but without the progressive animation support
}注意:對於指示器,您也可以自定義。例如,iOS 14/watchOS 7介紹了新的ProgressView ,可以通過以下方式輕鬆使用:
WebImage ( url : url )
. indicator ( . activity )或者,您可以像以下方式一樣寫作:
WebImage ( url : url )
. indicator {
Indicator { _ , _ in
ProgressView ( )
}
}AnimatedImage來播放動畫 var body : some View {
Group {
AnimatedImage ( url : URL ( string : " https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif " ) , placeholderImage : . init ( systemName : " photo " ) ) // Placeholder Image
// Supports options and context, like `.progressiveLoad` for progressive animation loading
. onFailure { error in
// Error
}
. resizable ( ) // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
. indicator ( . activity ) // Activity Indicator
. transition ( . fade ) // Fade Transition
. scaledToFit ( ) // Attention to call it on AnimatedImage, but not `some View` after View Modifier (Swift Protocol Extension method is static dispatched)
// Supports SwiftUI ViewBuilder placeholder as well
AnimatedImage ( url : url ) {
Circle ( ) . foregroundColor ( . gray )
}
// Data
AnimatedImage ( data : try ! Data ( contentsOf : URL ( fileURLWithPath : " /tmp/foo.webp " ) ) )
. customLoopCount ( 1 ) // Custom loop count
. playbackRate ( 2.0 ) // Playback speed rate
// Bundle (not Asset Catalog)
AnimatedImage ( name : " animation1.gif " , isAnimating : $isAnimating ) // Animation control binding
. maxBufferSize ( . max )
. onViewUpdate { view , context in // Advanced native view coordinate
// AppKit tooltip for mouse hover
view . toolTip = " Mouseover Tip "
// UIKit advanced content mode
view . contentMode = . topLeft
// Coordinator, used for Cocoa Binding or Delegate method
let coordinator = context . coordinator
}
}
}注意: AnimatedImage支持動畫圖像格式的圖像URL或圖像數據。使用SDWebimage的動畫imageView進行內部實現。請注意,由於代表Uikit/AppKit上的這一基礎,因此某些先進的SwiftUI佈局和動畫系統可能無法正常工作。您可能需要UIKIT/APPKIT和核心動畫來修改本機視圖。
注意: AnimatedImage某些方法,例如.transition , .indicator和.aspectRatio具有與SwiftUI.View相同的命名。但是ARGS會收到不同的類型。這是因為AnimatedImage支持用於與Uikit/AppKit組件和動畫一起使用。如果發現歧義,請使用完整的聲明而不是點表達語法。
注意: AnimatedImage上的某些方法將返回some View ,即新的修改內容。您將丟失相關的修飾符方法。對於這種情況,您可以在.onViewUpdate中重新排序方法調用,或使用本機視圖(實際上是SDAnimatedImageView ),請使用Uikit/AppKit API進行recusue。
// Using UIKit components
var body : some View {
AnimatedImage ( name : " animation2.gif " )
. indicator ( SDWebImageProgressIndicator . default ) // UIKit indicator component
. transition ( SDWebImageTransition . flipFromLeft ) // UIKit animation transition
}
// Using SwiftUI components
var body : some View {
AnimatedImage ( name : " animation2.gif " )
. indicator ( Indicator . progress ) // SwiftUI indicator component
. transition ( AnyTransition . flipFromLeft ) // SwiftUI animation transition
}為什麼我們在這裡有兩種不同的視圖類型,這是因為當前的SwiftUI限制。但是我們旨在為所有用例提供最佳解決方案。
如果您不需要動畫映像,請首先使用WebImage 。它表現得無縫作為內置的Swiftui視圖。如果Swiftui起作用,它可以正常工作。如果Swiftui不起作用,它也可以:)
如果您需要簡單的動畫圖像,請使用WebImage 。提供基本的動畫圖像支持。但是,如果您不在乎,它不支持漸進式動畫渲染,也不支持矢量圖像。
如果您需要功能強大的動畫圖像,則可以選擇AnimatedImage 。請記住,它也支持靜態圖像,您無需檢查格式,只需使用它即可。另外,一些功能強大的功能,例如Uikit/AppKit色調,矢量圖像,符號圖像配置,TVOS分層圖像,僅在AnimatedImage中可用,但當前不在SWFITUI中。
但是,由於AnimatedImage使用UIViewRepresentable並驅動Uikit驅動,因此目前Uikit和SwiftUI佈局和動畫系統之間可能存在一些小問題,或者與Swiftui本身有關的錯誤。我們會盡力匹配SwiftUI的行為,並提供與WebImage相同的API,這使得在需要時可以輕鬆在這兩種類型之間切換。
ImageManager用於您自己的視圖類型ImageManager是一個符合可觀察對象協議的類。這是我們提供的核心獲取WebImage源。
對於高級用例,例如將圖像加載到您不想使用WebImage複雜視圖圖中。您可以將自己的視圖類型與經理直接綁定。
它看起來像SDWebImageManager一樣熟悉,但它是為Swiftui World建造的,它為加載圖像提供了真實的來源。您最好使用SwiftUi的@ObservedObject綁定視圖實例的每個單個管理器實例,當圖像狀態更改時,該實例會自動更新視圖的身體。
struct MyView : View {
@ ObservedObject var imageManager = ImageManager ( )
var body : some View {
// Your custom complicated view graph
Group {
if imageManager . image != nil {
Image ( uiImage : imageManager . image! )
} else {
Rectangle ( ) . fill ( Color . gray )
}
}
// Trigger image loading when appear
. onAppear { self . imageManager . load ( url : url ) }
// Cancel image loading when disappear
. onDisappear { self . imageManager . cancel ( ) }
}
}該框架基於SDWebimage,該框架支持高級自定義和配置以滿足不同用戶的需求。
您可以為外部圖像格式註冊多個編碼器插件。您可以註冊多個緩存(不同的路徑和配置),多個加載程序(urlsession和Photos URL)。您可以控制我們Wiki中的緩存到期日期,大小,下載優先級等。
為Swiftui應用程序放置這些設置代碼的最佳場所,是AppDelegate.swift :
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
// Add WebP/SVG/PDF support
SDImageCodersManager . shared . addCoder ( SDImageWebPCoder . shared )
SDImageCodersManager . shared . addCoder ( SDImageAVIFCoder . shared )
SDImageCodersManager . shared . addCoder ( SDImageSVGCoder . shared )
SDImageCodersManager . shared . addCoder ( SDImagePDFCoder . shared )
// Add default HTTP header
SDWebImageDownloader . shared . setValue ( " image/webp,image/apng,image/*,*/*;q=0.8 " , forHTTPHeaderField : " Accept " )
// Add multiple caches
let cache = SDImageCache ( namespace : " tiny " )
cache . config . maxMemoryCost = 100 * 1024 * 1024 // 100MB memory
cache . config . maxDiskSize = 50 * 1024 * 1024 // 50MB disk
SDImageCachesManager . shared . addCache ( cache )
SDWebImageManager . defaultImageCache = SDImageCachesManager . shared
// Add multiple loaders with Photos Asset support
SDImageLoadersManager . shared . addLoader ( SDImagePhotosLoader . shared )
SDWebImageManager . defaultImageLoader = SDImageLoadersManager . shared
return true
}有關更多信息,真正建議檢查我們的演示,以了解詳細的API使用情況。您還可以在最新的API文檔上進行檢查,以供高級使用。
Swiftui在List/LazyStack/LazyGrid中使用狀態視圖時具有已知的行為(錯誤?)。只有頂級視圖才能保持自己的@State/@StateObject ,但是在滾動滾動時,子結構將丟失狀態。但是,Webimage/Animated都是有狀態的。為了確保即使滾出屏幕,狀態也保持同步。您可以使用一些技巧。
請參閱更多:https://twitter.com/fatbobman/status/1572507700436807683? s = 21&t = Z4FKAWTMVJSGL-WKDJGREQ
簡而言之,不建議這樣做:
struct ContentView {
@ State var imageURLs : [ String ]
var body : some View {
List {
ForEach ( imageURLs , id : . self ) { url in
VStack {
WebImage ( url ) // The top level is `VStack`
}
}
}
}
}相反,使用這種方法:
struct ContentView {
struct BodyView {
@ State var url : String
var body : some View {
VStack {
WebImage ( url )
}
}
}
@ State var imageURLs : [ String ]
var body : some View {
List {
ForEach ( imageURLs , id : . self ) { url in
BodyView ( url : url )
}
}
}
} Swiftui的Button將覆蓋層應用於其內容(默認Text下),這是這樣寫代碼的常見錯誤,這會導致奇怪的行為:
// Wrong
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
// NavigationLink create Button implicitly
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
}
}取而代之的是,您必須覆蓋.buttonStyle以使用純樣式,或使用.renderingMode使用原始模式。您也可以將.onTapGesture修飾符用於觸摸處理。查看如何禁用覆蓋顏色以獲取按鈕內部的圖像和NavigationLink中的圖像
// Correct
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
. buttonStyle ( PlainButtonStyle ( ) )
// Or
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
. renderingMode ( . original )
}
} WebImage/AnimatedImage均支持使用SVG/PDF外部編碼器渲染向量圖像。但是它們在內部不同。
AnimatedImage :使用Apple符號圖像和矢量圖中的技術,支持動態大小的變化而不會丟失細節。它使用基於UIKIT/APPKIT的實現和API。如果需要,請通過.context(.imageThumbnailPixelSize: size)使用位圖渲染並獲得更多像素。WebImage :將矢量圖像繪製到位圖版本中。就像普通PNG一樣。默認情況下,我們使用矢量圖像內容大小(SVG帆布大小或PDF媒體框大小)。如果需要,請通過.context(.imageThumbnailPixelSize: size)獲得更多像素。對於位圖渲染,您還可以使用自定義顏色(例如符號映像)為SVG/PDF圖標著色,使用.renderingMode(.template)和.tint(:)或.foregroundColor(:)修飾符,該修飾符與SwiftUI.Image行為匹配。
var body : some View {
WebImage ( url : URL ( string : " https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/w3c.svg " ) )
. resizable ( )
. renderingMode ( . template )
. foregroundColor ( . red ) // or `.tint(:)`, `.accentColor(:)`
. scaledToFit ( )
} var body : some View {
AnimatedImage ( url : URL ( string : " https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/w3c.svg " ) , context : [ . imageThumbnailPixelSize : CGSize ( width : 100 , height : 100 ) ] )
. resizable ( )
. renderingMode ( . template )
// seems `.foregroundColor(:)` does effect `UIView.tintColor`, use `tint(:)` or `.accentColor(:)` instead.
// Or you can use `onViewCreate(:)` to get native `SDAnimatedImageView` and set `tintColor` (AppKit use `contentTintColor`)
. tint ( . red )
. scaledToFit ( )
}查看更多:在UI中配置和顯示符號圖像
SDWebimage本身,支持許多自定義加載程序(例如Firebase Storage和Photoskit),Caches(例如Yycache和Pincache)以及編碼器(例如WebP和Avif,甚至Lottie)。
這是通過SwiftUI環境設置這些外部組件的教程。
您可以將設置代碼放入SwiftUi App.init()方法中。
@ main
struct MyApp : App {
init ( ) {
// Custom Firebase Storage Loader
FirebaseApp . configure ( )
SDImageLoadersManager . shared . loaders = [ FirebaseUI . StorageImageLoader . shared ]
SDWebImageManager . defaultImageLoader = SDImageLoadersManager . shared
// WebP support
SDImageCodersManager . shared . addCoder ( SDImageWebPCoder . shared )
// AVIF support
SDImageCodersManager . shared . addCoder ( SDImageAVIFCoder . shared )
}
var body : some Scene {
WindowGroup {
ContentView ( )
}
}
}或者,如果您的應用具有復雜的AppDelegate類,請將設置代碼放在那裡:
class AppDelegate : NSObject , UIApplicationDelegate {
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? = nil ) -> Bool {
SDImageCachesManager . shared . caches = [ YYCache ( name : " default " ) ]
SDWebImageManager . defaultImageCache = SDImageCachesManager . shared
return true
}
}
@ main
struct MyApp : App {
@ UIApplicationDelegateAdaptor ( AppDelegate . self ) var appDelegate
var body : some Scene {
WindowGroup {
ContentView ( )
}
}
} 對於某些自定義加載程序,您需要使用一些特殊的API創建URL結構,以便SDWebimage可以從其他SDK中檢索上下文,例如:
let storageRef : StorageReference
let storageURL = NSURL . sd_URL ( with : storageRef ) as URL ?
// Or via convenience extension
let storageURL = storageRef . sd_URLRepresentation let asset : PHAsset
let photosURL = NSURL . sd_URL ( with : asset ) as URL ?
// Or via convenience extension
let photosURL = asset . sd_URLRepresentation對於某些自定義編碼器,您需要使用一些選項請求圖像來控制行為,例如向量圖像SVG/PDF。因為SwiftUi.Image或Webimage完全不支持向量圖。
let vectorURL : URL ? // URL to SVG or PDF
WebImage ( url : vectorURL , context : [ . imageThumbnailPixelSize : CGSize ( width : 100 , height : 100 ) ] ) let lottieURL : URL ? // URL to Lottie.json
WebImage ( url : lottieURL , isAnimating : $isAnimating )對於緩存,您實際上無需擔心任何事情。它只是在設置後起作用。
當您的應用程序目標的部署目標版本小於iOS 14/macOS 11/tvos 14/watchOS 7時,SDWEBIMAGESWIFTUI支持要使用的是,它將較弱的Swiftui(組合)鏈接以允許在運行時使用可用檢查的代碼。
要使用向後部署,您必須執行以下操作:
添加-weak_framework SwiftUI -weak_framework Combine在應用程序目標的Other Linker Flags構建設置中結合在一起。您也可以使用Xcode的Optional Framework複選框執行此操作,並具有相同的效果。
您應該注意到,所有第三方Swiftui框架也應該具有此構建設置,而不僅僅是sdwebimageswiftui。或在iOS 12設備上運行時,它將在啟動時觸發運行時染色器錯誤。
對於iOS 12.2下方的部署目標版本(在iOS系統中捆綁5運行時的第一個版本),您必須更改SDWebimagesWiftUI的最小部署目標版本。這可能會對編譯器的優化產生一些副作用,並觸發某些框架的大規模警告。
但是,對於iOS 12.2+,您仍然可以將最小部署目標版本保留到iOS 14,對於iOS 14客戶端,沒有額外的警告或性能放慢速度。
因為Swift使用最小部署目標版本來檢測是鏈接應用程序捆綁的Swift運行時還是內置的系統( /usr/lib/swift/libswiftCore.dylib )。
post_install do | installer |
installer . pods_project . targets . each do | target |
target . build_configurations . each do | config |
config . build_settings [ 'IPHONEOS_DEPLOYMENT_TARGET' ] = '11.0' # version you need
end
end
end對於Carthage用戶,您可以使用carthage update --no-build下載依賴項,然後更改Xcode Project的部署目標版本並構建二進制框架。
對於SwiftPM用戶,您必須使用本地依賴關係(與Git子模塊)更改部署目標版本。
對於迦太基用戶,構建的二進制框架將使用庫Evolution來支持向後部署。
對於Cocoapods用戶,您可以在podfile中跳過平台版本驗證:
platform :ios , '14.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPods將所有SwiftUI代碼添加到可用的註釋和運行時檢查,例如:
// AppDelegate.swift
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
// ...
if #available ( iOS 14 , * ) {
window . rootViewController = UIHostingController ( rootView : ContentView ( ) )
} else {
window . rootViewController = ViewController ( )
}
// ...
}
// ViewController.swift
class ViewController : UIViewController {
var label : UILabel = UILabel ( )
override func viewDidLoad ( ) {
super . viewDidLoad ( )
view . backgroundColor = . white
view . addSubview ( label )
label . text = " Hello World iOS 12! "
label . sizeToFit ( )
label . center = view . center
}
}
// ContentView.swift
@ available ( iOS 14 . 0 , macOS 11 . 0 , tvOS 14 . 0 , watchOS 7 . 0 , * )
struct ContentView : View {
var body : some View {
Group {
Text ( " Hello World iOS 14! " )
WebImage ( url : URL ( string : " https://i.loli.net/2019/09/24/rX2RkVWeGKIuJvc.jpg " ) )
}
}
} 使用swiftui運行示例,按照以下步驟:
SDWebImageSwiftUI.xcworkspace ,等待SwiftPM完成下載測試依賴項。SDWebImageSwiftUIDemo (或其他平台)方案並運行演示應用程序。注意:這裡的Podfile是因為歷史記錄我們使用Cocoapods將Libs整合到演示中,但是現在我們使用了SPM。
由於Swiftui的目標是支持所有Apple平台,因此我們的演示也可以做到這一點,其中一個代碼庫包括:
演示提示:
Switch (右鍵單擊MacOS/Tak On WatchOS上的點擊)在WebImage和AnimatedImage之間切換。Reload (右鍵單擊WatchOS上的MACOS/按鈕)清除緩存。Swipe Left (TVOS上的菜單按鈕)從列表中刪除一個圖像URL。SDWEBIMAGESWIFTUI具有單位測試以提高代碼質量。對於Swiftui,蘋果沒有提供官方的單位測試解決方案。
但是,由於Swiftui是基於州的且歸因於實施佈局系統,因此有開源項目提供解決方案:
.frame修改器, .image值)。我們使用它來測試AnimatedImage和WebImage 。它還允許檢查到本機UIVIEW/NSVIEW。進行測試:
pod install以安裝依賴關係。SDWebImageSwiftUI.xcworkspace ,等待SwiftPM完成下載測試依賴項。SDWebImageSwiftUITests方案並開始測試。我們已經設置了CI管道,每個PR將運行測試案例並將測試報告上傳到Codecov。
除上述所有內容外,該項目還可以確保Swift平台上可用於SDWebimage本身的以下功能。
這意味著,該項目是一個核心用例和下游依賴性,這使SDWebimage本身未來發展。
Dreampiggy
SDWebimagesWiftUI可根據MIT許可獲得。有關更多信息,請參見許可證文件。