iOS 15+/MacOS 12+ 만 지원하고 애니메이션 이미지 형식에 신경 쓰지 않으면 Swiftui의 비동기를 사용해보십시오.
sdwebimageswiftui는 sdwebimage를 기반으로하는 Swiftui 이미지 로딩 프레임 워크입니다.
비동기 이미지 로딩, 메모리/디스크 캐싱, 애니메이션 이미지 재생 및 성능과 같은 SDWebimage에서 좋아하는 모든 기능을 제공합니다.
이 프레임 워크는 API가 Swiftui 프레임 워크 가이드 라인과 일치하는 다른 View Structs를 제공합니다. Image 에 익숙하다면 WebImage 및 AnimatedImage 쉽게 사용할 수 있습니다.
v3.0.0에서 sdwebimageswiftui는 Visionos 플랫폼을 위해 컴파일 될 수 있습니다. 그러나 패키지 관리자 지원 부족 (필요 도구 업데이트)으로 인해 아직 Cocoapods/SPM을 지원하지 않습니다.
Xcode의 내장 패키지 관리자 종속성 만 사용하여 VisionOS를 구축 할 수 있습니다.
VisionOS 예제를 실행하려면 SDWebImage 및 SDWebImageSwiftUI 를 복제하고 추가하고 SDWebImageSwiftUI.xcworkspace 를 열고 해당 폴더를 드래그하여 로컬 패키지 의존성을 참조하십시오.
아래 수동 단계를 따라 Xcode의 패키지 종속성을 사용하는 대신 프레임 워크를 작성하려면 :
MACH_O_TYPE SDWebImage.xcodeproj 를 엽니 SDWebImage .Carthage/Build/visionOS 에서 디렉토리를 만들고 SDWebImage.framework 복사하십시오.SDWebImageSwiftUI.xcodeproj 열고 SDWebImageSwiftUI visionOS 대상을 구축하십시오 sdwebimageswiftui는 sdwebimage 위에 구축되었으므로 실제 앱에서 원하는 고급 기능뿐만 아니라 상자 외 기능을 모두 제공합니다. 필요할 때 위키를 확인하십시오.
SDWebimage를 사용하여 기존 커뮤니티의 모든 혜택을 얻을 수 있습니다. 코더 플러그인을 통해 대규모 이미지 형식 지원 (GIF/APNG/WEBP/HEIF/HEIF/AVIF/SVG/PDF), SDWebimagePhotosplugin을 통한 Photokit 지원, FireBaseui를 통한 Firebase 통합 등을 가질 수 있습니다.
이러한 모든 기능 외에도 우리는 동일한 디자인 패턴을 사용하여 우수한 Swiftui 시민이되기 위해 Swiftui와 같은 Swiftui에 대한 최적화를 수행합니다.
이 프레임 워크는 크게 개발 중이며 최신 릴리스를 가능한 한 SDWebimage 의존성을 포함하여 사용하는 것이 좋습니다.
이 프레임 워크는 시맨틱 버전을 따릅니다. 각 소스 브레이크 API 변경은 주요 버전으로 충돌합니다.
이 프로젝트는 변경 사항을 기록하기 위해 ChangEleg 형식을 유지합니다. 버전 간의 변경 사항에 대해 Changelog.md를 확인하십시오. 변경 사항은 릴리스 페이지에서도 업데이트됩니다.
모든 문제 보고서, 기능 요청, 기부금 및 GitHub 스타가 환영합니다. 이 프레임 워크가 유용하다고 생각되면 적극적인 피드백 및 홍보에 대한 희망.
iOS 14 (MACOS 11)는 Swiftui 2.0을 소개합니다. Swiftui 2.0은 API를 가장 많이 호환하지만 많은 내부 동작을 변경하여 SDWebimagesWiftUi의 기능을 깨뜨립니다.
v3.0.0에서 sdwebimageswiftui drop iOS 13 지원. iOS 13에서 사용하려면 최신 V2.x 버전 (또는 2.x 브랜치 사용)을 대신 체크 아웃하십시오.
sdwebimage 6.0은 혼합 된 Swift/OBJC 코드베이스를 소개하기 때문에이 repo는 sdwebimage core repo로 마이그레이션됩니다.
그러나 걱정하지 마십시오. 자동 크로스 모듈 오버레이를 사용할 것입니다.
import SwiftUI
import SDWebImage다음과 같은 작업
import SwiftUI
import SDWebImage
import SDWebImageSwiftUI // <-- Automatic infer this
SDWebImageSwiftUI 자동으로 연결하면이 라이브러리의 이름 지정은 여전히 SPM 대상에서 보존됩니다. 따라서 전환은 대부분의 사람들에게 매끄 럽습니다. 또 다른 주요 버전을 부딪 치고 싶지 않습니다. 3.x는 sdwebimageswiftui 전용 repo의 최종 버전입니다.
참고 : Super Advanced 사용자의 경우 사용자 정의 Swift Toolchain을 사용하는 경우 -Xfrontend -enable-cross-import-overlays 통과하십시오.
SDWEBIMAGESWIFTUI는 Swift Package Manager를 통해 제공됩니다.
앱 통합을 위해서는 Xcode 12 이상을 사용 하여이 패키지를 앱 대상에 추가해야합니다. 이렇게하려면 Xcode를 사용하여 단계별 자습서에 대한 앱에 패키지 종속성 추가를 확인하십시오.
다운 스트림 프레임 워크 저자의 경우 git repo에 Package.swift 를 작성한 다음 다음 줄을 추가하여 프레임 워크를 SDWEBIMAGESWIFTUI에 따라 표시해야합니다.
let package = Package (
dependencies : [
. package ( url : " https://github.com/SDWebImage/SDWebImageSwiftUI.git " , from : " 3.0.0 " )
] ,
) sdwebimageswiftui는 Cocoapods를 통해 제공됩니다. 설치하려면 Podfile에 다음 줄을 추가하십시오.
pod 'SDWebImageSwiftUI' sdwebimageswiftui는 Carthage를 통해 제공됩니다.
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 )
} 참고 : Swiftui 레이아웃 및 애니메이션 시스템에 가장 적합한 내부 구현에 Image 사용하는이 WebImage . 그러나 애니메이션 이미지 또는 벡터 이미지를 지원하지 않는 Swiftui의 Image 와 달리 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의 애니메이션 ImageView를 사용합니다. Uikit/Appkit 대표의 기반이므로 일부 고급 Swiftui 레이아웃 및 애니메이션 시스템이 예상대로 작동하지 않을 수 있습니다. 기본보기를 수정하려면 uikit/appkit 및 핵심 애니메이션이 필요할 수 있습니다.
참고 : AnimatedImage .transition , .indicator 및 .aspectRatio 와 같은 일부 방법은 SwiftUI.View 프로토콜 메소드와 동일한 이름을 갖습니다. 그러나 Args는 다른 유형을받습니다. 이는 AnimatedImage Uikit/Appkit 구성 요소 및 애니메이션과 함께 사용되기 때문입니다. 모호성이있는 경우 DOT 표현 구문 대신 전체 유형 선언을 사용하십시오.
참고 : AnimatedImage 의 일부 방법은 새로운 수정 된 컨텐츠 인 some View 반환합니다. 유형 관련 수정 자 메소드가 손실됩니다. 이 경우 메소드 호출을 재정렬하거나 .onViewUpdate 에서 기본보기 (실제로 SDAnimatedImageView )를 사용하여 Uikit/Appkit API를 사용하여 구조 할 수 있습니다.
// 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 View 내장으로 원활하게 작동합니다. Swiftui가 작동하면 작동합니다. Swiftui가 작동하지 않으면 다음에도 불구하고 :)
간단한 애니메이션 이미지가 필요한 경우 WebImage 사용하십시오. 기본 애니메이션 이미지 지원을 제공합니다. 그러나 신경 쓰지 않으면 점진적 애니메이션 렌더링이나 벡터 이미지를 지원하지 않습니다.
강력한 애니메이션 이미지가 필요한 경우 AnimatedImage 선택한 것입니다. 정적 이미지도 지원하고 형식을 확인할 필요가 없습니다. 또한 Uikit/Appkit Tint Color, Vector Image, Symbol Image Configuration, TVOS 레이어링 이미지와 같은 강력한 기능은 AnimatedImage 에서만 사용할 수 있지만 현재 SWFitui에서는 제공되지 않습니다.
그러나 AnimatedImage UIViewRepresentable 사용하고 Uikit에 의해 구동되기 때문에 현재 Uikit과 Swiftui 레이아웃 및 애니메이션 시스템 사이에 약간의 양립 할 수없는 문제가있을 수 있습니다. 우리는 Swiftui 동작과 일치하기 위해 최선을 다하고 WebImage 와 동일한 API를 제공하여 필요한 경우이 두 유형을 쉽게 전환 할 수 있습니다.
ImageManager 사용하십시오 ImageManager 는 Combine의 ObservableObject 프로토콜을 준수하는 클래스입니다. 이것이 우리가 제공 한 WebImage 의 핵심 페치 데이터 소스입니다.
WebImage 사용하고 싶지 않은 복잡한보기 그래프에 이미지를로드하는 것과 같은 고급 사용 사례의 경우. 관리자와 직접 뷰 유형을 직접 바인딩 할 수 있습니다.
SDWebImageManager 와 같이 익숙해 보이지만 Swiftui World를 위해 만들어졌으며 이미지를로드 할 수있는 진실의 원천을 제공합니다. Swiftui의 @ObservedObject 사용하여 각 단일 관리자 인스턴스를 뷰 인스턴스에 바인딩하는 것이 좋습니다.
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는 List/LazyStack/LazyGrid 에서 Stateful View를 사용할 때 알려진 동작 (버그?)을 가지고 있습니다. 최상위 뷰 만 자체 @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 )
}
}
}
} Swiftui의 Button 기본적으로 콘텐츠에 오버레이를 적용합니다 ( 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 수정자를 사용할 수도 있습니다. 내부 이미지의 오버레이 색상을 비활성화하는 방법보기 버튼 및 NavigationLink
// 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의 Symbol Image 및 Vector Drawing의 Tech를 사용하여 세부 사항을 상실하지 않고 동적 크기 변경을 지원합니다. 그리고 Uikit/Appkit 기반 구현 및 API를 사용합니다. 원하는 경우 비트 맵 렌더링을 사용하고 더 많은 픽셀을 얻으려면 .context(.imageThumbnailPixelSize: size) 통과하십시오.WebImage : 벡터 이미지를 비트 맵 버전으로 그립니다. 정상적인 PNG처럼. 기본적으로 벡터 이미지 컨텐츠 크기 (SVG 캔버스 크기 또는 PDF 미디어 상자 크기)를 사용합니다. 원하는 경우 .context(.imageThumbnailPixelSize: size) 통과하여 더 많은 픽셀을 얻으십시오. 비트 맵 렌더링의 경우 사용자 정의 색상 (기호 이미지와 같은)으로 SVG/PDF 아이콘을 착색 할 수도 있고 .renderingMode(.template) 및 .tint(:) 또는 .foregroundColor(:) Modifier를 사용하여 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 ( )
}더보기 : UI에서 심볼 이미지 구성 및 표시
sdwebimage 자체는 많은 맞춤형 로더 (Firebase Storage 및 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 ( )
}
}
} 일부 사용자 정의 로더의 경우 SDWebImage가 다른 SDK에서 컨텍스트를 검색 할 수 있도록 특수 API로 URL 구조물을 생성해야합니다.
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일부 사용자 정의 코더의 경우 벡터 이미지 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)의 약한 연결을 약화시켜 런타임에 사용 가능한 확인으로 코드를 작성할 수 있도록합니다.
Backward Deployment를 사용하려면 다음 작업을 수행해야합니다.
-weak_framework SwiftUI -weak_framework Combine App Target의 Other Linker Flags 빌드 설정에 결합하십시오. Xcode의 Optional Framework 확인란을 사용하여이를 수행 할 수 있습니다. 동일한 효과가 있습니다.
모든 제 3 자 Swiftui 프레임 워크에는 SDWebimagesWiftUI뿐만 아니라이 빌드 설정도 있어야합니다. 또는 iOS 12 장치에서 실행될 때 시작시 런타임 딜드 오류가 트리거됩니다.
iOS 12.2 아래의 배포 대상 버전 (iOS 시스템에서 Swift 5 런타임이 번들로 연결된 첫 번째 버전)의 경우 SDWebimagesWiftUI의 최소 배포 대상 버전을 변경해야합니다. 이것은 컴파일러의 최적화에 약간의 부작용이 발생할 수 있으며 일부 프레임 워크에 대한 대규모 경고를 유발할 수 있습니다.
그러나 iOS 12.2+의 경우 IOS 14 클라이언트의 경우 최소 배포 대상 버전을 iOS 14로 유지할 수 있습니다.
Swift는 Min Deployment Target 버전을 사용하여 앱 번들 SWIFT 런타임을 연결하는지 또는 시스템 내장 ( /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 Project의 배포 대상 버전을 변경하고 이진 프레임 워크를 구축 할 수 있습니다.
SWIFTPM 사용자의 경우 로컬 종속성 (GIT 하위 모드)을 사용하여 배포 대상 버전을 변경해야합니다.
Carthage 사용자의 경우 Built Binary Framework는 Library Evolution을 사용하여 후진 배치를 지원합니다.
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 역사적이기 때문에 코코 포드를 사용하여 LIB를 데모에 통합하지만 이제 SPM을 사용하기 때문입니다.
Swiftui는 모든 Apple 플랫폼을 지원하기 위해 다음을 포함하여 하나의 코드베이스 도이 작업을 수행합니다.
데모 팁 :
WebImage 와 AnimatedImage 사이를 전환하려면 Switch 사용하여 (MacOS/watchOS를 탭하십시오) 사용하십시오.Reload (WatchOS에서 MacOS/버튼을 마우스 오른쪽 버튼으로 클릭)를 사용하십시오.Swipe Left (TVOS의 메뉴 버튼)을 사용하여 목록에서 하나의 이미지 URL을 삭제하십시오.sdwebimageswiftui는 코드 품질을 높이기 위해 단위 테스트를 받았습니다. Swiftui의 경우 Apple이 제공하는 공식 단위 테스트 솔루션이 없습니다.
그러나 Swiftui는 상태 기반이며 구현 된 레이아웃 시스템이므로 솔루션을 제공하는 오픈 소스 프로젝트가 있습니다.
.frame modifier, .image value)를 검사하십시오. 우리는 이것을 사용하여 AnimatedImage 및 WebImage 테스트합니다. 또한 기본 UIView/NSView를 검사 할 수 있습니다.테스트를 실행하려면 :
pod install 실행하여 종속성을 설치하십시오.SDWebImageSwiftUI.xcworkspace 열고 SwiftPM 마감을 기다려 테스트 종속성 다운로드를 기다리십시오.SDWebImageSwiftUITests 체계를 선택하고 테스트를 시작하십시오.우리는 이미 CI 파이프 라인을 설정했으며 각 PR은 테스트 케이스를 실행하고 테스트 보고서를 CodeCov에 업로드합니다.
위의 모든 것 외에도이 프로젝트는 SDWEBIMAGE 자체를 위해 Swift 플랫폼에서 다음 기능을 사용할 수 있습니다.
즉,이 프로젝트는 하나의 핵심 사용 사례와 다운 스트림 의존성으로 SDWebimage 자체가 향후 개발을 주도했습니다.
DreamPiggy
sdwebimageswiftui는 MIT 라이센스로 제공됩니다. 자세한 내용은 라이센스 파일을 참조하십시오.