SDWebImage / SDWebImageSwiftUI

SwiftUI Image loading and Animation framework powered by SDWebImage
https://sdwebimage.github.io/SDWebImageSwiftUI
MIT License
2.15k stars 221 forks source link

image format support SVG #50

Closed productdevbook closed 4 years ago

productdevbook commented 4 years ago

Can you add svg support?

dreampiggy commented 4 years ago

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)

dreampiggy commented 4 years ago

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.

productdevbook commented 4 years ago

I'm not adding xcode. Dont You have a library for SwiftUI.

dreampiggy commented 4 years ago

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)

dreampiggy commented 4 years ago

@mkalayci35 PDFCoder support SwiftPM and watchOS: https://github.com/SDWebImage/SDWebImagePDFCoder/releases/tag/0.4.0

dreampiggy commented 4 years ago

@mkalayci35 SVGCoder iOS13_SVG branch support SwiftPM, watchOS, and remove the SVGKit: https://github.com/SDWebImage/SDWebImageSVGCoder/commits/iOS13_SVG

dreampiggy commented 4 years ago

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)

image

dreampiggy commented 4 years ago

macOS Demo as well:

image

productdevbook commented 4 years ago

Can you send me the sample code?

dreampiggy commented 4 years ago

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")
}
productdevbook commented 4 years ago
Screen Shot 2019-11-11 at 20 57 27
dreampiggy commented 4 years ago

Specify branch. I already mentioned, use iOS13_SVG branch.

dreampiggy commented 4 years ago

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
productdevbook commented 4 years ago

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 :(

dreampiggy commented 4 years ago

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 ? :)

productdevbook commented 4 years ago

oo okay, https://github.com/SDWebImage/SDWebImageSVGCoder/tree/iOS13_SVG I get it now. :) :D

productdevbook commented 4 years ago

I installed. Thank you very much. I got it late. Sorry :)

productdevbook commented 4 years ago

would you do that branch ıos 13 thank you

Screen Shot 2019-11-11 at 21 29 04
productdevbook commented 4 years ago

THANK YOU :)

Screen Shot 2019-11-11 at 21 57 00
dreampiggy commented 4 years ago

@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: https://github.com/SDWebImage/libwebp-Xcode/pull/3

dreampiggy commented 4 years ago

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:

  1. I can Re-tag that v1.0.3 tag, with another commit (This may break some users, since commit HASH changed)
  2. 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)
  3. 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.

dreampiggy commented 4 years ago

@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.

dreampiggy commented 4 years ago

@mkalayci35 Another note:

The Animated ImageView will show a PDF or SVG label if it supports vector rendering.

image

mrtrinh5293 commented 4 years ago

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!!

netgfx commented 3 years ago

How do you initialise the SVG Coder for a SwiftUI project? It doesn't have an AppDelegate file. Thanks!

dreampiggy commented 3 years ago

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

dreampiggy commented 3 years ago

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.

netgfx commented 3 years ago

F1E8E893-0A1E-4D81-92F9-46A41D79349B_1_105_c

@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!

dreampiggy commented 3 years ago

@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:

ghost commented 2 years ago

How can we change the colour of AnimatedImage with the rendering mode template?