Si vous soutenez iOS 15 + / MacOS 12+ seulement et ne vous souciez pas du format d'image animé, essayez l'asyncimage de Swiftui
SDWebimagesWiftUi est un framework de chargement d'image Swiftui, basé sur SDWebimage.
Il apporte toutes vos fonctionnalités préférées de SDWebimage, comme le chargement d'image asynchrone, la mise en cache de mémoire / disque, la lecture d'image animée et les performances.
Le framework fournit les différentes structures de vue, dont l'API correspond à la ligne directrice du framework Swiftui. Si vous êtes familier avec Image , vous trouverez qu'il est facile d'utiliser WebImage et AnimatedImage .
De la v3.0.0, SDWebimagesWiftUi peut être compilé pour la plate-forme VisionOS. Cependant, en raison de la prise en charge du gestionnaire de packages manquant (Need Tools Update), nous ne prenons pas encore en charge Cocoapods / SPM.
Vous ne pouvez utiliser la dépendance du gestionnaire de package intégré du XCode pour construire VisionOS.
Pour exécuter l'exemple VisionOS, vous devez cloner et ajouter à la fois SDWebImage et SDWebImageSwiftUI , ouvrez le SDWebImageSwiftUI.xcworkspace et faites glisser ces dossiers pour devenir une dépendance locale, voir: modifier une dépendance à un package en tant que package local
Si vous souhaitez vraiment construire Framework au lieu d'utiliser la dépendance des packages de Xcode, en suivant les étapes manuelles ci-dessous:
SDWebImage.xcodeproj et construire une cible SDWebImage pour la plate-forme VisionOS (modifiez MACH_O_TYPE en bibliothèque statique si vous en avez besoin)Carthage/Build/visionOS et copier SDWebImage.framework dedansSDWebImageSwiftUI.xcodeproj et construire SDWebImageSwiftUI visionOS cible Étant donné que SDWebimagesWiftUi est construit sur SDWebimage, il fournit à la fois les fonctionnalités hors du boîtier ainsi que les fonctionnalités puissantes avancées que vous pourriez souhaiter dans les applications réelles. Vérifiez notre wiki lorsque vous avez besoin:
Vous pouvez également obtenir tous les avantages de la communauté existante avec SDWebimage. Vous pouvez avoir une prise en charge massive du format d'image (GIF / APNG / webp / heif / avif / svg / pdf) via des plugins de codeur, une prise en charge de la photobit via sdwebimagephotosplugin, l'intégration de la base de feu via Firebaseui, etc.
Outre toutes ces fonctionnalités, nous faisons l'optimisation pour Swiftui, comme la liaison, afficher le modificateur, en utilisant le même modèle de conception pour devenir un bon citoyen Swiftui.
Ce cadre est en cours de développement fortement, il est recommandé d'utiliser autant que possible la dernière version (y compris la dépendance SDWebimage).
Ce cadre suit le versioning sémantique. Chaque modification de l'API de rupture source passera en une version majeure.
Ce projet utilise le format Changelog pour enregistrer les modifications. Vérifiez le changelog.md sur les changements entre les versions. Les modifications seront également mises à jour dans la page de version.
Tous les rapports de problèmes, les demandes de fonctionnalités, les contributions et les étoiles GitHub sont les bienvenus. Espérez des commentaires et de la promotion actifs si vous trouvez ce cadre utile.
IOS 14 (MacOS 11) introduit le Swiftui 2.0, qui maintient le plus compatible API, mais modifie de nombreux comportements internes, ce qui brise la fonction de SdwebimagesWiftUi.
De la v3.0.0, SDWebimagesWiftUi supprime le support iOS 13. Pour utiliser sur iOS 13, consultez plutôt la dernière version V2.x (ou en utilisant la branche 2.x).
Étant donné que SDWEBIMAGE 6.0 introduira la base de code SWIFT / OBJC mixée, ce repo migrera dans le repo Core SDWeBimage.
Mais ne vous inquiétez pas, nous utiliserons la superposition automatique du module croisé, qui signifie que vous pouvez utiliser:
import SwiftUI
import SDWebImagePour fonctionner comme:
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
Vous lirez automatiquement le SDWebImageSwiftUI , et la dénomination de cette bibliothèque sera toujours conservée dans SPM Target. La transition est donc fluide pour la plupart d'entre vous, je ne veux pas baisser une autre version majeure. Le 3.x est la version finale de SdwebimagesWiftUi dédié au dépôt
Remarque: Pour l'utilisateur super avancé, si vous utilisez une chaîne d'outils Swift personnalisée, assurez-vous de passer -Xfrontend -enable-cross-import-overlays
SDWebimagesWiftUi est disponible via Swift Package Manager.
Pour l'intégration de l'application, vous devez utiliser Xcode 12 ou plus, pour ajouter ce package à votre objectif d'application. Pour ce faire, cochez l'ajout de dépendances de package à votre application sur le tutoriel étape par étape à l'aide de Xcode.
Pour l'auteur de Framework en aval, vous devez créer un fichier Package.swift dans votre réapprovisionnement git, puis ajoutez la ligne suivante pour marquer votre framework en dépendant de notre sdwebimageswiftui.
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) SDWebimagesWiftUi est disponible via Cocoapods. Pour l'installer, ajoutez simplement la ligne suivante à votre podfile:
pod 'SDWebImageSwiftUI' SDWebimagesWiftUi est disponible via Carthage.
github "SDWebImage/SDWebImageSwiftUI"
WebImage pour charger l'image réseau 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 )
} Remarque: Ce WebImage utilisant Image pour l'implémentation interne, qui est le meilleur compatible pour le système de mise en page et d'animation Swiftui. Mais contrairement à Image de Swiftui qui ne prend pas en charge l'image animée ou l'image vectorielle, WebImage prend également en charge l'image animée (par défaut, la v2.0.0).
Cependant, l'animation WebImage fournit un cas d'utilisation commun simple, il est donc toujours recommandé d'utiliser AnimatedImage pour des contrôles avancés comme le rendu progressif de l'animation ou le rendu d'image vectoriel.
@ 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
} Remarque: Pour l'indicateur, vous pouvez également personnaliser le vôtre. Par exemple, iOS 14 / Watchos 7 présente le nouveau ProgressView , qui peut être facilement utilisé via:
WebImage ( url : url )
. indicator ( . activity )Ou vous pouvez simplement écrire comme:
WebImage ( url : url )
. indicator {
Indicator { _ , _ in
ProgressView ( )
}
}AnimatedImage pour jouer à l'animation 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
}
}
} Remarque: AnimatedImage prend en charge à la fois l'URL d'image ou les données d'image pour le format d'image animé. Qui utilisent l'image animée de SDWebimage pour l'implémentation interne. Faites attention à ce que cette base sur Uikit / AppKit représentable, certains systèmes de mise en page et d'animation Swiftui avancés peuvent ne pas fonctionner comme prévu. Vous devrez peut-être Uikit / Appkit et Core Animation pour modifier la vue native.
Remarque: AnimatedImage Certaines méthodes comme .transition , .indicator et .aspectRatio ont la même dénomination que les méthodes de protocole SwiftUI.View . Mais les args reçoivent le type différent. En effet, AnimatedImage prend en charge à utiliser avec le composant et l'animation UIKIT / APPKIT. Si vous trouvez l'ambiguïté, utilisez la déclaration de type complet au lieu de la syntaxe d'expression de points.
Remarque: certaines des méthodes sur AnimatedImage renverront some View , un nouveau contenu modifié. Vous perdrez la méthode du modificateur lié au type. Pour ce cas, vous pouvez soit réorganiser l'appel de la méthode, soit utiliser la vue native (en fait SDAnimatedImageView ) dans .onViewUpdate , utilisez une API UIKit / Appkit pour le sauvetage.
// 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
}Pourquoi nous avons ici deux types de vue différents, c'est dû à la limite actuelle de Swiftui. Mais nous visions à fournir la meilleure solution pour tous les cas d'utilisation.
Si vous n'avez pas besoin d'image animée, préférez utiliser WebImage d'abord. Ce qui se comporte sans couture comme vue Swiftui intégrée. Si Swiftui fonctionne, cela fonctionne. Si Swiftui ne fonctionne pas non plus :)
Si vous avez besoin d'une image animée simple, utilisez WebImage . Qui fournissent le support d'image animé de base. Mais il ne prend pas en charge le rendu progressif de l'animation, ni l'image vectorielle, si vous ne vous souciez pas de cela.
Si vous avez besoin d'une image animée puissante, AnimatedImage est celui à choisir. N'oubliez pas qu'il prend également en charge l'image statique, vous n'avez pas besoin de vérifier le format, il suffit d'utiliser en tant que. En outre, une fonctionnalité puissante comme la couleur Uikit / AppKit Tint, l'image vectorielle, la configuration de l'image de symbole, l'image en couches TVOS, uniquement disponible dans AnimatedImage mais pas actuellement dans Swfitui.
Mais, parce que AnimatedImage utilise UIViewRepresentable et motivé par l'UIKIT, il peut actuellement y avoir de petits problèmes incompatibles entre UIKIT et Swiftui Dayout and Animation System, ou des bogues liés à Swiftui lui-même. Nous faisons de notre mieux pour correspondre au comportement Swiftui et fournissons la même API que WebImage , ce qui facilite la commutation entre ces deux types si nécessaire.
ImageManager pour votre propre type de vue L' ImageManager est une classe qui se conforme au protocole observableObject de combinaison. Qui est la source de données de base de base de WebImage que nous avons fournie.
Pour un cas d'utilisation avancé, comme charger l'image dans le graphique de vue compliqué que vous ne souhaitez pas utiliser WebImage . Vous pouvez lier directement votre propre type de vue avec le gestionnaire.
Il semble familier comme SDWebImageManager , mais il est conçu pour Swiftui World, qui fournit la source de vérité pour charger des images. Vous feriez mieux d'utiliser @ObservedObject de Swiftui pour lier chaque instance de gestionnaire pour votre instance de vue, qui mettent automatiquement à jour le corps de votre vue lorsque l'état de l'image a changé.
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 ( ) }
}
}Ce cadre est basé sur SDWebimage, qui prend en charge la personnalisation et la configuration avancées pour répondre à la demande des utilisateurs de différents utilisateurs.
Vous pouvez enregistrer plusieurs plugins de codeur pour le format d'image externe. Vous pouvez enregistrer plusieurs caches (différents chemins et configuration), multiples chargeurs (URLSession et URL de photos). Vous pouvez contrôler la date d'expiration du cache, la taille, le téléchargement de priorité, etc. Tout dans notre wiki.
Le meilleur endroit pour mettre ces code de configuration pour l'application Swiftui, c'est le 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
}Pour plus d'informations, il est vraiment recommandé de vérifier notre démo, d'apprendre une utilisation détaillée de l'API. Vous pouvez également faire un chèque sur la dernière documentation de l'API, pour une utilisation avancée.
Swiftui a un comportement connu (bug?) Lorsque vous utilisez une vue avec état dans List/LazyStack/LazyGrid . Seule la vue de niveau supérieur peut contenir son propre @State/@StateObject , mais la sous-structure perdra l'état lors de la défilement hors de l'écran. Cependant, WebImage / Animated est à la fois avec état. Pour s'assurer que l'État se synchronise même lorsque vous faites défiler hors de l'écran. Vous pouvez utiliser quelques astuces.
Voir plus: https://twitter.com/fatbobman/status/1572507700436807683?s=21&t=z4fkawtmvjsgl-wkdjgreq
Bref, il n'est pas recommandé de le faire:
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`
}
}
}
}
}Au lieu de cela, en utilisant cette approche:
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 )
}
}
}
} Button de SwiftUi applique une superposition à son contenu (sauf Text ) par défaut, c'est une erreur courante d'écrire du code comme celui-ci, ce qui provoque un comportement étrange:
// Wrong
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
// NavigationLink create Button implicitly
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
}
} Au lieu de cela, vous devez remplacer le .buttonStyle pour utiliser le style ordinaire, ou le .renderingMode pour utiliser le mode d'origine. Vous pouvez également utiliser le modificateur .onTapGesture pour la manipulation tactile. Voyez comment désactiver la couleur de superposition pour les images à l'intérieur du bouton et de la NavigationLink
// Correct
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
. buttonStyle ( PlainButtonStyle ( ) )
// Or
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
. renderingMode ( . original )
}
} À la fois WebImage/AnimatedImage prend en charge pour rendre l'image vectorielle, en utilisant les codeurs externes SVG/PDF . Cependant, ils sont différents en interne.
AnimatedImage : Utilisez la technologie de l'image symbole d'Apple et du dessin vectoriel, prend en charge les changements de taille dynamique sans les détails de perte. Et il utilise l'implémentation et les API basées sur l'UIKIT / APPKIT. Si vous le souhaitez, passez .context(.imageThumbnailPixelSize: size) pour utiliser le rendu bitmap et obtenir plus de pixels.WebImage : dessine l'image vectorielle dans une version bitmap. Qui comme PNG normal. Par défaut, nous utilisons la taille du contenu de l'image vectorielle (taille du canevas SVG ou taille de boîte de support PDF). Si vous le souhaitez, passez .context(.imageThumbnailPixelSize: size) pour obtenir plus de pixels. Pour le rendu bitmap, vous pouvez également teinter les icônes SVG / PDF avec des couleurs personnalisées (comme les images de symboles), utilisez le .renderingMode(.template) et .tint(:) ou .foregroundColor(:) Modifier, qui correspond à un comportement 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 ( )
}Voir plus: configurer et afficher des images de symboles dans votre interface utilisateur
SDWebimage lui-même, prend en charge de nombreux chargeurs personnalisés (comme le stockage de Firebase et Photoskit), les caches (comme Yycache et Pincache) et les codeurs (comme WebP et AVIF, même Lottie).
Voici le tutoriel pour configurer ces composants externes avec un environnement Swiftui.
Vous pouvez mettre le code de configuration dans votre méthode 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 ( )
}
}
} Ou, si votre application a compliqué la classe AppDelegate , mettez le code de configuration là-bas:
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 ( )
}
}
} Pour certains chargeurs personnalisés, vous devez créer la structure URL avec certaines API spéciales, afin que SDWeBimage puisse récupérer le contexte à partir d'autres SDK, comme:
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_URLRepresentationPour certains des codeurs personnalisés, vous devez demander l'image avec certaines options pour contrôler le comportement, comme les images vectorielles SVG / PDF. Parce que Swiftui.image ou WebImage ne prend pas du tout le graphique vectoriel.
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 )Pour les caches, vous n'avez en fait pas à vous soucier de quoi que ce soit. Cela fonctionne juste après la configuration.
SDWebimagesWiftUi prend en charge l'utilisation lorsque votre cible d'application a une version cible de déploiement inférieure à l'iOS 14 / macOS 11 / TVOS 14 / Watchos 7. Qui sera faible la liaison de Swiftui (combiner) pour permettre l'écriture de code avec le chèque disponible à l'exécution.
Pour utiliser le déploiement vers l'arrière, vous devez faire les choses de suivi:
Ajouter -weak_framework SwiftUI -weak_framework Combine dans le paramètre de construction Other Linker Flags de votre cible de votre application. Vous pouvez également le faire en utilisant la case à cocher Optional Framework de Xcode, il y a le même effet.
Vous devez remarquer que tous les frameworks Swiftui tiers devraient également avoir ce paramètre de construction, pas seulement SDWebimagesWiftui. Ou lors de l'exécution sur le périphérique iOS 12, il déclenchera l'erreur Dyld Runtime au démarrage.
Pour le déploiement de la version cible ci-dessous iOS 12.2 (la première version que Swift 5 Runtime a été groupe dans le système iOS), vous devez modifier la version cible de déploiement MIN de SDWebimagesWiftUi. Cela peut prendre un effet secondaire sur l'optimisation du compilateur et déclencher des avertissements massifs pour certains cadres.
Cependant, pour iOS 12.2+, vous pouvez toujours conserver la version cible de déploiement MIN à iOS 14, aucun avertissement supplémentaire ni ralentissement des performances pour le client iOS 14.
Parce que Swift utilise la version cible de déploiement MIN pour détecter s'il faut lier le runtime Swift Bundled Swift, ou le système intégré ( /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 Pour l'utilisateur de Carthage, vous pouvez utiliser carthage update --no-build pour télécharger la dépendance, puis modifier la version cible de déploiement du projet Xcode et créer le cadre binaire.
Pour l'utilisateur SWIFTPM, vous devez utiliser la dépendance locale (avec le sous-module GIT) pour modifier la version cible de déploiement.
Pour l'utilisateur de Carthage, le cadre binaire construit utilisera l'évolution de la bibliothèque pour prendre en charge le déploiement vers l'arrière.
Pour l'utilisateur de Cocoapods, vous pouvez ignorer la validation de la version de la plate-forme dans PodFile avec:
platform :ios , '14.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPodsAjoutez tout le code Swiftui avec la vérification de l'annotation et de l'exécution disponibles, comme ceci:
// 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 " ) )
}
}
} Pour exécuter l'exemple à l'aide de Swiftui, en suivant les étapes:
SDWebImageSwiftUI.xcworkspace , attendez SWIFTPM terminant le téléchargement de la dépendance du test.SDWebImageSwiftUIDemo (ou d'autres plates-formes) et exécutez l'application de démonstration. Remarque: le Podfile ici est parce que l'histoire nous utilisons des cocoapodes pour intégrer les LIB dans la démo, mais maintenant nous utilisons SPM.
Étant donné que Swiftui vise à prendre en charge toutes les plates-formes Apple, notre démo le fait également, une base de code comprenant:
Conseils de démonstration:
Switch (cliquez avec le bouton droit sur macOS / Appuyez sur WatchOS) pour basculer entre WebImage et AnimatedImage .Reload (cliquez avec le bouton droit sur macOS / Button sur WatchOS) pour effacer le cache.Swipe Left (bouton de menu sur TVOS) pour supprimer une URL d'image de la liste.SDWebimagesWiftUi a un test unitaire pour augmenter la qualité du code. Pour Swiftui, aucune solution de test unitaire officielle n'est fournie par Apple.
Cependant, comme Swiftui est basé sur l'État et le système de mise en page implémenté, il existe des projets open source qui fournissent la solution:
.frame .image . Nous l'utilisons pour tester AnimatedImage et WebImage . Il permet également à l'inspection de natif uiView / nsView.Pour exécuter le test:
pod install sur Root Directory pour installer la dépendance.SDWebImageSwiftUI.xcworkspace , attendez SWIFTPM terminant le téléchargement de la dépendance du test.SDWebImageSwiftUITests et commencez les tests.Nous avons déjà configuré le pipeline CI, chaque PR exécutera le cas de test et téléchargera le rapport de test sur codecov.
Outre toutes les choses ci-dessus, ce projet peut également garantir la fonction suivante disponible sur la plate-forme Swift pour SDWebimage lui-même.
Ce qui signifie que ce projet est un cas d'utilisation de base et une dépendance en aval, qui a motivé Sdwebimage lui-même le développement futur.
Dreampiggy
SDWebimagesWiftUi est disponible sous la licence MIT. Voir le fichier de licence pour plus d'informations.