Si admite iOS 15+/MacOS 12+ solamente y no le importa el formato de imagen animada, pruebe la asyncimage de Swiftui
SDWebImagesWiftui es un marco de carga de imágenes Swiftui, que se basa en SDWebimage.
Trae todas sus características favoritas de SDWebimage, como la carga de imágenes Async, el almacenamiento en caché de memoria/disco, reproducción de imágenes animadas y actuaciones.
El marco proporciona las diferentes estructuras de vista, que API coinciden con la directriz del marco Swiftui. Si está familiarizado con Image , le resultará fácil usar WebImage y AnimatedImage .
Desde V3.0.0, SDWebimagesWiftui se puede compilar para la plataforma VisionOS. Sin embargo, debido a la falta de soporte de Administrador de paquetes (actualización de necesidades de herramientas), todavía no admitimos Cocoapods/SPM.
Solo puede usar la dependencia del Administrador de paquetes incorporado de Xcode para construir en VisisOS.
Para ejecutar el ejemplo de VisionOS, debe clonar y agregar SDWebImage y SDWebImageSwiftUI , abrir el SDWebImageSwiftUI.xcworkspace y arrastrar esas carpetas para convertirse en dependencia de los paquetes locales, consulte: Edición de un paquete como un paquete como un paquete local
Si realmente desea construir marco en lugar de usar la dependencia del paquete de Xcode, siguiendo los pasos manuales a continuación:
SDWebImage.xcodeproj y construir SDWebImage objetivo para la plataforma VisisOS (cambiar MACH_O_TYPE a la biblioteca estática si lo necesita)Carthage/Build/visionOS y copie SDWebImage.framework en élSDWebImageSwiftUI.xcodeproj y construir SDWebImageSwiftUI visionOS objetivo Dado que SDWebImagesWiftui está construido sobre SDWebimage, proporciona tanto las características fuera de caja como las características poderosas avanzadas que desee en las aplicaciones del mundo real. Revise nuestro wiki cuando lo necesite:
También puede obtener todos los beneficios de la comunidad existente con SDWebimage. Puede tener soporte de formato de imagen masivo (GIF/APNG/WebP/Heif/Avif/SVG/PDF) a través de complementos de codificadores, soporte Photokit a través de SDWebimagephotosplugin, Integración de Firebase a través de Firebaseui, etc.
Además de todas estas características, realizamos optimización para Swiftui, como el modificador de visión de enlace, utilizando el mismo patrón de diseño para convertirse en un buen ciudadano Swiftui.
Este marco está en gran desarrollo, se recomienda utilizar la última versión tanto como sea posible (incluida la dependencia de SDWebimage).
Este marco sigue al versiones semánticas. Cada cambio de API de descanso de la fuente aumentará una versión principal.
Este uso del proyecto Mantenga un formato ChangeLog para registrar los cambios. Verifique el ChangeLog.md sobre los cambios entre versiones. Los cambios también se actualizarán en la página de lanzamiento.
Todos los informes de problemas, solicitudes de funciones, contribuciones y estrellas de GitHub son bienvenidos. Espere comentarios y promoción activos si encuentra útil este marco.
iOS 14 (MacOS 11) introduce el Swiftui 2.0, que mantiene el más compatible con API, pero cambia muchos comportamientos internos, lo que rompe la función de SDWebimagesWiftui.
Desde V3.0.0, SDWebimagesWiftui Drop IOS 13 Soporte. Para usar en iOS 13, consulte la última versión v2.x (o usando la rama 2.x) en su lugar.
Dado que SDWebimage 6.0 introducirá la base de código Swift/OBJC mixta, este repositorio migrará al repositorio central de SDWebimage.
Pero no se preocupe, usaremos la superposición automática del módulo cruzado, lo que significa, puede usar:
import SwiftUI
import SDWebImagefunciona como:
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
Vinculará automáticamente el SDWebImageSwiftUI , y los nombres de esta biblioteca aún se conservarán en SPM Target. Entonces, la transición es suave para la mayoría de ustedes, no quiero aumentar otra versión importante. El 3.x es la versión final para SdWebimagesWiftui Repo dedicado
Nota: Para el usuario súper avanzado, si usa una cadena de herramientas Swift personalizada, asegúrese de pasar -Xfrontend -enable-cross-import-overlays
SDWebImagesWiftui está disponible a través de Swift Package Manager.
Para la integración de aplicaciones, debe usar Xcode 12 o superior, para agregar este paquete al objetivo de su aplicación. Para hacer esto, verifique la adición de dependencias de paquetes a su aplicación sobre el tutorial paso a paso usando Xcode.
Para el autor de Framework Atrewream, debe crear un archivo Package.swift .
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) SDWebimagesWiftui está disponible a través de Cocoapods. Para instalarlo, simplemente agregue la siguiente línea a su Podfile:
pod 'SDWebImageSwiftUI' SDWebimagesWiftui está disponible a través de Carthage.
github "SDWebImage/SDWebImageSwiftUI"
WebImage para cargar la imagen de red 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 )
} Nota: Esta WebImage utilizando Image para la implementación interna, que es el mejor compatible para el sistema de diseño y animación de Swiftui. Pero a diferencia de Image de Swiftui que no admite imagen animada o imagen vectorial, WebImage también admite una imagen animada (de forma predeterminada de v2.0.0).
Sin embargo, la animación WebImage proporciona un caso de uso común simple, por lo que todavía se recomienda usar AnimatedImage para controles avanzados como representación de animación progresiva o representación de imágenes vectoriales.
@ 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
} Nota: Para el indicador, también puede personalizar el suyo. Por ejemplo, iOS 14/WatchOS 7 introduce el nuevo ProgressView , que se puede usar fácilmente a través de:
WebImage ( url : url )
. indicator ( . activity )O simplemente puedes escribir como:
WebImage ( url : url )
. indicator {
Indicator { _ , _ in
ProgressView ( )
}
}AnimatedImage para reproducir animación 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
}
}
} Nota: AnimatedImage admite datos de URL de imagen o imagen para el formato de imagen animada. Que utilizan el ImageView animado de SDWebimage para la implementación interna. Presta atención a que, dado que esta base en UIKIT/AppKit representa, algún sistema avanzado de diseño y animación de Swiftui puede no funcionar como se esperaba. Es posible que necesite UIKIT/AppKit y Core Animation para modificar la vista nativa.
Nota: AnimatedImage algunos métodos como .transition ,. .indicator y .aspectRatio tienen el mismo nombre que los métodos de protocolo SwiftUI.View . Pero los args reciben el tipo diferente. Esto se debe a que AnimatedImage es compatible con el componente y animación UIKIT/AppKit. Si encuentra la ambigüedad, use la declaración de tipo completo en lugar de la sintaxis de expresión del punto.
Nota: Algunos de los métodos en AnimatedImage devolverán some View , un nuevo contenido modificado. Perderá el método de modificador relacionado con el tipo. Para este caso, puede reordenar la llamada del método o usar la vista nativa (en realidad SDAnimatedImageView ) en .onViewUpdate , use la API UIKIT/AppKit para rescate.
// 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
}Por qué tenemos dos tipos de vistas diferentes aquí, se debe al límite actual de Swiftui. Pero tenemos como objetivo proporcionar la mejor solución para todos los casos de uso.
Si no necesita una imagen animada, prefiera usar WebImage en primer lugar. Que se comporta a la visión swiftui sin costura como incorporada. Si Swiftui funciona, funciona. Si Swiftui no funciona, tampoco :)
Si necesita una imagen animada simple, use WebImage . Que proporcionan el soporte de imagen animada básica. Pero no es compatible con la representación de animación progresiva, ni la imagen vectorial, si no le importa.
Si necesita una imagen animada potente, AnimatedImage es la que debe elegir. Recuerde que también es compatible con la imagen estática, no necesita verificar el formato, solo use tal como está. Además, algunas características potentes como UIKIT/Appkit Tint Color, Vector Image, Symbol Image Configuration, TVOS Capeed Image, solo disponible en AnimatedImage pero actualmente no en SWFITUI.
Pero, debido a que AnimatedImage usa UIViewRepresentable e impulsado por UIKIT, actualmente puede haber algunos pequeños problemas incompatibles entre el diseño y el sistema de animación de Uikit y Swiftui, o errores relacionados con el propio Swiftui. Hacemos todo lo posible para igualar el comportamiento de Swiftui y proporcionar la misma API que WebImage , lo que facilita el cambio entre estos dos tipos si es necesario.
ImageManager para su propio tipo de vista El ImageManager es una clase que se ajusta al protocolo ObservableObject Combine. Cuál es la fuente de datos de obtención de datos de WebImage que proporcionamos.
Para un caso de uso avanzado, como cargar la imagen en el gráfico de vista complicada que no desea usar WebImage . Puede vincular directamente su propio tipo de vista con el administrador.
Parece familiar como SDWebImageManager , pero está construido para Swiftui World, que proporciona la fuente de la verdad para cargar imágenes. Será mejor que use @ObservedObject de Swiftui para vincular cada instancia de administrador individual para su instancia de vista, que actualiza automáticamente el cuerpo de su vista cuando cambió el estado de la imagen.
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 ( ) }
}
}Este marco se basa en SDWebimage, que admite la personalización y configuración avanzadas para satisfacer la demanda de diferentes usuarios.
Puede registrar múltiples complementos de codificador para el formato de imagen externo. Puede registrar múltiples cachés (diferentes rutas y configuración), múltiples cargadores (urlsession and Photos URL). Puede controlar la fecha de vencimiento de la memoria caché, el tamaño, la prioridad de descarga, etc. Todo en nuestro wiki.
El mejor lugar para poner este código de configuración para la aplicación Swiftui, es el 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
}Para obtener más información, se recomienda verificar nuestra demostración, para aprender el uso detallado de API. También puede tener un cheque en la última documentación de la API, para un uso avanzado.
Swiftui tiene un comportamiento conocido (¿un error?) Cuando se usa una vista en estado en List/LazyStack/LazyGrid . Solo la vista de nivel superior puede mantener su propia @State/@StateObject , pero la substrucción perderá el estado cuando se desplazará fuera de la pantalla. Sin embargo, WebImage/Animated es ambos con estado. Para garantizar que el estado se mantenga sincronizado incluso cuando se desplace fuera de la pantalla. Puedes usar algunos trucos.
Ver más: https://twitter.com/fatbobman/status/1572507700436807683?s=21&t=z4fkawtmvjsgl-wkdjgreq
En resumen, no se recomienda hacerlo:
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`
}
}
}
}
}En su lugar, usando este enfoque:
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 aplica una superposición a su contenido (excepto Text ) de forma predeterminada, este es un error común escribir un código como este, que causa un comportamiento extraño:
// Wrong
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
// NavigationLink create Button implicitly
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
}
} En su lugar, debe anular el .buttonStyle para usar el estilo simple o el .renderingMode para usar el modo original. También puede usar el modificador .onTapGesture para el manejo táctil. Vea cómo deshabilitar el color de superposición para imágenes dentro del botón y navegación
// Correct
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
. buttonStyle ( PlainButtonStyle ( ) )
// Or
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
. renderingMode ( . original )
}
} Tanto WebImage/AnimatedImage es para representar la imagen vectorial, utilizando los codificadores externos SVG/PDF . Sin embargo, son diferentes internamente.
AnimatedImage : use la tecnología de la imagen del símbolo de Apple y el dibujo vectorial, admite cambios de tamaño dinámico sin perder detalles. Y utiliza la implementación y API basadas en UIKIT/AppKit. Si lo desea, pase .context(.imageThumbnailPixelSize: size) para usar la representación de mapa de bits y obtener más píxeles.WebImage : dibuja la imagen vectorial en una versión de mapa de bits. Que al igual que el PNG normal. Por defecto, utilizamos el tamaño del contenido de la imagen vectorial (tamaño de lienzo SVG o tamaño de caja de medios PDF). Si lo desea, pase .context(.imageThumbnailPixelSize: size) para obtener más píxeles. Para la representación de mapa de bits, también puede teñir los iconos SVG/PDF con colores personalizados (como imágenes de símbolos), usar el .renderingMode(.template) y .tint(:) o .foregroundColor(:) modificador, que coincide con el comportamiento 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 ( )
}Vea más: Configuración y visualización de imágenes de símbolos en su interfaz de usuario
SDWebimage en sí, admite muchos cargadores personalizados (como el almacenamiento de Firebase y Photoskit), los cachés (como Yycache y Pincache) y codificadores (como WebP y AVIF, incluso Lottie).
Aquí está el tutorial para configurar estos componentes externos con el entorno Swiftui.
Puede colocar el código de configuración dentro de su método 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 ( )
}
}
} O, si su aplicación tiene una complicada clase AppDelegate , coloque el código de configuración allí:
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 ( )
}
}
} Para algunos de los cargadores personalizados, debe crear la estructura URL con algunas API especiales, para que SDWebimage pueda recuperar el contexto de otros SDK, como:
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_URLRepresentationPara algunos de los codificadores personalizados, debe solicitar la imagen con algunas opciones para controlar el comportamiento, como las imágenes vectoriales SVG/PDF. Porque Swiftui.Image o WebImage no es compatible con el gráfico Vector.
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 )Para los cachés, en realidad no necesita preocuparse por nada. Simplemente funciona después de la configuración.
SDWebImageSwiftui es compatible con el uso cuando su objetivo de aplicación tiene una versión de objetivo de implementación menos de iOS 14/macOS 11/tvos 14/watchos 7. Que será un enlace débil de swiftui (combinar) para permitir el código de escritura con la verificación disponible en el tiempo de ejecución.
Para usar la implementación hacia atrás, debe hacer las siguientes cosas:
Agregue -weak_framework SwiftUI -weak_framework Combine en la configuración de compilación de Other Linker Flags de su objetivo de su aplicación. También puede hacerlo utilizando la casilla de verificación Optional Framework de Xcode, tiene el mismo efecto.
Debe notar que todos los marcos de Swiftui de terceros también deberían tener esta configuración de compilación, no solo SDWebimagesWiftui. O cuando se ejecuta en el dispositivo iOS 12, activará el error de Dyld de tiempo de ejecución en el inicio.
Para la versión de destino de implementación debajo de iOS 12.2 (la primera versión que Swift 5 Runtime Bundled en el sistema iOS), debe cambiar la versión de destino de implementación MIN de SDWebimageSwiftui. Esto puede tener algún efecto secundario en la optimización del compilador y desencadenar advertencias masivas para algunos marcos.
Sin embargo, para iOS 12.2+, aún puede mantener la versión MIN Deploy de Target en iOS 14, sin advertencias adicionales o el rendimiento se ralentiza para el cliente iOS 14.
Debido a que Swift usa la versión MIN Deployment Target para detectar si vincular el tiempo de ejecución Swift de la aplicación Swift, o el sistema incorporado ( /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 Para el usuario de Carthage, puede usar carthage update --no-build para descargar la dependencia, luego cambiar la versión de destino de implementación del proyecto Xcode y construir el marco binario.
Para el usuario de SwiftPM, debe usar la dependencia local (con el submódulo Git) para cambiar la versión de destino de implementación.
Para el usuario de Carthage, el marco binario construido utilizará la evolución de la biblioteca para admitir la implementación hacia atrás.
Para el usuario de Cocoapods, puede omitir la validación de la versión de la plataforma en Podfile con:
platform :ios , '14.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPodsAgregue todo el código Swiftui con la anotación disponible y la verificación de tiempo de ejecución, como este:
// 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 " ) )
}
}
} Para ejecutar el ejemplo usando Swiftui, siguiendo los pasos:
SDWebImageSwiftUI.xcworkspace , espere a SWIFTPM terminando la descarga de la dependencia de la prueba.SDWebImageSwiftUIDemo (u otras plataformas) y ejecute la aplicación de demostración. Nota: El Podfile aquí es porque la historia usamos Cocoapods para integrar LIB en la demostración, pero ahora usamos SPM.
Dado que Swiftui tiene como objetivo admitir todas las plataformas de Apple, nuestra demostración también hace esto, una base de código que incluye:
Consejos de demostración:
Switch (haga clic con el botón derecho en MacOS/Toque en WatchOS) para cambiar entre WebImage y AnimatedImage .Reload (haga clic con el botón derecho en macOS/botón en WatchOS) para borrar el caché.Swipe Left (botón de menú en tvos) para eliminar una URL de imagen de la lista.SDWebImagesWiftui tiene una prueba unitaria para aumentar la calidad del código. Para Swiftui, no hay una solución oficial de prueba unitaria proporcionada por Apple.
Sin embargo, dado que Swiftui es un sistema de diseño implementado por el estado y se atribuye, existen proyectos de código abierto que proporcionan la solución:
.image modificador .frame , valor. Usamos esto para probar AnimatedImage y WebImage . También permite inspeccionar a UIView/nsview nativo.Para ejecutar la prueba:
pod install en el directorio raíz para instalar la dependencia.SDWebImageSwiftUI.xcworkspace , espere a SWIFTPM terminando la descarga de la dependencia de la prueba.SDWebImageSwiftUITests y comience a probar.Ya hemos configurado la tubería CI, cada PR ejecutará el caso de prueba y cargará el informe de prueba en CodeCov.
Además de todas las cosas anteriores, este proyecto también puede garantizar la siguiente función disponible en la plataforma Swift para SDWebimage en sí.
Lo que significa que este proyecto es un caso de uso central y una dependencia posterior, lo que impulsó el desarrollo futuro de SDWebimage en sí.
Dreampiggy
SDWebImagesWiftui está disponible bajo la licencia MIT. Consulte el archivo de licencia para obtener más información.