Jika Anda mendukung iOS 15+/macOS 12+ saja dan tidak peduli dengan format gambar animasi, coba asyncimage SwiftUi
SDWebImagesWiftUi adalah kerangka pemuatan gambar SwiftUi, yang berdasarkan SDWebImage.
Ini membawa semua fitur favorit Anda dari SDWebImage, seperti pemuatan gambar async, caching memori/disk, pemutaran gambar animasi dan pertunjukan.
Kerangka kerja menyediakan struct tampilan yang berbeda, yang API cocok dengan pedoman kerangka kerja SwiftUi. Jika Anda terbiasa dengan Image , Anda akan merasa mudah menggunakan WebImage dan AnimatedImage .
Dari v3.0.0, SDWebImagesWiftUi dapat dikompilasi untuk platform VisionOS. Namun, karena dukungan manajer paket yang kurang (perlu pembaruan alat), kami belum mendukung Cocoapods/SPM.
Anda hanya dapat menggunakan ketergantungan manajer paket built-in XCODE untuk membangun visiono.
Untuk menjalankan contoh VisionOS, Anda perlu mengkloning dan menambahkan SDWebImage dan SDWebImageSwiftUI , buka SDWebImageSwiftUI.xcworkspace dan seret folder tersebut untuk menjadi ketergantungan paket lokal, lihat: Mengedit paket sebagai paket lokal sebagai paket lokal
Jika Anda benar -benar ingin membangun kerangka kerja alih -alih menggunakan ketergantungan paket Xcode, mengikuti langkah -langkah manual di bawah ini:
SDWebImage.xcodeproj dan bangun SDWebImage untuk platform visionos (ubah MACH_O_TYPE ke pustaka statis jika Anda butuhkan)Carthage/Build/visionOS dan salin SDWebImage.framework ke dalamnyaSDWebImageSwiftUI.xcodeproj dan bangun SDWebImageSwiftUI visionOS target Karena SDWebImageSwiftUi dibangun di atas SDWebImage, ia menyediakan fitur out-of-box serta fitur-fitur kuat canggih yang mungkin Anda inginkan di aplikasi dunia nyata. Periksa wiki kami saat Anda membutuhkan:
Anda juga bisa mendapatkan semua manfaat dari komunitas yang ada di sekitar dengan SDWebImage. Anda dapat memiliki dukungan format gambar besar -besaran (GIF/APNG/WebP/Heif/AVIF/SVG/PDF) melalui plugin coder, dukungan photokit melalui sdwebimagephotosplugin, integrasi firebase melalui firebaseui, dll.
Selain semua fitur ini, kami melakukan optimasi untuk SwiftUi, seperti mengikat, melihat pengubah, menggunakan pola desain yang sama untuk menjadi warga negara SwiftUi yang baik.
Kerangka kerja ini sedang dalam pengembangan yang sangat besar, disarankan untuk menggunakan rilis terbaru sebanyak mungkin (termasuk ketergantungan SDWebImage).
Kerangka kerja ini mengikuti versi semantik. Setiap perubahan API break sumber akan menabrak versi utama.
Penggunaan proyek ini menjaga format changelog untuk merekam perubahan. Periksa changelog.md tentang perubahan antar versi. Perubahan juga akan diperbarui di halaman rilis.
Semua laporan masalah, permintaan fitur, kontribusi, dan bintang GitHub disambut. Berharap untuk umpan balik dan promosi aktif jika Anda menemukan kerangka kerja ini bermanfaat.
iOS 14 (MacOS 11) memperkenalkan SwiftUi 2.0, yang membuat API paling kompatibel, tetapi mengubah banyak perilaku internal, yang merusak fungsi SDWebImagesWiftUi.
Dari v3.0.0, SDWebImagesWiftUi Drop iOS 13 Dukungan. Untuk menggunakan di iOS 13, periksa versi V2.X terbaru (atau menggunakan 2.x cabang) sebagai gantinya.
Karena SDWebImage 6.0 akan memperkenalkan basis kode SWIFT/OBJC campuran, repo ini akan bermigrasi ke repo inti SDWebImage.
Tapi jangan khawatir, kami akan menggunakan overlay modul silang otomatis, yang berarti, Anda dapat menggunakan:
import SwiftUI
import SDWebImageuntuk bekerja seperti:
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
Anda akan secara otomatis menautkan SDWebImageSwiftUI , dan penamaan perpustakaan ini masih akan disimpan dalam target SPM. Jadi transisinya halus untuk sebagian besar dari Anda, saya tidak ingin menabrak versi utama lainnya. 3.x adalah versi final untuk repo khusus sdwebimageswiftUi
Catatan: Untuk pengguna super canggih, jika Anda menggunakan beberapa swift toolchain khusus, pastikan untuk lulus -Xfrontend -enable-cross-import-overlays
SDWebImageSwiftUi tersedia melalui Swift Package Manager.
Untuk integrasi aplikasi, Anda harus menggunakan Xcode 12 atau lebih tinggi, untuk menambahkan paket ini ke target aplikasi Anda. Untuk melakukan ini, periksa penambahan dependensi paket ke aplikasi Anda tentang tutorial langkah demi langkah menggunakan Xcode.
Untuk penulis kerangka hilir, Anda harus membuat file Package.swift ke repo git Anda, lalu tambahkan baris berikut untuk menandai kerangka kerja Anda tergantung pada sdwebimageSwiftUi kami.
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) SDWebImagesWiftUi tersedia melalui cocoapods. Untuk menginstalnya, cukup tambahkan baris berikut ke podfile Anda:
pod 'SDWebImageSwiftUI' SDWebImagesWiftUi tersedia melalui Carthage.
github "SDWebImage/SDWebImageSwiftUI"
WebImage untuk Memuat Gambar Jaringan 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 )
} Catatan: WebImage ini menggunakan Image untuk implementasi internal, yang merupakan yang terbaik untuk sistem tata letak dan animasi SwiftUi. Tetapi tidak seperti Image SwiftUi yang tidak mendukung gambar animasi atau gambar vektor, WebImage juga mendukung gambar animasi (secara default dari v2.0.0).
Namun, animasi WebImage memberikan kasus penggunaan umum sederhana, jadi masih disarankan untuk menggunakan AnimatedImage untuk kontrol canggih seperti rendering animasi progresif, atau rendering gambar vektor.
@ 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
} Catatan: Untuk indikator, Anda juga dapat menyesuaikan sendiri. Misalnya, iOS 14/WatchOS 7 memperkenalkan ProgressView baru, yang dapat dengan mudah digunakan melalui:
WebImage ( url : url )
. indicator ( . activity )Atau Anda bisa menulis seperti:
WebImage ( url : url )
. indicator {
Indicator { _ , _ in
ProgressView ( )
}
}AnimatedImage untuk bermain animasi 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
}
}
} Catatan: AnimatedImage mendukung URL gambar atau data gambar untuk format gambar animasi. Yang menggunakan Imageview Animasi SDWebImage untuk implementasi internal. Perhatikan bahwa karena basis ini di UIKIT/APPKIT diwakili, beberapa tata letak SwiftUi dan sistem animasi canggih mungkin tidak berfungsi seperti yang diharapkan. Anda mungkin memerlukan uikat/appkit dan animasi inti untuk memodifikasi tampilan asli.
CATATAN: AnimatedImage beberapa metode seperti .transition , .indicator dan .aspectRatio memiliki penamaan yang sama dengan metode protokol SwiftUI.View . Tetapi ARG menerima jenis yang berbeda. Ini karena AnimatedImage mendukung untuk digunakan dengan komponen dan animasi UIKIT/APPKIT. Jika Anda menemukan ambiguitas, gunakan deklarasi tipe penuh alih -alih sintaks ekspresi titik.
Catatan: Beberapa metode pada AnimatedImage akan mengembalikan some View , konten yang dimodifikasi baru. Anda akan kehilangan metode pengubah terkait tipe. Untuk kasus ini, Anda dapat memesan ulang panggilan metode, atau menggunakan tampilan asli (sebenarnya SDAnimatedImageView ) di .onViewUpdate , gunakan UIKIT/API API untuk penyelamatan.
// 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
}Mengapa kami memiliki dua jenis tampilan yang berbeda di sini, adalah karena batas SwiftUi saat ini. Tapi kami bertujuan untuk memberikan solusi terbaik untuk semua kasus penggunaan.
Jika Anda tidak memerlukan gambar animasi, lebih suka menggunakan WebImage terlebih dahulu. Yang berperilaku mulus sebagai tampilan SwiftUi bawaan. Jika SwiftUi berfungsi, itu berfungsi. Jika SwiftUi juga tidak berhasil, itu :)
Jika Anda memerlukan gambar animasi sederhana, gunakan WebImage . Yang menyediakan dukungan gambar animasi dasar. Tapi itu tidak mendukung rendering animasi progresif, atau gambar vektor, jika Anda tidak peduli tentang ini.
Jika Anda membutuhkan gambar animasi yang kuat, AnimatedImage adalah yang harus dipilih. Ingat juga mendukung gambar statis, Anda tidak perlu memeriksa formatnya, gunakan saja. Juga, beberapa fitur yang kuat seperti warna warna UIKIT/APPKIT, gambar vektor, konfigurasi gambar simbol, gambar berlapis TVOS, hanya tersedia di AnimatedImage tetapi tidak saat ini di SWFitui.
Tetapi, karena AnimatedImage menggunakan UIViewRepresentable dan didorong oleh UIKIT, saat ini mungkin ada beberapa masalah kecil yang tidak kompatibel antara tata letak dan swiftUi dan sistem animasi, atau bug yang terkait dengan SwiftUi itu sendiri. Kami mencoba yang terbaik untuk mencocokkan perilaku SwiftUi, dan memberikan API yang sama dengan WebImage , yang membuatnya mudah untuk beralih di antara kedua jenis ini jika diperlukan.
ImageManager untuk jenis tampilan Anda sendiri The ImageManager adalah kelas yang sesuai dengan protokol Combine ObservableObject. Yang merupakan sumber data inti dari WebImage yang kami berikan.
Untuk kasus penggunaan lanjutan, seperti memuat gambar ke dalam grafik tampilan rumit yang tidak ingin Anda gunakan WebImage . Anda dapat secara langsung mengikat jenis tampilan Anda sendiri dengan manajer.
Tampak akrab seperti SDWebImageManager , tetapi dibangun untuk SwiftUi World, yang menyediakan sumber kebenaran untuk memuat gambar. Anda sebaiknya menggunakan swiftui's @ObservedObject untuk mengikat setiap instance manajer tunggal untuk instance tampilan Anda, yang secara otomatis memperbarui tubuh tampilan Anda ketika status gambar berubah.
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 ( ) }
}
}Kerangka kerja ini didasarkan pada SDWebImage, yang mendukung kustomisasi dan konfigurasi lanjutan untuk memenuhi permintaan pengguna yang berbeda.
Anda dapat mendaftarkan beberapa plugin coder untuk format gambar eksternal. Anda dapat mendaftarkan beberapa cache (jalur dan konfigurasi yang berbeda), beberapa loader (URLSesi dan URL foto). Anda dapat mengontrol tanggal kedaluwarsa cache, ukuran, prioritas unduhan, dll. Semua di wiki kami.
Tempat terbaik untuk menempatkan kode pengaturan ini untuk aplikasi SwiftUi, ini adalah 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
}Untuk informasi lebih lanjut, sangat disarankan untuk memeriksa demo kami, untuk mempelajari penggunaan API terperinci. Anda juga dapat melakukan cek di dokumentasi API terbaru, untuk penggunaan lanjutan.
SwiftUi memiliki perilaku yang diketahui (bug?) Saat menggunakan tampilan stateful dalam List/LazyStack/LazyGrid . Hanya tampilan tingkat atas yang dapat menahan @State/@StateObject , tetapi sub struktur akan kehilangan status saat menggulir keluar dari layar. Namun, webimage/animasi keduanya stateful. Untuk memastikan keadaan tetap sinkron bahkan ketika gulir keluar dari layar. Anda mungkin menggunakan beberapa trik.
Lihat lebih lanjut: https://twitter.com/fatbobman/status/1572507700436807683?s=21&t=z4fkawtmvjsgl-wkdjgreq
Singkatnya, tidak direkomendasikan untuk melakukannya:
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`
}
}
}
}
}Sebaliknya, menggunakan pendekatan ini:
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 SwiftUi menerapkan overlay ke kontennya (kecuali Text ) secara default, ini adalah kesalahan umum untuk menulis kode seperti ini, yang menyebabkan perilaku aneh:
// Wrong
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
// NavigationLink create Button implicitly
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
}
} Sebaliknya, Anda harus mengganti .buttonStyle untuk menggunakan gaya polos, atau .renderingMode untuk menggunakan mode asli. Anda juga dapat menggunakan pengubah .onTapGesture untuk penanganan sentuh. Lihat Cara Menonaktifkan Warna Overlay Untuk Gambar Di Dalam Tombol dan NavigationLink
// Correct
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
. buttonStyle ( PlainButtonStyle ( ) )
// Or
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
. renderingMode ( . original )
}
} Kedua WebImage/AnimatedImage mendukung untuk membuat gambar vektor, dengan menggunakan coders eksternal SVG/PDF . Namun mereka berbeda secara internal.
AnimatedImage : Gunakan teknologi dari gambar simbol Apple dan gambar vektor, mendukung perubahan ukuran dinamis tanpa rincian kehilangan. Dan menggunakan implementasi dan API berbasis UIKIT/APPKIT. Jika Anda mau, lulus .context(.imageThumbnailPixelSize: size) untuk menggunakan rendering bitmap dan mendapatkan lebih banyak piksel.WebImage : Menggambar gambar vektor ke dalam versi bitmap. Yang seperti PNG normal. Secara default, kami menggunakan ukuran konten gambar vektor (ukuran kanvas SVG atau ukuran kotak media PDF). Jika Anda mau, lulus .context(.imageThumbnailPixelSize: size) untuk mendapatkan lebih banyak piksel. Untuk rendering bitmap, Anda juga dapat mewarnai ikon SVG/PDF dengan warna khusus (seperti gambar simbol), gunakan .renderingMode(.template) dan .tint(:) atau .foregroundColor(:) pengubah, yang cocok dengan perilaku 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 ( )
}Lihat lebih lanjut: Mengkonfigurasi dan menampilkan gambar simbol di UI Anda
SDWebImage itu sendiri, mendukung banyak loader khusus (seperti penyimpanan firebase dan photoskit), cache (seperti Yycache dan Pincache), dan coders (seperti Webp dan Avif, bahkan Lottie).
Berikut adalah tutorial untuk mengatur komponen eksternal ini dengan lingkungan SwiftUi.
Anda dapat meletakkan kode pengaturan di dalam metode swiftUi App.init() Anda.
@ 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 ( )
}
}
} Atau, jika aplikasi Anda memiliki kelas AppDelegate yang rumit, letakkan kode pengaturan di sana:
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 ( )
}
}
} Untuk beberapa loader khusus, Anda perlu membuat URL struct dengan beberapa API khusus, sehingga SDWebImage dapat mengambil konteks dari SDK lain, seperti:
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_URLRepresentationUntuk beberapa coder khusus, Anda perlu meminta gambar dengan beberapa opsi untuk mengontrol perilaku, seperti gambar vektor SVG/PDF. Karena SwiftUi.Image atau WebImage tidak mendukung grafik vektor sama sekali.
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 )Untuk cache, Anda sebenarnya tidak perlu khawatir tentang apa pun. Ini hanya berfungsi setelah pengaturan.
SDWEBIMAGEWIFTUI mendukung untuk digunakan ketika target aplikasi Anda memiliki versi target penyebaran kurang dari iOS 14/macOS 11/TVOS 14/watchOS 7. Yang akan lemah menghubungkan SwiftUi (Combine) untuk memungkinkan kode penulisan dengan cek yang tersedia saat runtime.
Untuk menggunakan penempatan mundur, Anda harus melakukan hal -hal berikut:
Tambahkan -weak_framework SwiftUI -weak_framework Combine di pengaturan pembuatan Other Linker Flags target aplikasi Anda. Anda juga dapat melakukan ini menggunakan kotak centang Optional Framework Xcode, ada efek yang sama.
Anda harus melihat bahwa semua kerangka kerja SwiftUi pihak ketiga harus memiliki pengaturan pembuatan ini juga, bukan hanya SDWebImageSwiftUi. Atau saat berjalan pada perangkat iOS 12, itu akan memicu kesalahan runtime dyld pada startup.
Untuk versi target penempatan di bawah iOS 12.2 (versi pertama yang dibundel swift 5 runtime dalam sistem iOS), Anda harus mengubah versi target penempatan min dari SDWebImageSwiftUi. Ini mungkin mengambil beberapa efek samping pada optimasi kompiler dan memicu peringatan besar untuk beberapa kerangka kerja.
Namun, untuk iOS 12.2+, Anda masih dapat menyimpan versi target penempatan min ke iOS 14, tidak ada peringatan tambahan atau kinerja yang melambat untuk klien iOS 14.
Karena Swift menggunakan versi target penyebaran min untuk mendeteksi apakah akan menautkan runtime swift yang dibundel aplikasi, atau sistem built-in ( /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 Untuk pengguna Carthage, Anda dapat menggunakan carthage update --no-build untuk mengunduh ketergantungan, kemudian mengubah versi target penyebaran proyek XCode dan membangun kerangka biner.
Untuk pengguna SwiftPM, Anda harus menggunakan ketergantungan lokal (dengan submodule GIT) untuk mengubah versi target penempatan.
Untuk pengguna Carthage, kerangka biner yang dibangun akan menggunakan evolusi perpustakaan untuk mendukung penyebaran ke belakang.
Untuk pengguna Cocoapods, Anda dapat melewatkan validasi versi platform di Podfile dengan:
platform :ios , '14.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPodsTambahkan semua kode SwiftUi dengan anotasi dan runtime check yang tersedia, seperti ini:
// 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 " ) )
}
}
} Untuk menjalankan contoh menggunakan SwiftUi, mengikuti langkah -langkah:
SDWebImageSwiftUI.xcworkspace , tunggu swiftpm menyelesaikan mengunduh ketergantungan tes.SDWebImageSwiftUIDemo (atau platform lain) dan jalankan aplikasi demo. Catatan: Podfile di sini adalah karena sejarah kami menggunakan cocoapods untuk mengintegrasikan lib ke dalam demo, tetapi sekarang kami menggunakan SPM.
Karena SwiftUi bertujuan untuk mendukung semua platform Apple, demo kami juga melakukan ini, satu basis kode termasuk:
Tips demo:
Switch (klik kanan pada macOS/ketuk pada watchOS) untuk beralih antara WebImage dan AnimatedImage .Reload (klik kanan pada macOS/tombol di WatchOS) untuk menghapus cache.Swipe Left (tombol menu di TVOS) untuk menghapus satu URL gambar dari daftar.SDWebImageSwiftUI memiliki tes unit untuk meningkatkan kualitas kode. Untuk SwiftUi, tidak ada solusi uji unit resmi yang disediakan oleh Apple.
Namun, karena SwiftUi adalah sistem tata letak yang diimplementasikan oleh negara bagian dan dikaitkan, ada proyek open source yang memberikan solusinya:
.frame , nilai .image ). Kami menggunakan ini untuk menguji AnimatedImage dan WebImage . Ini juga memungkinkan Inspect to Native UIVIEW/NSVIEW.Untuk menjalankan tes:
pod install pada direktori root untuk menginstal ketergantungan.SDWebImageSwiftUI.xcworkspace , tunggu swiftpm menyelesaikan mengunduh ketergantungan tes.SDWebImageSwiftUITests dan mulailah pengujian.Kami sudah mengatur pipa CI, setiap PR akan menjalankan test case dan mengunggah laporan pengujian ke Codecov.
Selain semua hal di atas, proyek ini juga dapat memastikan fungsi berikut yang tersedia pada platform Swift untuk SDWebImage itu sendiri.
Yang berarti, proyek ini adalah salah satu kasus penggunaan inti dan ketergantungan hilir, yang mendorong SDWebImage itu sendiri pengembangan di masa depan.
DreamPiggy
SDWebImagesWiftUi tersedia di bawah lisensi MIT. Lihat file lisensi untuk info lebih lanjut.