image format support SVG
productdevbook opened this issue · 30 comments
Can you add svg support?
SDWebImage’s decoding system is plugin based and extensiable.
Here we already have one https://github.com/SDWebImage/SDWebImageSVGCoder
Note this SVG plugin previously need a new UIView subclass SVGKImageView
. Which is not what AnimatedImage
based on. However, it can be applied with iOS 13’s native support via private API CoreSVG.framework
Checkout that SVGCoder’s https://github.com/SDWebImage/SDWebImageSVGCoder/tree/iOS13_SVG branch, which can be used with our AnimatedImage
struct (because SDAnimatedImageView is subclass of UIImageView)
However, seems the best vector format on iOS platform. is the PDF, which Apple have all built-in support. I strongly recommend to create Vector PDF instead. Which is portable and easy to use compared to SVG.
Using https://github.com/SDWebImage/SDWebImagePDFCoder can simply add support to PDF vector without lossing details, you can try to use our demo and run the showcase code.
I'm not adding xcode. Dont You have a library for SwiftUI.
I'm not adding xcode. Dont You have a library for SwiftUI.
Emm. I guess you means:
I can not add SDWebImagePDFCoder/SDWebImageSVGCoder to Xcode using SwiftPM ? Don't you have a SwiftPM library for that ?
Those two coder plugins does not support SwiftPM now. Because some of them, using the upstream dependency which does not support SwiftPM (dependency is a recursive problem). You can try to use CocoaPods firstly (try our demo, see readme), CocoaPods is easy and the most adoptable dependency manager in Cocoa.
But if you want, I can provide a special compatble version which use SwiftPM (those PDF/SVG coder)
@mkalayci35
PDFCoder support SwiftPM and watchOS: https://github.com/SDWebImage/SDWebImagePDFCoder/releases/tag/0.4.0
@mkalayci35
SVGCoder iOS13_SVG
branch support SwiftPM, watchOS, and remove the SVGKit: https://github.com/SDWebImage/SDWebImageSVGCoder/commits/iOS13_SVG
So, it's supported. Here is the run demo with some sample SVG/PDFs. Note only AnimatedImage
is supported, because it use a UIImageView
, where UIKit support it.
WebImage
and SwiftUI.Image
does not support PDF/SVG or any vector format, its layout system hard-coded to support bitmap image in their implementation (Developer can not as well). Send Radar to Apple's SwiftUI team, if you want next year's SwiftUI support vector format (I don't think they'll support this until a new major version release)
Can you send me the sample code?
No code actually. Just use the coders and AnimatedImage
, checkout the demo and readme again.
// AppDelegate.swift
import UIKit
import SDWebImage
import SDWebImageWebPCoder
import SDWebImagePDFCoder
import SDWebImageSVGCoder
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Add WebP support
SDImageCodersManager.shared.addCoder(SDImageWebPCoder.shared)
SDImageCodersManager.shared.addCoder(SDImagePDFCoder.shared)
SDImageCodersManager.shared.addCoder(SDImageSVGCoder.shared)
return true
}
}
// ContentView.swift
var body: some View {
AnimatedImage(url: "https://raw.githubusercontent.com/icons8/flat-color-icons/master/pdf/stack_of_photos.pdf")
}
Specify branch. I already mentioned, use iOS13_SVG
branch.
Or just use CocoaPods. I don't like SwiftUI actually (it's a young toy with compared to other package manager for real-world complicated software develop and dependency).
target 'SDWebImageSwiftUIDemo' do
platform :ios, '13.0'
pod 'SDWebImageSwiftUI', :path => '../'
pod 'SDWebImageWebPCoder'
pod 'SDWebImagePDFCoder'
pod 'SDWebImageSVGCoder', :git => 'https://github.com/SDWebImage/SDWebImageSVGCoder.git', :branch => 'iOS13_SVG'
end
SwiftUI is good for me. Increased my coding and design skills. I just started writing. Well, can't you make the Swift Pack compatible? I don't want to upload pods :(
Specify branch. I already mentioned, use
iOS13_SVG
branch.
This is compatible. Use the branch dependency of SwiftPM.
I can not merge that into master and release, for now. Because all current user who use that framework, it's desigend to use SVGKit (another SVG parser), and support iOS 8+. I'm a framework author, should not break my user's code. Or user will blame you. This is the responsibility.
I'm considered to release a major version bump for SVGCoder (which drop SVGKit support). But this need extra consideration (such like naming ? How my current user migrate ? How can these two solution be used seamlessly). There're things to considerate and need time.
For now, just use the branch dependency. You can see that Xcode GUI have a nice checkbox to use Branch
and Commit
dependency, right ? :)
oo okay, https://github.com/SDWebImage/SDWebImageSVGCoder/tree/iOS13_SVG I get it now. :) :D
I installed. Thank you very much. I got it late. Sorry :)
@mkalayci35 WebP coder does not support SwiftPM. This is because libwebp (The upstream dependency) does not support. Simple answer. The repo is maintained by Google. It's better to ask them for help.
If you want to see all our coder plugins to support SwfitPM, this need time. Previouslly, I need to wait the codec author (Google, for example, the maintainer of libwebp) to support it.
However, if they can not, we have another backup solution, to just fork their repo and provide one support. Though I don't like this, but it's a reasonable solution.
Or we can use our Carthage package repo: https://github.com/SDWebImage/libwebp-Xcode. To add support here. Here already a PR: SDWebImage/libwebp-Xcode#3
But since SwiftPM is sucked to just use Git Tag
for version. Which means, since there're already libwebp v1.0.3 version tagged. If I want to support SwiftPM, I have 3 choices:
- I can
Re-tag
that v1.0.3 tag, with another commit (This may break some users, since commit HASH changed) - I can
Re-create
another repo, but which make maintain a pain (Once libwebp release v1.0.4, we need to go through 3 independent git repo) - I can wait for Google to release v1.0.4. But from histroy, this need half a year. And for some codecs like libbpg or libaom, it does not get any version release since last year. Really slow to wait.
Both of them are not a really good idea for me. This is reason why I delay the support of our coder plugins for SwiftPM. Until some one have a better idea or we have to choose one.
@mkalayci35 The SDWebImageSVGCoder v1.0.0 released. We drop the original SVGKit support into another repo.
For you, the iOS13_SVG
branch is already merged and deleted. You can just using SwiftPM to specify ~> 1.0
version of the SVGCoder for usage.
@mkalayci35 Another note:
- Only
AnimatedImage
supports vector rendering. You can dynamic change to any size without lossing details.
The Animated ImageView will show a PDF
or SVG
label if it supports vector rendering.
- The
WebImage
does not support vector image. But it can use the bitmap rendering, which means we decode SVG/PDF as a bitmap image, but it will looks blur when scaling. You can check our Demo code to see how we do that: AppDelegate.swift
No code actually. Just use the coders and
AnimatedImage
, checkout the demo and readme again.// AppDelegate.swift import UIKit import SDWebImage import SDWebImageWebPCoder import SDWebImagePDFCoder import SDWebImageSVGCoder @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. // Add WebP support SDImageCodersManager.shared.addCoder(SDImageWebPCoder.shared) SDImageCodersManager.shared.addCoder(SDImagePDFCoder.shared) SDImageCodersManager.shared.addCoder(SDImageSVGCoder.shared) return true } } // ContentView.swift var body: some View { AnimatedImage(url: "https://raw.githubusercontent.com/icons8/flat-color-icons/master/pdf/stack_of_photos.pdf") }
thank you so much my app really work now Thank you so so much!!
How do you initialise the SVG Coder for a SwiftUI project? It doesn't have an AppDelegate file. Thanks!
How do you initialise the SVG Coder for a SwiftUI project? It doesn't have an AppDelegate file. Thanks!
For pure SwiftUI project, just use UIApplicationDelegateAdaptor
. See Apple's documentation.
https://developer.apple.com/documentation/swiftui/uiapplicationdelegateadaptor
https://www.hackingwithswift.com/quick-start/swiftui/what-is-the-uiapplicationdelegateadaptor-property-wrapper
Or you can just mixed to use AppDelegate and SwiftUI at the same time. SwiftUI is not magic, it still need UIHostingViewController
for hosting your pure SwiftUI view. AppDelegate is still here even you use @main
.
The SwiftUI.App
's main
method initialize one UIHostingViewController
and initialize a UIWindow in the implementation.
@dreampiggy I'm getting this error while following the instructions both on your comment and on this thread. Unless I'm missing something on a pure SwiftUI project. Thanks for the links btw!
@netgfx Found you're really new to iOS dev.
The UIApplicationDelegate, is a protocol, so, you must implementation the code in a protocol method.
Normally, put this into the https://developer.apple.com/documentation/appkit/nsapplicationdelegate/1428385-applicationdidfinishlaunching this method.
Suggestion: You can start learning iOS dev by a full tutorial, not just try something from the part. Like:
How can we change the colour of AnimatedImage
with the rendering mode template?