Если вы поддерживаете только iOS 15+/macOS 12+ и не заботятся об анимированном формате изображения, попробуйте Asyncimage Swiftui's Asyncimage
Sdwebimageswiftui - это структура загрузки изображения Swiftui, которая основана на sdwebimage.
Он приносит все ваши любимые функции из Sdwebimage, например, асинхронное изображение, кэширование памяти/диска, воспроизведение и выступления с анимационным изображением.
Структура предоставляет различные виды структуры, которые API соответствуют руководству по структуре Swiftui. Если вы знакомы с Image , вы найдете это простым в использовании WebImage и AnimatedImage .
Из v3.0.0 SdwebimagesWiftui может быть составлен для платформы Visionos. Тем не менее, из -за отсутствия поддержки диспетчера пакетов (обновление инструментов необходимо), мы еще не поддерживаем Cocoapods/SPM.
Вы можете использовать только встроенную зависимость диспетчера пакетов Xcode для развития Visionos.
Чтобы запустить пример Visionos, вам нужно клонировать и добавить как SDWebImage , так и SDWebImageSwiftUI , открыть SDWebImageSwiftUI.xcworkspace и перетащите эти папки, чтобы стать локальной зависимостью пакета, см.
Если вы действительно хотите создать структуру вместо использования зависимости пакета Xcode, следуя приведенным ниже шагам ручных шагов:
SDWebImage.xcodeproj и создайте цель SDWebImage для платформы Visionos (измените MACH_O_TYPE на статическую библиотеку, если вам нужно)Carthage/Build/visionOS и скопируйте SDWebImage.framework в негоSDWebImageSwiftUI.xcodeproj и построить SDWebImageSwiftUI visionOS target Поскольку sdwebimageswiftui построен на вершине Sdwebimage, он предоставляет как не ящичные функции, так и расширенные мощные функции, которые вы можете понадобиться в приложениях реального мира. Проверьте нашу вики, когда вам нужно:
Вы также можете получить все преимущества от существующего сообщества с Sdwebimage. Вы можете иметь массивную поддержку формата изображений (GIF/APNG/WEBP/HEIF/AVIF/SVG/PDF) через плагины CODER, поддержка PHOTOKIT через SDWEBIMAGEPOTOSPLUGIN, интеграция Firebase через Firebaseui и т. Д.
Помимо всех этих функций, мы делаем оптимизацию для Swiftui, например, привязка, модификатор просмотра, используя тот же шаблон дизайна, чтобы стать хорошим гражданином Swiftui.
Эта структура находится в значительной степени разработкой, она рекомендуется использовать как можно больше последнего релиза (включая зависимость от SDWEBIMAGE).
Эта структура следует за семантической версией. Каждое изменение API-разрыва источника сталкивается с крупной версией.
Этот проект использует формат изменений, чтобы записать изменения. Проверьте ChangeLog.md о изменениях между версиями. Изменения также будут обновлены на странице выпуска.
Все отчеты о проблемах, запросы на функции, взносы и звезды GitHub приветствуются. Надеюсь на активную обратную связь и продвижение, если вы найдете эту структуру полезной.
iOS 14 (macOS 11) представляет Swiftui 2.0, которые сохраняют наиболее совместимые с API, но изменяют много внутренних поведений, что разрушает функцию sdwebimageswiftui.
От v3.0.0, sdwebimageswiftui Drop IOS 13 Поддержка. Чтобы использовать на iOS 13, просмотрите последнюю версию V2.x (или использование 2.x Branch) вместо этого.
Поскольку SDWEBIMAGE 6.0 представит CodeBase Swift/OBJC, этот репошерт будет мигрировать в репозиторие SDWebimage Core.
Но не волнуйтесь, мы будем использовать автоматическое наложение поперечного модуля, что означает, вы можете использовать:
import SwiftUI
import SDWebImageРаботает как:
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
Вы автоматически связываете SDWebImageSwiftUI , и именование этой библиотеки все равно будет сохранено в Target SPM. Таким образом, переход гладкий для большинства из вас, я не хочу сталкиваться с другой важной версией. 3.x является окончательной версией для Sdwebimageswiftui Выделенная репо
ПРИМЕЧАНИЕ. Для Super Advanced User, если вы используете какой-то пользовательский Swift Toolchain, обязательно передайте -Xfrontend -enable-cross-import-overlays
SdwebimagesWiftui доступен через Swift Package Manager.
Для интеграции приложений вам следует использовать Xcode 12 или выше, чтобы добавить этот пакет в цель вашего приложения. Для этого проверьте добавление зависимостей пакета в ваше приложение о пошаговом учебном пособии с использованием XCode.
Для автора Downstream Framework вы должны создать файл Package.swift в свой git Repo, а затем добавить следующую строку, чтобы отметить ваш фреймворк в зависимости от нашего sdwebimageswiftui.
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) Sdwebimageswiftui доступен через кокопод. Чтобы установить его, просто добавьте следующую строку в свой Podfile:
pod 'SDWebImageSwiftUI' Sdwebimageswiftui доступен через Карфаген.
github "SDWebImage/SDWebImageSwiftUI"
WebImage для загрузки сетевого изображения var body : some View {
WebImage ( url : URL ( string : " https://nokiatech.github.io/heif/content/images/ski_jump_1440x960.heic " ) ) { image in
image . resizable ( ) // Control layout like SwiftUI.AsyncImage, you must use this modifier or the view will use the image bitmap size
} placeholder : {
Rectangle ( ) . foregroundColor ( . gray )
}
// Supports options and context, like `.delayPlaceholder` to show placeholder only when error
. onSuccess { image , data , cacheType in
// Success
// Note: Data exist only when queried from disk cache or network. Use `.queryMemoryData` if you really need data
}
. indicator ( . activity ) // Activity Indicator
. transition ( . fade ( duration : 0.5 ) ) // Fade Transition with duration
. scaledToFit ( )
. frame ( width : 300 , height : 300 , alignment : . center )
} Примечание. Это WebImage с использованием Image для внутренней реализации, которое лучше всего совместимо для системы макета и анимации Swiftui. Но в отличие от Image Swiftui, которое не поддерживает анимированное изображение или векторное изображение, WebImage также поддерживает анимационное изображение (по умолчанию от v2.0.0).
Тем не менее, анимация WebImage обеспечивает простой вариант использования, поэтому она все еще рекомендуется использовать AnimatedImage для расширенных элементов управления, таких как прогрессивный рендеринг анимации, или рендеринг векторных изображений.
@ State var isAnimating : Bool = true
var body : some View {
WebImage ( url : URL ( string : " https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif " ) , isAnimating : $isAnimating ) ) // Animation Control, supports dynamic changes
// The initial value of binding should be true
. customLoopCount ( 1 ) // Custom loop count
. playbackRate ( 2.0 ) // Playback speed rate
. playbackMode ( . bounce ) // Playback normally to the end, then reversely back to the start
// `WebImage` supports advanced control just like `AnimatedImage`, but without the progressive animation support
} Примечание. Для индикатора вы также можете настраивать свои собственные. Например, iOS 14/watchOS 7 представляет новый ProgressView , который можно легко использовать через:
WebImage ( url : url )
. indicator ( . activity )Или вы можете просто написать как:
WebImage ( url : url )
. indicator {
Indicator { _ , _ in
ProgressView ( )
}
}AnimatedImage для игры анимации var body : some View {
Group {
AnimatedImage ( url : URL ( string : " https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif " ) , placeholderImage : . init ( systemName : " photo " ) ) // Placeholder Image
// Supports options and context, like `.progressiveLoad` for progressive animation loading
. onFailure { error in
// Error
}
. resizable ( ) // Resizable like SwiftUI.Image, you must use this modifier or the view will use the image bitmap size
. indicator ( . activity ) // Activity Indicator
. transition ( . fade ) // Fade Transition
. scaledToFit ( ) // Attention to call it on AnimatedImage, but not `some View` after View Modifier (Swift Protocol Extension method is static dispatched)
// Supports SwiftUI ViewBuilder placeholder as well
AnimatedImage ( url : url ) {
Circle ( ) . foregroundColor ( . gray )
}
// Data
AnimatedImage ( data : try ! Data ( contentsOf : URL ( fileURLWithPath : " /tmp/foo.webp " ) ) )
. customLoopCount ( 1 ) // Custom loop count
. playbackRate ( 2.0 ) // Playback speed rate
// Bundle (not Asset Catalog)
AnimatedImage ( name : " animation1.gif " , isAnimating : $isAnimating ) // Animation control binding
. maxBufferSize ( . max )
. onViewUpdate { view , context in // Advanced native view coordinate
// AppKit tooltip for mouse hover
view . toolTip = " Mouseover Tip "
// UIKit advanced content mode
view . contentMode = . topLeft
// Coordinator, used for Cocoa Binding or Delegate method
let coordinator = context . coordinator
}
}
} Примечание. AnimatedImage поддерживает как URL -адрес изображения, либо данные изображения для анимированного формата изображения. Которые используют анимационное изображение Sdwebimage для внутренней реализации. Обратите внимание на то, что, поскольку эта база на UIKIT/Appkit Reffrevable, некоторая передовая система Swiftui и анимационная система может работать не так, как ожидалось. Вам может понадобиться uikit/appkit и основная анимация, чтобы изменить нативное представление.
Примечание. AnimatedImage Некоторые методы, такие как .transition , .indicator и .aspectRatio имеют такое же именование, что и методы протокола SwiftUI.View . Но ARG получают другой тип. Это связано с тем, что AnimatedImage поддерживает использование с компонентом Uikit/Appkit и анимацией. Если вы найдете двусмысленность, используйте объявление полного типа вместо синтаксиса Dot Expression.
Примечание. Некоторые из методов AnimatedImage возвращают some View , новый модифицированный контент. Вы потеряете метод модификатора, связанный с типом. Для этого случая вы можете либо изменить порядок вызова метода, либо использовать собственное представление (фактически SDAnimatedImageView ) в .onViewUpdate , используйте API uikit/appkit для спасения.
// Using UIKit components
var body : some View {
AnimatedImage ( name : " animation2.gif " )
. indicator ( SDWebImageProgressIndicator . default ) // UIKit indicator component
. transition ( SDWebImageTransition . flipFromLeft ) // UIKit animation transition
}
// Using SwiftUI components
var body : some View {
AnimatedImage ( name : " animation2.gif " )
. indicator ( Indicator . progress ) // SwiftUI indicator component
. transition ( AnyTransition . flipFromLeft ) // SwiftUI animation transition
}Почему у нас есть два разных типа представления, это из -за текущего предела Swiftui. Но мы стремимся предоставить лучшее решение для всех вариантов использования.
Если вам не нужно анимированное изображение, предпочитайте использовать WebImage в первую очередь. Который ведет себя бесшовное, как встроенный вид Swiftui. Если Swiftui работает, это работает. Если Swiftui не работает, это тоже :)
Если вам нужно простое анимированное изображение, используйте WebImage . Которые обеспечивают основную поддержку анимированного изображения. Но это не поддерживает прогрессивную рендеринг анимации или векторное изображение, если вам это не волнует.
Если вам нужно мощное анимационное изображение, AnimatedImage - это то, что выберет. Помните, что он также поддерживает статическое изображение, вам не нужно проверять формат, просто используйте как его. Кроме того, некоторая мощная функция, такая как Uikit/Appkit Tint Color, Vector Image, конфигурация изображения символов, слоистое изображение TVOS, доступное только в AnimatedImage , но не в настоящее время в Swfitui.
Но поскольку AnimatedImage использует UIViewRepresentable и управляемое UIKIT, в настоящее время могут возникнуть некоторые небольшие несовместимые проблемы между UIKIT и Swiftui Mayout и системой анимации, или ошибки, связанные с самим Swiftui. Мы стараемся изо всех сил, чтобы соответствовать поведению Swiftui и предоставляем тот же API, что и WebImage , что позволяет легко переключаться между этими двумя типами, если это необходимо.
ImageManager для вашего собственного типа просмотра ImageManager - это класс, который соответствует протоколу объединения наблюдаемого объекта. Который является основным источником данных WebImage , который мы предоставили.
Для расширенного варианта использования, например, загрузка изображения в сложный график просмотра, который вы не хотите использовать WebImage . Вы можете напрямую связать свой тип представления с менеджером.
Это выглядит знакомо, как SDWebImageManager , но он создан для Swiftui World, который обеспечивает источник истины для загрузки изображений. Вам лучше использовать @ObservedObject Swiftui, чтобы привязать каждый экземпляр «Единый менеджер» для экземпляра вашего представления, который автоматически обновляет тело вашего представления при изменении состояния изображения.
struct MyView : View {
@ ObservedObject var imageManager = ImageManager ( )
var body : some View {
// Your custom complicated view graph
Group {
if imageManager . image != nil {
Image ( uiImage : imageManager . image! )
} else {
Rectangle ( ) . fill ( Color . gray )
}
}
// Trigger image loading when appear
. onAppear { self . imageManager . load ( url : url ) }
// Cancel image loading when disappear
. onDisappear { self . imageManager . cancel ( ) }
}
}Эта структура основана на SDWEBIMAGE, который поддерживает расширенную настройку и конфигурацию для удовлетворения спроса разных пользователей.
Вы можете зарегистрировать несколько плагинов кодера для внешнего формата изображения. Вы можете зарегистрировать несколько кэшей (разные пути и конфигурация), несколько загрузчиков (URLSession и URL -адреса фотографий). Вы можете управлять датой истечения срока действия кэша, размера, приоритета загрузки и т. Д. Все в нашей вики.
Лучшее место, чтобы поместить этот код настройки для приложения Swiftui, это AppDelegate.swift :
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
// Add WebP/SVG/PDF support
SDImageCodersManager . shared . addCoder ( SDImageWebPCoder . shared )
SDImageCodersManager . shared . addCoder ( SDImageAVIFCoder . shared )
SDImageCodersManager . shared . addCoder ( SDImageSVGCoder . shared )
SDImageCodersManager . shared . addCoder ( SDImagePDFCoder . shared )
// Add default HTTP header
SDWebImageDownloader . shared . setValue ( " image/webp,image/apng,image/*,*/*;q=0.8 " , forHTTPHeaderField : " Accept " )
// Add multiple caches
let cache = SDImageCache ( namespace : " tiny " )
cache . config . maxMemoryCost = 100 * 1024 * 1024 // 100MB memory
cache . config . maxDiskSize = 50 * 1024 * 1024 // 50MB disk
SDImageCachesManager . shared . addCache ( cache )
SDWebImageManager . defaultImageCache = SDImageCachesManager . shared
// Add multiple loaders with Photos Asset support
SDImageLoadersManager . shared . addLoader ( SDImagePhotosLoader . shared )
SDWebImageManager . defaultImageLoader = SDImageLoadersManager . shared
return true
}Для получения дополнительной информации действительно рекомендуется проверить нашу демонстрацию, чтобы узнать подробное использование API. Вы также можете получить чек на последней документации API для расширенного использования.
У Swiftui есть известное поведение (ошибка?) При использовании Stateful View в List/LazyStack/LazyGrid . Только вид верхнего уровня может содержать свой собственный @State/@StateObject , но субструктура потеряет состояние при прокрутке с экрана. Тем не менее, Webimage/Animated является оба государственным. Чтобы состояние сохранялось синхронизировать даже при прокрутке с экрана. Вы можете использовать некоторые трюки.
См. Подробнее: https://twitter.com/fatbobman/status/1572507700436807683?s=21&t=z4fkawtmvjsgl-wkdjgreq
Короче говоря, это не рекомендуется сделать:
struct ContentView {
@ State var imageURLs : [ String ]
var body : some View {
List {
ForEach ( imageURLs , id : . self ) { url in
VStack {
WebImage ( url ) // The top level is `VStack`
}
}
}
}
}Вместо этого, используя этот подход:
struct ContentView {
struct BodyView {
@ State var url : String
var body : some View {
VStack {
WebImage ( url )
}
}
}
@ State var imageURLs : [ String ]
var body : some View {
List {
ForEach ( imageURLs , id : . self ) { url in
BodyView ( url : url )
}
}
}
} Button Swiftui примените наложение на его содержание (кроме Text ) по умолчанию, это распространенная ошибка, чтобы написать код, который вызывает странное поведение:
// Wrong
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
// NavigationLink create Button implicitly
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
}
} Вместо этого вы должны переопределить .buttonStyle , чтобы использовать простой стиль или .renderingMode Вы также можете использовать модификатор .onTapGesture для обработки сенсорных. Посмотрите, как отключить цвет наложения для изображений внутри кнопки и навигации
// Correct
Button ( action : {
// Clicked
} ) {
WebImage ( url : url )
}
. buttonStyle ( PlainButtonStyle ( ) )
// Or
NavigationView {
NavigationLink ( destination : Text ( " Detail view here " ) ) {
WebImage ( url : url )
. renderingMode ( . original )
}
} Как WebImage/AnimatedImage поддерживает для визуализации векторного изображения с помощью внешних кодировщиков SVG/PDF . Однако они разные внутри.
AnimatedImage : используйте технологии из изображения символов Apple и векторного чертежа, поддерживает динамические изменения размера без деталей. И он использует реализацию и API на основе uikit/appkit. Если хотите, пройти .context(.imageThumbnailPixelSize: size) , чтобы использовать растровый рендеринг и получить больше пикселей.WebImage : рисует векторное изображение в растровую версию. Который как обычный PNG. По умолчанию мы используем размер содержимого вектора изображения (размер CVG Canvas или размер медиа -коробки PDF). Если хотите, передайте .context(.imageThumbnailPixelSize: size) , чтобы получить больше пикселей. Для рендеринга растрового изображения вы также можете подкрасить значки SVG/PDF с помощью пользовательских цветов (например, изображения символов), использовать .renderingMode(.template) и .tint(:) или .foregroundColor(:) модификатор, который соответствует поведению SwiftUI.Image .
var body : some View {
WebImage ( url : URL ( string : " https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/w3c.svg " ) )
. resizable ( )
. renderingMode ( . template )
. foregroundColor ( . red ) // or `.tint(:)`, `.accentColor(:)`
. scaledToFit ( )
} var body : some View {
AnimatedImage ( url : URL ( string : " https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/w3c.svg " ) , context : [ . imageThumbnailPixelSize : CGSize ( width : 100 , height : 100 ) ] )
. resizable ( )
. renderingMode ( . template )
// seems `.foregroundColor(:)` does effect `UIView.tintColor`, use `tint(:)` or `.accentColor(:)` instead.
// Or you can use `onViewCreate(:)` to get native `SDAnimatedImageView` and set `tintColor` (AppKit use `contentTintColor`)
. tint ( . red )
. scaledToFit ( )
}Смотрите больше: настройка и отображение символов в вашем пользовательском интерфейсе
Сам Sdwebimage поддерживает множество пользовательских погрузчиков (например, хранилище Firebase и Photoskit), кэши (например, Yycache и Pincache) и кодировщики (например, Webp и Avif, даже Lottie).
Вот учебное пособие по настройке этих внешних компонентов с помощью среды Swiftui.
Вы можете поместить код настройки в свой метод swiftui App.init() .
@ main
struct MyApp : App {
init ( ) {
// Custom Firebase Storage Loader
FirebaseApp . configure ( )
SDImageLoadersManager . shared . loaders = [ FirebaseUI . StorageImageLoader . shared ]
SDWebImageManager . defaultImageLoader = SDImageLoadersManager . shared
// WebP support
SDImageCodersManager . shared . addCoder ( SDImageWebPCoder . shared )
// AVIF support
SDImageCodersManager . shared . addCoder ( SDImageAVIFCoder . shared )
}
var body : some Scene {
WindowGroup {
ContentView ( )
}
}
} Или, если в вашем приложении есть сложный класс AppDelegate , поместите код настройки там:
class AppDelegate : NSObject , UIApplicationDelegate {
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? = nil ) -> Bool {
SDImageCachesManager . shared . caches = [ YYCache ( name : " default " ) ]
SDWebImageManager . defaultImageCache = SDImageCachesManager . shared
return true
}
}
@ main
struct MyApp : App {
@ UIApplicationDelegateAdaptor ( AppDelegate . self ) var appDelegate
var body : some Scene {
WindowGroup {
ContentView ( )
}
}
} Для некоторых пользовательских погрузчиков вам необходимо создать структуру URL с некоторыми специальными API, чтобы Sdwebimage мог извлечь контекст из других SDK, например:
let storageRef : StorageReference
let storageURL = NSURL . sd_URL ( with : storageRef ) as URL ?
// Or via convenience extension
let storageURL = storageRef . sd_URLRepresentation let asset : PHAsset
let photosURL = NSURL . sd_URL ( with : asset ) as URL ?
// Or via convenience extension
let photosURL = asset . sd_URLRepresentationДля некоторых пользовательских кодировщиков вам необходимо запросить изображение с некоторыми параметрами для управления поведением, такими как Vector Images SVG/PDF. Потому что Swiftui.image или Webimage вообще не поддерживает векторный график.
let vectorURL : URL ? // URL to SVG or PDF
WebImage ( url : vectorURL , context : [ . imageThumbnailPixelSize : CGSize ( width : 100 , height : 100 ) ] ) let lottieURL : URL ? // URL to Lottie.json
WebImage ( url : lottieURL , isAnimating : $isAnimating )Что касается кэши, вам на самом деле не нужно ни о чем беспокоиться. Это просто работает после настройки.
SdwebimagesWiftui поддерживает использование, когда цель вашего приложения имеет целевую версию развертывания меньше, чем iOS 14/macOS 11/TVOS 14/WatchOS 7. Что будет слабосвязывать Swiftui (Combine), чтобы позволить записать код с доступной проверкой во время выполнения.
Чтобы использовать обратное развертывание, вы должны сделать следующие вещи:
Добавить -weak_framework SwiftUI -weak_framework Combine в Other Linker Flags целевого приложения. Вы также можете сделать это, используя Optional Framework Xcode, есть такой же эффект.
Вы должны заметить, что все сторонние фреймворки Swiftui также должны иметь эту настройку сборки, а не только sdwebimageswiftui. Или при запуске на устройстве iOS 12 это запустит ошибку Dyld в среде выполнения при запуске.
Для целевой версии развертывания ниже iOS 12.2 (первая версия, которая в комплекте Swift 5 Runtime объединилась в системе iOS), вы должны изменить целевую версию MIN развертывания SdwebimagesWiftui. Это может повлиять на оптимизацию компилятора и вызвать массовые предупреждения для некоторых рамок.
Тем не менее, для iOS 12.2+ вы все равно можете сохранить целевую версию MIN развертывания в iOS 14, никаких дополнительных предупреждений или производительности замедлится для клиента iOS 14.
Потому что Swift использует целевую версию Min Deployment, чтобы определить, связать ли приложение в комплекте Swift Swift-Stime или систему встроенной One ( /usr/lib/swift/libswiftCore.dylib ).
post_install do | installer |
installer . pods_project . targets . each do | target |
target . build_configurations . each do | config |
config . build_settings [ 'IPHONEOS_DEPLOYMENT_TARGET' ] = '11.0' # version you need
end
end
end Для пользователя Carthage вы можете использовать carthage update --no-build для загрузки зависимости, а затем изменить целевую версию развертывания проекта Xcode и создать двоичную структуру.
Для пользователя SWIFTPM вы должны использовать локальную зависимость (с подмодулькой GIT), чтобы изменить целевую версию развертывания.
Для пользователя Карфагена встроенная бинарная структура будет использовать эволюцию библиотеки для поддержки обратного развертывания.
Для пользователя Cocoapods вы можете пропустить проверку версии платформы в Podfile с:
platform :ios , '14.0' # This does not effect your App Target's deployment target version, just a hint for CocoaPodsДобавьте весь код Swiftui с доступной аннотацией и проверкой времени выполнения, например:
// AppDelegate.swift
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ] ? ) -> Bool {
// ...
if #available ( iOS 14 , * ) {
window . rootViewController = UIHostingController ( rootView : ContentView ( ) )
} else {
window . rootViewController = ViewController ( )
}
// ...
}
// ViewController.swift
class ViewController : UIViewController {
var label : UILabel = UILabel ( )
override func viewDidLoad ( ) {
super . viewDidLoad ( )
view . backgroundColor = . white
view . addSubview ( label )
label . text = " Hello World iOS 12! "
label . sizeToFit ( )
label . center = view . center
}
}
// ContentView.swift
@ available ( iOS 14 . 0 , macOS 11 . 0 , tvOS 14 . 0 , watchOS 7 . 0 , * )
struct ContentView : View {
var body : some View {
Group {
Text ( " Hello World iOS 14! " )
WebImage ( url : URL ( string : " https://i.loli.net/2019/09/24/rX2RkVWeGKIuJvc.jpg " ) )
}
}
} Чтобы запустить пример, используя Swiftui, следуя шагам:
SDWebImageSwiftUI.xcworkspace , подождите, пока Swiftpm завершит загрузку тестовой зависимости.SDWebImageSwiftUIDemo (или другие платформы) и запустите демонстрационное приложение. Примечание. Podfile здесь заключается в том, что история мы используем кокопод для интеграции LIBS в демонстрацию, но теперь мы используем SPM.
Поскольку Swiftui нацелен на поддержку всех платформ Apple, наша демонстрация делает это также, одна кодовая база, включая:
Демо -советы:
Switch (щелкните правой кнопкой мыши на MacOS/нажмите на WatchOS), чтобы переключаться между WebImage и AnimatedImage .Reload (щелкните правой кнопкой мыши на MacOS/кнопке на WatchOS), чтобы очистить кэш.Swipe Left (кнопка меню на TVOS), чтобы удалить URL -адрес с изображением из списка.Sdwebimageswiftui имеет модульный тест для повышения качества кода. Для Swiftui нет официального модульного тестового решения, предоставленного Apple.
Однако, поскольку Swiftui основана на государственном и атридуционированной системе макета, существуют проекты с открытым исходным кодом, которые предоставляют решение:
.image , .frame . Мы используем это для тестирования AnimatedImage и WebImage . Это также позволяет осмотреть на собственную uiview/nsview.Чтобы запустить тест:
pod install в корневом каталоге для установки зависимости.SDWebImageSwiftUI.xcworkspace , подождите, пока Swiftpm завершит загрузку тестовой зависимости.SDWebImageSwiftUITests и начните тестирование.Мы уже настроили конвейер CI, каждый PR запустит тестовый пример и загружает отчет о тестировании в Codecov.
Помимо всех выше, этот проект также может обеспечить следующую функцию на платформе Swift для самого sdwebimage.
Это означает, что этот проект является одним из основных вариантов использования и нисходящей зависимости, которая само по себе привело к будущему развитию.
Dreampiggy
SdwebimagesWiftui доступен по лицензии MIT. Смотрите файл лицензии для получения дополнительной информации.