Wenn Sie nur iOS 15+/macOS 12+ unterstützen und sich nicht für das animierte Bildformat interessieren, probieren Sie Swiftuis Asyncimage aus
SdwebimagesWiftui ist ein Swiftui -Bild -Ladegerüst, das auf SDWebimage basiert.
Es bringt alle Ihre bevorzugten Funktionen von SDWebimage wie asynchronisiertem Bild, Lade-, Speicher-/Festplatten -Caching, animierter Bildwiedergabe und Performances.
Das Framework bietet die verschiedenen Ansichtsstrukturen, die API mit der Richtlinie von Swiftui Framework übereinstimmen. Wenn Sie mit Image vertraut sind, werden Sie es einfach finden, WebImage und AnimatedImage zu verwenden.
Ab V3.0.0 kann SDWebimagesWiftui für die VisionOS -Plattform zusammengestellt werden. Aufgrund des fehlenden Supports für Paketmanager (Bedarf Tools -Update) unterstützen wir jedoch noch keine Cocoapods/SPM.
Sie können nur die integrierte Abhängigkeit des Paketmanagers des Xcode-Paketmanagers verwenden, um auf VisionOs zu erstellen.
Um das VisionOS -Beispiel auszuführen, müssen Sie sowohl SDWebImage als auch SDWebImageSwiftUI hinzufügen, die SDWebImageSwiftUI.xcworkspace öffnen und diese Ordner zu lokaler Paketabhängigkeit ziehen: Bearbeiten einer Paketabhängigkeit als lokales Paket
Wenn Sie wirklich Framework erstellen möchten, anstatt die Paketabhängigkeit von Xcode zu verwenden, folgen Sie den folgenden manuellen Schritten:
SDWebImage.xcodeproj und Build SDWebImage -Ziel für VisionOS -Plattform (ändere MACH_O_TYPE in die statische Bibliothek bei Bedarf)Carthage/Build/visionOS und kopieren Sie SDWebImage.framework in esSDWebImageSwiftUI.xcodeproj und bauen SDWebImageSwiftUI visionOS Ziel Da SDWebimagesWiftui auf SDWebimage aufgebaut ist, bietet es sowohl die Out-of-Box-Funktionen als auch die erweiterten leistungsstarken Funktionen, die Sie in realen Apps wünschen. Überprüfen Sie unser Wiki, wenn Sie brauchen:
Sie können auch alle Vorteile der vorhandenen Community mit SDWebimage erhalten. Sie können eine massive Bildformatunterstützung (GIF/APNG/WebP/Heif/AVIF/SVG/PDF) über Codierer -Plugins, Photokit -Unterstützung über SDWebimagePhotosplugin, Firebase -Integration über Firebaseui usw. haben.
Neben all diesen Merkmalen optimieren wir Swiftui, wie Bindung, Modifikator anzeigen und verwenden dasselbe Designmuster, um ein guter Swiftui -Bürger zu werden.
Dieser Rahmen wird stark entwickelt. Es wird empfohlen, die neueste Version so weit wie möglich zu verwenden (einschließlich SDWebimage -Abhängigkeit).
Dieser Framework folgt der semantischen Versionierung. Jede Quell-Break-API ändert sich zu einer Hauptversion.
Diese Projektnutzung behält ein ChangeLog -Format, um die Änderungen aufzuzeichnen. Überprüfen Sie den Changelog.md über die Änderungen zwischen den Versionen. Die Änderungen werden auch auf der Release -Seite aktualisiert.
Alle Ausgabeberichte, Feature -Anfragen, Beiträge und Github -Sterne sind begrüßt. Hoffnung auf aktives Feedback und Promotion, wenn Sie diesen Framework nützlich finden.
iOS 14 (macOS 11) führt den Swiftui 2.0 ein, der die am meisten kompatibel hält, aber viele interne Verhaltensweisen verändert, was die Funktion des SDWebimagesWiftui bricht.
Ab V3.0.0 fallen SDWebimageswiftui -Unterstützung iOS 13. Um auf iOS 13 zu verwenden, sehen Sie stattdessen die neueste v2.x -Version (oder verwenden 2.x Branch) statt.
Da SDWebimage 6.0 gemischte Swift/OBJC -Codebasis einführt, migriert dieses Repo in SDWebimage Core Repo.
Aber keine Sorge, wir werden das automatische Kreuzmodul -Overlay verwenden, was bedeutet, dass Sie verwenden können:
import SwiftUI
import SDWebImageWerke wie:
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
Sie werden den SDWebImageSwiftUI automatisch verknüpfen, und die Benennung dieser Bibliothek bleibt weiterhin im SPM -Ziel erhalten. Der Übergang ist also für die meisten von Ihnen reibungslos, ich möchte keine andere Hauptversion stoßen. Der 3.x ist die endgültige Version für SDWebimageswiftui -dediziertes Repo
Hinweis: Wenn Sie für den super erweiterten Benutzer einige -Xfrontend -enable-cross-import-overlays Swift-Toolchain verwenden
SDWebimagesWiftui ist über Swift Paket Manager erhältlich.
Für die App -Integration sollten Sie Xcode 12 oder höher verwenden, um dieses Paket Ihrem App -Ziel hinzuzufügen. Überprüfen Sie dazu bei der Schritt -für -Schritt -Tutorial mit Xcode das Hinzufügen von Paketabhängigkeiten zu Ihrer App.
Für den nachgelagerten Framework -Autor sollten Sie eine Package.swift -Datei in Ihr Git -Repo erstellen und dann die folgende Zeile hinzufügen, um Ihr Framework zu markieren, abhängig von unserem SDWebimagesWiftui.
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) SdwebimagesWiftui ist über Cocoapods erhältlich. Um es zu installieren, fügen Sie einfach die folgende Zeile zu Ihrem Podfile hinzu:
pod 'SDWebImageSwiftUI' SdwebimagesWiftui ist über Karthago erhältlich.
github "SDWebImage/SDWebImageSwiftUI"
WebImage zum Laden von Netzwerkbild 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 )
} HINWEIS: Diese WebImage verwendet Image für die interne Implementierung, die am besten für Swiftui -Layout- und Animationssystem kompatibel ist. Im Gegensatz zu Swiftuis Image , das animiertes Bild- oder Vektorbild nicht unterstützt, unterstützt WebImage auch animiertes Image (standardmäßig aus V2.0.0).
Die WebImage -Animation bietet jedoch einen einfachen gemeinsamen Anwendungsfall. Daher wird weiterhin empfohlen, AnimatedImage für erweiterte Steuerelemente wie progressives Animationsrendern oder Vektorbild -Rendering zu verwenden.
@ 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
} HINWEIS: Für den Indikator können Sie auch Ihre eigenen benennen. Zum Beispiel stellen iOS 14/watchOS 7 das neue ProgressView ein, das leicht verwendet werden kann:
WebImage ( url : url )
. indicator ( . activity )Oder Sie können einfach schreiben wie:
WebImage ( url : url )
. indicator {
Indicator { _ , _ in
ProgressView ( )
}
}AnimatedImage , um Animation abzuspielen 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
}
}
} Hinweis: AnimatedImage unterstützt sowohl Bild -URL- als auch Bilddaten für animiertes Bildformat. Die das animierte ImageView des SDWebimage zur internen Implementierung verwenden. Achten Sie darauf, dass ein fortgeschrittenes Swiftui -Layout- und Animationssystem, da diese Basis auf UIKIT/Appkit Repräsentierbar ist, möglicherweise nicht wie erwartet funktioniert. Möglicherweise benötigen Sie UIKIT/Appkit und Core -Animation, um die native Ansicht zu ändern.
HINWEIS: AnimatedImage Einige Methoden wie .transition , .indicator und .aspectRatio haben die gleiche Benennung wie SwiftUI.View -Protokollmethoden. Aber die Args erhalten den verschiedenen Typ. Dies liegt daran, dass AnimatedImage unterstützt, um mit UIKIT/AppKit -Komponente und Animation verwendet zu werden. Wenn Sie Unklarheiten finden, verwenden Sie die vollständige Typdeklaration anstelle der DOT -Expressionsyntax.
Hinweis: Einige Methoden auf AnimatedImage geben some View zurück, einen neuen geänderten Inhalt. Sie verlieren die modifizierende Modifikationsmethode. Für diesen Fall können Sie den Methodenaufruf entweder neu ordnen oder die native Ansicht (eigentlich SDAnimatedImageView ) in .onViewUpdate verwenden, verwenden Sie die UIKIT/AppKit -API zur Rettung.
// 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
}Warum wir hier zwei verschiedene Ansichtstypen haben, liegt an der aktuellen Swiftui -Grenze. Wir sind jedoch darauf abzielen, die beste Lösung für alle Anwendungsfälle zu liefern.
Wenn Sie kein animiertes Bild benötigen, verwenden Sie zunächst WebImage . Das verhält sich die nahtlose als eingebaute Swiftui-Ansicht. Wenn Swiftui funktioniert, funktioniert es. Wenn Swiftui nicht funktioniert, auch nicht :)
Wenn Sie ein einfaches animiertes Bild benötigen, verwenden Sie WebImage . Die die grundlegende animierte Bildunterstützung bieten. Aber es unterstützt weder progressives Animationsrendern noch Vektorbild, wenn Sie sich nicht darum kümmern.
Wenn Sie ein leistungsstarkes animiertes Bild benötigen, ist AnimatedImage diejenige, die ausgewählt werden kann. Denken Sie daran, dass es auch statisches Bild unterstützt. Sie müssen das Format nicht überprüfen, sondern nur so verwenden. Eine leistungsstarke Funktion wie UIKIT/Appkit Tintfarbe, Vektorbild, Symbolbildkonfiguration, TVOS -geschichtete Bild, nur in AnimatedImage erhältlich, aber derzeit nicht in SWFitui.
Da AnimatedImage UIViewRepresentable und von UIKIT angetrieben wird, gibt es möglicherweise einige kleine inkompatible Probleme zwischen UIKIT- und Swiftui -Layout- und Animationssystem oder Fehler im Zusammenhang mit Swiftui selbst. Wir versuchen unser Bestes, um das Verhalten von Swiftui zu entsprechen, und stellen dieselbe API wie WebImage an, die es beim Wechsel zwischen diesen beiden Typen bei Bedarf erleichtern.
ImageManager für Ihren eigenen Ansichtstyp Der ImageManager ist eine Klasse, die sich dem ObservableObject -Protokoll des Kombinierens entspricht. Dies ist die Kernfetching -Datenquelle für WebImage , die wir zur Verfügung gestellt haben.
Für einen erweiterten Anwendungsfall wie das Laden von Bild in das komplizierte Ansichtsdiagramm, das Sie nicht mit WebImage verwenden möchten. Sie können Ihren eigenen Ansichtstyp direkt an den Manager binden.
Es sieht wie SDWebImageManager bekannt aus, ist aber für Swiftui World gebaut, die die Quelle der Wahrheit für das Laden von Bildern liefern. Sie sollten Swiftuis @ObservedObject besser verwenden, um jede einzelne Managerinstanz für Ihre Ansichtsinstanz zu binden, die den Körper Ihrer Ansicht automatisch aktualisieren, wenn sich der Bildstatus ändert.
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 ( ) }
}
}Dieses Framework basiert auf SDWebimage, das die erweiterte Anpassung und Konfiguration unterstützt, um die Nachfrage anderer Benutzer zu befriedigen.
Sie können mehrere Codierer -Plugins für das externe Bildformat registrieren. Sie können mehrere Caches (verschiedene Pfade und Konfiguration), mehrere Lader (URLSession und Fotos -URLs) registrieren. Sie können das Cache -Ablaufdatum, die Größe, die Priorität usw. in unserem Wiki steuern.
Der beste Ort, um diesen Setup -Code für die Swiftui -App zu setzen, ist es der 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
}Für weitere Informationen wird wirklich empfohlen, unsere Demo zu überprüfen und eine detaillierte API -Verwendung zu erlernen. Sie können auch einen Scheck in der neuesten API -Dokumentation für die erweiterte Verwendung durchführen.
Swiftui hat ein bekanntes Verhalten (Bug?) Bei Verwendung einer statigen Ansicht in List/LazyStack/LazyGrid . Nur die Top -Level -Ansicht kann einen eigenen @State/@StateObject enthalten, aber die Unterstruktur verliert den Status, wenn er aus dem Bildschirm herausrollt. WebImage/Animated ist jedoch beide staatlich. Um sicherzustellen, dass der Zustand synchronisiert bleibt, auch wenn sie aus dem Bildschirm geraten. Sie können einige Tricks verwenden.
Weitere Informationen finden Sie unter: https://twitter.com/fatbobman/status/157250700436807683?s=21&t=Z4fkawtmvjsgl-wkdjgreq
Kurz gesagt, es wird nicht empfohlen, dies zu tun:
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`
}
}
}
}
}Stattdessen unter Verwendung dieses Ansatzes:
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 )
}
}
}
} Swiftuis Button anwenden Sie Overlay auf seinen Inhalt (außer Text ) standardmäßig ist dies ein häufiger Fehler, um Code wie diesen zu schreiben, was seltsames Verhalten verursacht:
// Wrong
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
// NavigationLink create Button implicitly
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
}
} Stattdessen müssen Sie den .buttonStyle überschreiben, um den einfachen Stil oder den .renderingMode zu verwenden, um den ursprünglichen Modus zu verwenden. Sie können auch den .onTapGesture -Modifikator für die Berührungsbeschaffung verwenden. Sehen Sie, wie Sie die Overlay -Farbe für Bilder in Taste und NavigationLink deaktivieren können
// Correct
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
. buttonStyle ( PlainButtonStyle ( ) )
// Or
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
. renderingMode ( . original )
}
} Sowohl WebImage/AnimatedImage unterstützt das Vektorbild, indem sie die externen Codierer SVG/PDF verwenden. Sie sind jedoch intern anders.
AnimatedImage : Verwenden Sie Tech aus Apples Symbolbild und Vektorzeichnung, unterstützt dynamische Größenänderungen ohne Verlustdetails. Und es verwendet UIKIT/Appkit -basierte Implementierung und APIs. Wenn Sie möchten, bestehen Sie .context(.imageThumbnailPixelSize: size) um das Bitmap -Rendering zu verwenden und mehr Pixel zu erhalten.WebImage : Zeichnen Sie das Vektorbild in eine Bitmap -Version. Was genau wie normale PNG. Standardmäßig verwenden wir die Größe des Vektorbildinhalts (SVG -Leinwandgröße oder PDF -Medienboxgröße). Wenn Sie möchten, passieren Sie .context(.imageThumbnailPixelSize: size) , um mehr Pixel zu erhalten. Für das Bitmap -Rendering können Sie auch die SVG/PDF -Symbole mit benutzerdefinierten Farben (wie Symbolbildern) tönt, den .renderingMode(.template) und .tint(:) oder .foregroundColor(:) Modifikator, der SwiftUI.Image -Verhalten entspricht.
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 ( )
}Weitere Informationen finden Sie in Ihrer Benutzeroberfläche Konfigurieren und Anzeigen von Symbolbildern
SDWebimage selbst unterstützt viele benutzerdefinierte Lader (wie Firebase -Speicher und Fotototoskit), Caches (wie Yycache und Pincache) und Codierer (wie WebP und Avif, sogar Lottie).
Hier ist das Tutorial, diese externen Komponenten mit Swiftui -Umgebung einzurichten.
Sie können den Setup -Code in Ihre Swiftui App.init() -Methode einfügen.
@ 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 ( )
}
}
} Wenn Ihre App eine komplizierte AppDelegate -Klasse hat, geben Sie dort ein Setup -Code ein:
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 ( )
}
}
} Für einige benutzerdefinierte Lader müssen Sie die URL -Struktur mit einigen speziellen APIs erstellen, damit SDWebimage den Kontext von anderen SDKs abrufen kann, wie:
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_URLRepresentationFür einige benutzerdefinierte Codierer müssen Sie das Bild mit einigen Optionen anfordern, um das Verhalten zu steuern, z. B. Vektorbilder SVG/PDF. Denn Swiftui.image oder WebImage unterstützt überhaupt keine Vektorgrafik.
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 )Für Caches müssen Sie sich eigentlich keine Sorgen um irgendetwas machen. Es funktioniert nur nach dem Einrichten.
SDWebimagesWiftui unterstützt die Verwendung, wenn Ihr App -Ziel über eine Bereitstellungszielversion von weniger als iOS 14/macOS 11/tvOS 14/watchos 7 verfügt. Dies wird schwach mit Swiftui (Combine) mit dem Schreiben von Code mit verfügbarem Schreiben zur Laufzeit schwachen.
Um die Rückwärtseinsatz zu verwenden, müssen Sie die folgenden Dinge tun:
Fügen Sie -weak_framework SwiftUI -weak_framework Combine in Other Linker Flags Ihres App -Ziels Build -Einstellung. Sie können dies auch mit dem Optional Framework -Kontrollkästchen von Xcode tun. Es hat den gleichen Effekt.
Sie sollten feststellen, dass alle Swiftui -Frameworks von Dritten auch diese Build -Einstellung haben sollten, nicht nur SdwebimagesWiftui. Oder beim Ausführen auf iOS 12 -Gerät wird der Laufzeit -Dyld -Fehler beim Start ausgelöst.
Für die Bereitstellungszielversion unter iOS 12.2 (die erste Version, die Swift 5 Runtime Bündel im iOS -System gebündelt hat) müssen Sie die min -Bereitstellungszielversion von SDWebimagesWiftui ändern. Dies kann eine Nebenwirkung auf die Optimierung des Compilers haben und massive Warnungen für einige Frameworks auslösen.
Für iOS 12.2+ können Sie jedoch die MIN -Bereitstellungszielversion auf iOS 14 halten, keine zusätzlichen Warnungen oder Leistung für den iOS 14 -Kunden.
Weil Swift die min-Bereitstellungszielversion verwenden, um festzustellen, ob die von App gebündelte Swift-Laufzeit oder das integrierte System ( /usr/lib/swift/libswiftCore.dylib ) verknüpft werden soll.
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 Für den Karthago-Benutzer können Sie carthage update --no-build verwenden, um die Abhängigkeit herunterzuladen, dann die Bereitstellungszielversion des XCode-Projekts zu ändern und das Binärgerüst zu erstellen.
Für den SWIFTPM -Benutzer müssen Sie die lokale Abhängigkeit (mit dem Git -Submodule) verwenden, um die Bereitstellungszielversion zu ändern.
Für den Karthago -Benutzer wird das gebaute binäre Framework die Bibliothekentwicklung verwenden, um die Rückwärtsbeauftragung zu unterstützen.
Für Cocoapods -Benutzer können Sie die Plattformversionsvalidierung in PodFile überspringen mit:
platform :ios , '14.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPodsFügen Sie den gesamten Swiftui -Code mit der verfügbaren Annotation und Laufzeitprüfung wie folgt hinzu:
// 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 " ) )
}
}
} Um das Beispiel mit Swiftui auszuführen, folgt der Schritte:
SDWebImageSwiftUI.xcworkspace , warten Sie auf das Herunterladen der Testabhängigkeit.SDWebImageSwiftUIDemo -Schema (oder andere Plattformen) und führen Sie die Demo -Anwendung aus. HINWEIS: Die Podfile hier liegt daran, dass wir mit Cocoapods LIBs in die Demo integrieren, aber jetzt verwenden wir SPM.
Da Swiftui darauf abzielt, alle Apple -Plattformen zu unterstützen, macht unsere Demo auch eine Codebasis einschließlich:
Demo -Tipps:
Switch (klicken Sie mit der rechten Maustaste auf MacOS/Tippen Sie auf WatchOS), um zwischen WebImage und AnimatedImage zu wechseln.Reload (mit der rechten Maustaste auf MacOS/Taste auf WatchOS), um den Cache zu löschen.Swipe Left (Menüschaltfläche auf TVOS), um eine Bild -URL aus der Liste zu löschen.SDWebimagesWiftui hat einen Unit -Test, um die Codequalität zu erhöhen. Für Swiftui gibt es keine offizielle Testlösung für Unit -Tests von Apple.
Da Swiftui jedoch auf staatlich basiertes und zugeschriebenes Layout-System zugeschrieben wird, gibt es Open-Source-Projekte, die die Lösung bereitstellen:
.frame Modifier, .image -Wert). Wir verwenden dies, um AnimatedImage und WebImage zu testen. Außerdem ermöglicht die Inspektion auf native UIView/NSView.Den Test durchführen:
pod install im Root -Verzeichnis aus, um die Abhängigkeit zu installieren.SDWebImageSwiftUI.xcworkspace , warten Sie auf das Herunterladen der Testabhängigkeit.SDWebImageSwiftUITests -Schema und beginnen Sie mit der Prüfung.Wir haben die CI -Pipeline bereits eingerichtet, jeder PR wird den Testfall ausführen und den Testbericht in CodeCOV hochladen.
Neben allen oben genannten Dingen kann dieses Projekt auch die folgende Funktion auf der Swift -Plattform für SDWebimage selbst sicherstellen.
Dies bedeutet, dass dieses Projekt ein zentraler Anwendungsfall und eine nachgelagerte Abhängigkeit ist, die SDWebimage selbst zukünftige Entwicklung angetrieben hat.
Dreampiggy
SDWebimagesWiftui ist im Rahmen der MIT -Lizenz erhältlich. Weitere Informationen finden Sie in der Lizenzdatei.