2019-08-07 18:10:05 +08:00
# SDWebImageSwiftUI
2019-08-09 17:27:11 +08:00
[![CI Status ](https://travis-ci.org/SDWebImage/SDWebImageSwiftUI.svg?branch=master )](https://travis-ci.com/SDWebImage/SDWebImageSwiftUI)
2019-08-07 18:10:05 +08:00
[![Version ](https://img.shields.io/cocoapods/v/SDWebImageSwiftUI.svg?style=flat )](https://cocoapods.org/pods/SDWebImageSwiftUI)
[![License ](https://img.shields.io/cocoapods/l/SDWebImageSwiftUI.svg?style=flat )](https://cocoapods.org/pods/SDWebImageSwiftUI)
[![Platform ](https://img.shields.io/cocoapods/p/SDWebImageSwiftUI.svg?style=flat )](https://cocoapods.org/pods/SDWebImageSwiftUI)
2019-08-09 16:28:54 +08:00
[![Carthage compatible ](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat )](https://github.com/Carthage/Carthage)
[![SwiftPM compatible ](https://img.shields.io/badge/SwiftPM-Compatible-brightgreen.svg )](https://swift.org/package-manager/)
2019-08-07 18:10:05 +08:00
2019-08-07 18:51:28 +08:00
## What's for
2019-08-07 18:10:05 +08:00
2019-08-07 18:51:28 +08:00
This is an experimental project for [SDWebImage ](https://github.com/SDWebImage/SDWebImage ).
2019-08-09 18:29:29 +08:00
It aims to ensure the following function available for users and try to do some experiments for Swift platform.
2019-08-07 18:51:28 +08:00
+ Swift Package Manager integration
+ SwiftUI compatibility
+ Swift source code compatibility
2019-08-07 18:10:05 +08:00
2019-10-05 16:50:27 +08:00
Note we do not guarantee the public API stable for current status until v1.0 version. Since SwiftUI is a new platform for us, we need to investigate the API design.
2019-08-09 17:11:33 +08:00
2019-08-07 18:10:05 +08:00
## Requirements
2019-08-07 18:51:28 +08:00
+ Xcode 11+
+ iOS 13+
+ macOS 10.15+
+ tvOS 13+
+ watchOS 6+
2019-10-01 16:32:35 +08:00
+ Swift 5.1+
2019-08-07 18:51:28 +08:00
2019-08-07 18:10:05 +08:00
## Installation
2019-08-09 16:15:44 +08:00
#### CocoaPods
2019-08-07 18:10:05 +08:00
SDWebImageSwiftUI is available through [CocoaPods ](https://cocoapods.org ). To install
it, simply add the following line to your Podfile:
```ruby
pod 'SDWebImageSwiftUI'
```
2019-08-09 16:15:44 +08:00
#### Carthage
SDWebImageSwiftUI is available through [Carthage ](https://github.com/Carthage/Carthage ).
```
2019-08-09 17:11:33 +08:00
github "SDWebImage/SDWebImageSwiftUI"
2019-08-09 16:15:44 +08:00
```
#### Swift Package Manager
SDWebImageSwiftUI is available through [Swift Package Manager ](https://swift.org/package-manager/ ).
```swift
let package = Package(
dependencies: [
2019-10-22 23:22:29 +08:00
.package(url: "https://github.com/SDWebImage/SDWebImageSwiftUI.git", from: "0.4")
2019-08-09 16:15:44 +08:00
],
)
```
2019-08-07 18:51:28 +08:00
## Usage
2019-10-05 15:02:44 +08:00
### Using `WebImage` to load network image
2019-08-07 18:51:28 +08:00
2019-10-05 15:02:44 +08:00
- [x] Supports the placeholder and detail options control for image loading as SDWebImage.
- [x] Supports the success/failure/progress changes event for custom handling.
2019-08-07 18:51:28 +08:00
2019-10-01 16:32:35 +08:00
Note: Unlike `UIImageView` in UIKit, SwiftUI's `Image` does not support animation. This `WebImage` using `Image` for internal implementation and supports static image format only.
2019-08-07 18:51:28 +08:00
```swift
var body: some View {
2019-09-25 03:11:33 +08:00
WebImage(url: URL(string: "https://nokiatech.github.io/heif/content/images/ski_jump_1440x960.heic"))
2019-10-24 00:44:19 +08:00
.onSuccess { image, cacheType in
2019-10-03 18:13:19 +08:00
// Success
2019-10-24 00:44:19 +08:00
}
2019-10-01 16:32:35 +08:00
.resizable()
2019-08-07 18:51:28 +08:00
.scaledToFit()
.frame(width: 300, height: 300, alignment: .center)
}
```
2019-10-05 15:02:44 +08:00
### Using `AnimatedImage` to play animation
2019-08-07 18:51:28 +08:00
```swift
var body: some View {
2019-10-05 15:02:44 +08:00
Group {
2019-10-05 15:52:56 +08:00
// Network
AnimatedImage(url: URL(string: "https://raw.githubusercontent.com/liyong03/YLGIFImage/master/YLGIFImageDemo/YLGIFImageDemo/joy.gif"))
2019-10-24 00:44:19 +08:00
.onFailure { error in
2019-10-05 15:02:44 +08:00
// Error
2019-10-24 00:44:19 +08:00
}
2019-10-05 15:02:44 +08:00
.scaledToFit()
2019-10-05 15:52:56 +08:00
// Data
AnimatedImage(data: try! Data(contentsOf: URL(fileURLWithPath: "/tmp/foo.webp")))
2019-10-05 15:02:44 +08:00
.customLoopCount(1)
2019-10-05 15:52:56 +08:00
// Bundle (not Asset Catalog)
AnimatedImage(name: "animation1", isAnimating: $isAnimating)) // Animation control binding
2019-10-05 15:12:25 +08:00
.maxBufferSize(.max)
2019-10-05 15:02:44 +08:00
}
2019-08-07 18:51:28 +08:00
}
```
2019-10-05 15:02:44 +08:00
- [x] Supports network image as well as local data and bundle image
2019-10-05 15:52:56 +08:00
- [x] Supports animation control using the SwiftUI Binding
2019-10-05 15:02:44 +08:00
- [x] Supports advanced control like loop count, incremental load, buffer size.
2019-10-01 16:32:35 +08:00
Note: `AnimatedImage` supports both image url or image data for animated image format. Which use the SDWebImage's [Animated ImageView ](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#animated-image-50 ) for internal implementation.
2019-08-07 18:51:28 +08:00
2019-10-22 01:25:29 +08:00
Note: From v0.4.0, `AnimatedImage` supports watchOS as well. However, it's not backed by SDWebImage's [Animated ImageView ](https://github.com/SDWebImage/SDWebImage/wiki/Advanced-Usage#animated-image-50 ) like iOS/tvOS/macOS. It use some tricks and hacks because of the limitation on current Apple's API. It also use Image/IO decoding system, which means it supports GIF and APNG format only, but not external format like WebP.
2019-10-19 22:47:10 +08:00
2019-08-07 18:51:28 +08:00
## Demo
To run the example using SwiftUI, following the steps:
```
cd Example
pod install
```
2019-10-05 20:17:51 +08:00
Then open the Xcode Workspace to run the demo application.
Since SwiftUI is aimed to support all Apple platforms, our demo does this as well, one codebase including:
+ iOS (iPhone/iPad/Mac Catalyst)
+ macOS
+ tvOS
+ watchOS
Tips:
1. Use `Switch` (right-click on macOS) to switch between `WebImage` and `AnimatedImage` .
2. Use `Reload` (right-click on macOS/force press on watchOS) to clear cache.
2019-10-10 18:07:32 +08:00
3. Use `Swipe` to delete one image item.
2019-08-07 18:51:28 +08:00
## Screenshot
2019-10-03 14:42:29 +08:00
+ iOS Demo
2019-10-05 20:22:59 +08:00
< img src = 'https://raw.githubusercontent.com/SDWebImage/SDWebImageSwiftUI/master/Example/Screenshot/Demo-iOS.jpg' height = 960 / >
2019-10-03 14:42:29 +08:00
+ macOS Demo
2019-10-05 20:17:51 +08:00
< img src = 'https://raw.githubusercontent.com/SDWebImage/SDWebImageSwiftUI/master/Example/Screenshot/Demo-macOS.jpg' width = 960 / >
+ tvOS Demo
< img src = 'https://raw.githubusercontent.com/SDWebImage/SDWebImageSwiftUI/master/Example/Screenshot/Demo-tvOS.jpg' width = 960 / >
+ watchOS Demo
2019-10-05 20:22:59 +08:00
< img src = 'https://raw.githubusercontent.com/SDWebImage/SDWebImageSwiftUI/master/Example/Screenshot/Demo-watchOS.jpg' width = 480 / >
2019-08-07 18:51:28 +08:00
2019-08-07 18:10:05 +08:00
## Author
2019-08-07 18:51:28 +08:00
DreamPiggy
2019-08-07 18:10:05 +08:00
## License
SDWebImageSwiftUI is available under the MIT license. See the LICENSE file for more info.
2019-08-07 18:51:28 +08:00