Lazy image loading for SwiftUI

Overview

NukeUI

A missing piece in SwiftUI that provides lazy image loading.

  • LazyImage for SwiftUI
  • LazyImageView for UIKit and AppKit

It uses Nuke for loading images and has many customization options. It also supports GIF rendering thanks to Gifu. But GIF is not the most efficient format, so NukeUI also supports playing short videos out of the box.

WARNING. It's work-in-progress. Feel free to try it at your own risk or wait for 1.x.

Usage

The view is instantiated with a source.

struct ContainerView: View {
    var body: some View {
        LazyImage(source: "https://example.com/image.jpeg")
    }
}

The view is called "lazy" because it loads the image from the source only when it appears on the screen. And when it disappears (or is deallocated), the current request automatically gets canceled. When the view reappears, the download picks up where it left off, thanks to resumable downloads.

The source can be anything from a String to a full ImageRequest.

LazyImage(source: "https://example.com/image.jpeg")
LazyImage(source: URL(string: "https://example.com/image.jpeg"))
LazyImage(source: URLRequest(url: URL(string: "https://example.com/image.jpeg")!))

let request = ImageRequest(
    url: URL(string: "https://example.com/image.jpeg"),
    processors: [ImageProcessors.Resize(width: 44)]
)
LazyImage(source: request)

Learn more about customizing image requests in "Image Requests."

If you already have an image ready to be displayed, use a dedicated initializer.

// Display a regular image
LazyImage(image: UIImage("my-image"))

// Display an animated GIF
LazyImage(image: ImageContainer(image: UIImage(), type: .gif, data: data))

LazyImage is highly customizable. For example, it allows you to display a placeholder while the image is loading and display a custom view on failure.

LazyImage(source: "https://example.com/image.jpeg")
    .placeholder {
        Circle()
            .foregroundColor(.blue)
            .frame(width: 30, height: 30)
    }
    .failure { Image("empty") }
}

The image view is lazy and doesn't know the size of the image before it downloads it. Thus, you must specify the view size before loading the image. By default, the image will resize preserving the aspect ratio to fill the available space. You can change this behavior by passing a different content mode.

LazyImage(source: "https://example.com/image.jpeg")
    .contentMode(.center) // .aspectFit, .aspectFill, .center, .fill
    .frame(height: 300)

When the image is loaded, you can add an optional transition.

LazyImage(source: "https://example.com/image.jpeg")
    .transition(.fadeIn(duration: 0.33))

You can pass a complete ImageRequest as a source, but you can also configure the download via convenience modifiers.

LazyImage(source: "https://example.com/image.jpeg")
    .processors([ImageProcessors.Resize(width: 44])
    .priority(.high)
    .pipeline(customPipeline)

You can also monitor the status of the download.

LazyImage(source: "https://example.com/image.jpeg")
    .onStart { print("Task started \($0)")
    .onProgress { ... }
    .onSuccess { ... }
    .onFailure { ... }
    .onCompletion { ... }

And if some API isn't exposed yet, you can always access the underlying LazyImageView instance. For example, you are currently going to need to access the underlying view to enable experimental video playback support:

LazyImage(source: "https://example.com/image.jpeg")
    .onCreated { view in 
        view.videoGravity = .resizeAspect
    }

LazyImageView is a LazyImage counterpart for UIKit and AppKit with the equivalent set of APIs.

let imageView = LazyImageView()
imageView.placeholderView = UIActivityIndicatorView()
imageView.priority = .high
imageView.pipeline = customPipeline
imageView.onCompletion = { print("Request completed")

imageView.source = "https://example.com/image.jpeg"

Limitations

  • GIF support is currently limited to iOS and tvOS (macOS support in progress)
  • There is a known race condition in Gifu with an outsdanting PR with a fix https://github.com/kaishin/Gifu/pull/176
  • The support for watchOS is there but is currently limited
  • More improvements to video are coming. For example, generating and displaying a preview for a first frame before the entire video is loaded.

Minimum Requirements

NukeUI Swift Xcode Platforms
NukeUI 0.1 Swift 5.3 Xcode 12.0 iOS 11.0 / watchOS 5.0 / macOS 10.13 / tvOS 11.0

LazyImage is available on the following platforms: iOS 13.0 / watchOS 7.0 / macOS 10.15 / tvOS 13.0

License

NukeUI is available under the MIT license. See the LICENSE file for more info.

Comments
  • Image doesn't scale correctly in SwiftUI Mac App

    Image doesn't scale correctly in SwiftUI Mac App

    I have the following code:

    LazyImage(source: model.fileUrl)
                            .processors([ImageProcessors.Resize(width: 800)])
                            .transition(.fadeIn(duration: 0.15))
                            .aspectRatio(1, contentMode: .fit)
                            .background(Color(.controlColor))
    

    The image appears, however its not filling/scaling up as I'd expect to fill the container. It appears to have a fixed size, cantering inside of the container? The background therefore shows around the edges. Is this currently unsupported?

    FYI, I've reverted for the moment to the old FetchImage implementation directly and that works fine, but would be great to use this new type as I think its far better from an API POV πŸ‘

    Great work by the way, my favourite image library in over a decade!

    bug 
    opened by shaps80 11
  • Images not loading ... memory cache issue? Try disk caching?

    Images not loading ... memory cache issue? Try disk caching?

    I'm having an issue where some images do not load. I've found that when loading a very large number of items in a vertical scrolling list, some of the images do not load; although, they do start. I've tried checking errors with the .onFailure, and setting up the onProgress handler to check if they are downloading, but they're not. I only see the Color that I've set in the final else statement inside of the LazyImage init closure.

    You'll notice that the images load if I slightly scroll. It's as though they've downloaded, but something is blocking the UI thread from refreshing.

    Xcode and iOS beta 3.

    Here is the code:

    LazyImage(source: imageUrl) { state in
                        if let image = state.image {
                            image
                                .clipped(antialiased: true)
                                .clipShape(RoundedRectangle(cornerRadius: 10))
                        } else if state.error != nil {
                            Color.red // Indicates an error
                        } else {
                            Color
                                .gray
                                .cornerRadius(10)
                                .opacity(0.2)
                        }
                    }
                    .onSuccess { response in
                        debugPrint("image success")
                    }
                    .onStart{ task in
                        debugPrint("Started: \(task.request.url!)")
                    }
                    .onFailure{ error in
                        debugPrint("Failure: \(error)")
                    }
                    .onProgress{ response, completed, total in
                        debugPrint("Progress: \(total)")
                    }
                    .frame(minHeight: mediaHeight, maxHeight: mediaHeight, alignment: .center)
    

    How does one implement disk caching with LazyImage?

    https://user-images.githubusercontent.com/553800/125739868-1d31370b-9fb5-4eef-a735-7bcf900dc0cc.mp4

    opened by Cyclic 10
  • Improve work with video data

    Improve work with video data

    This PR improves work with video.

    • extends ImageContainer with asset: AVAsset?. I think it can be moved to main Nuke framework. This allows playing videos with custom Views, e.g. SwiftUI.VideoPlayer from iOS 14.
    • improves VideoPlayer view API. I think in future it should mimic SwiftUI.VideoPlayer from iOS 14.
    opened by larryonoff 9
  • Add further DisappearBehavior to work around iOS 14 Crash

    Add further DisappearBehavior to work around iOS 14 Crash

    Hi Alexander,

    we are seeing a strange Crash on iOS 14.3 when onDisappear is called in LazyImage. It fails in FetchImage:208 if isLoading { isLoading = false } with Fatal error: Attempted to read an unowned reference but the object was already deallocated.

    I guess it is some kind of SwiftUI bug. We are seeing it in newer iOS 14 Versions as well, but it happens a lot in 14.3.

    By accident I found out, that we can prevent the crash, if we don't reset or cancel the model, but just lower the requests priority. I know it makes no sense from a performance perspective, but at least our app doesn't crash that way πŸ˜…

    Best regards Peter

    opened by pkurzok 7
  • Problem with refresh (after resize or rotation)

    Problem with refresh (after resize or rotation)

    Hi,

    I'm using 2 types of images (one for compact, one for regular) and i'm switching images after a device rotation or window resize.

    But the good image is loaded only the first time, after a device rotation, the result are "inversed", ie: seeing portrait image in landscape and landscape image in portrait.

    You can test with this code on an iPhone and rotate the device:

    import SwiftUI
    import NukeUI
    
    
    struct TestView: View {
        
        @Environment(\.horizontalSizeClass) var wSizeClass
        @Environment(\.verticalSizeClass) var hSizeClass
        
        var body: some View {
            VStack {
                Text("LazyImage").foregroundColor(.white)
                LazyImage(source: hSizeClass == .regular ? "https://liquidchaostattoos.com/wp-content/uploads/2015/06/artist-portrait-placeholder.jpg" : "https://www.ctsfw.edu/wp-content/uploads/2016/02/landscape-placeholder-image.jpg")
                    .frame(width: 150, height: 150)
                
                
                Text("AsyncImage").foregroundColor(.white)
                if #available(iOS 15.0, *) {
                    AsyncImage(url: hSizeClass == .regular ?
                               URL(string: "https://liquidchaostattoos.com/wp-content/uploads/2015/06/artist-portrait-placeholder.jpg")! :
                                URL(string: "https://www.ctsfw.edu/wp-content/uploads/2016/02/landscape-placeholder-image.jpg")!) { image in
                        image.resizable()
                    } placeholder: {
                        ProgressView()
                    }
                    .frame(width: 150, height: 150)
                } else {
                    // Fallback on earlier versions
                }
            }
        }
    }
    
    struct TestView_Previews: PreviewProvider {
        static var previews: some View {
            NavigationView {
                TestView()
                    .environment(\.colorScheme, .dark)
            }
        }
    }
    
    opened by skrew 4
  • Consider an iOS 13 compatible LazyImage

    Consider an iOS 13 compatible LazyImage

    Essentially we can't upgrade to Nuke 10 until we can remove FetchImage.

    You can mark this as closed if its something you just don't want to do but I imagine there will be holdouts until people can drop support for iOS 13.

    opened by kylebrowning 4
  • LazyImage in List elements

    LazyImage in List elements

    I'm trying to use LazyImage inside List, by giving it an aspect ratio like this:

    struct ContentView: View {
        var data = (1...50).map { $0 }
        var ratios: [CGFloat] = [16/9, 21/3, 1]
        
        var aspectRatio: CGFloat {
            ratios.randomElement()!
        }
        
        var body: some View {
            NavigationView {
                List {
                    ForEach(data, id: \.self) { model in
                        LazyImage(source: "https://picsum.photos/300/300")
                            .aspectRatio(aspectRatio, contentMode: .fill)
                            .padding(.horizontal)
                            .padding(.bottom)
                    }
                    .listRowSeparator(.hidden)
                    .listRowBackground(Color.clear)
                    .listRowInsets(.init(top: 0, leading: 0, bottom: 0, trailing: 0))
                }
                .listStyle(.plain)
                
            }
        }
    }
    

    The problem is that the elements get overlapped when you scroll, like this:

    image

    This doesn't reproduce if i use ScrollView, only with List

    question 
    opened by andrei4002 3
  • Can't use NukeUI in macOS Catalyst App

    Can't use NukeUI in macOS Catalyst App

    I am building an app that has an internal private Swift Package where I do most of my work shared across multiple targets

    One of those targets is a macOS Catalyst app

    My SPM product contains NukeUI as one of the target dependencies, however there are build errors since macOS Catalyst seems to build as an iOS app under a macOS environment? I'm new to it so I am not sure what's happening, but this is the list of errors I get, which is odd since they are inside a #if os(iOS) || os(tvOS)

    Just to note, building the target using any iOS device works, but when I change the scheme to macOS, it fails

    Screen Shot 2021-07-30 at 02 09 53
    opened by Mackarous 3
  • Support for AsyncImage wrapper or view modifier

    Support for AsyncImage wrapper or view modifier

    It would be nice if this package implemented the same features, such as the caching and gif support, using the new, OOB, AsyncImage in SwiftUI. Perhaps using phases?

    opened by Cyclic 3
  • Tag release

    Tag release

    This is really great, thx for this!

    Can you tag this and lock the Nuke version in the package manager to 10.0.0? Because I use other dependencies, like GetStream, that also uses Nuke as a dependency so the versions need to line up.

    opened by basememara 3
  • Unable to add package

    Unable to add package

    Hi,

    I'm trying to add the package to my Xcode project but getting the error "Failed to resolve dependencies".

    Screenshot 2022-06-28 at 20 41 20

    Clicking "Add Anyway" adds the package, but it fails to resolve and causes the project to fail to build (copying components from another project that already use this).

    Is there something special I need to do?

    Thanks

    question 
    opened by eliottrobson 2
  • NukeUI + Introspect issue

    NukeUI + Introspect issue

    Hello,

    First off - thanks for the effort on the library - really appreciate it!

    In my project I'm using NukeUI and Introspect I have a view that uses about 10 LazyImages to download and show an mp4 and another piece of that view that responds to a sheet modifier that utilizes detents on iOS 15 via Introspect, as they're not yet in SwiftUI.

    The issue that I'm seeing is that if I show that view via a NavigationView more than 3 times, the mp4s no longer load and play.

    Additionally, inspecting the memory graph, shows that even if I navigate away from that view, there are about 60 LazyImage and VideoPlayerView sticking around in memory, which I assume is the crux of the issue.

    Commenting out the Introspect portion fixes the issue and everything works as expected, but I need it in my app for other things as well.

    Now, this might very well be an Introspect issue and I'm raising an issue in that repo as well, but just wanted to see whether the maintainer here might have any insights into why this is happening.

    Code that reproduces the issue

    Tested on iOS 15.4.1 on iPhone 12 Pro Max, compiled with Xcode 13.3.1 (interestingly the simulator doesn't show the issue)

    NukeUI version: 0.8.1 Introspect version: 0.1.4

    Video of the issue:

    https://user-images.githubusercontent.com/82413230/168490919-ee292d87-d8ed-4939-b278-138c6648d7e3.mov

    Memory graph:

    Screen Shot 2022-05-15 at 19 18 40

    Thanks!

    bug 
    opened by andrewsexcellent 5
  • To not set const image height

    To not set const image height

    Is it possible to not set const image height if it's cached and loaded from the memory or when it's loaded? So, I want to show a placeholder for the very first load and then allow an image to fill all width provided by a container and let an image preserve its aspect ratio for height.

    question 
    opened by denis-obukhov 0
  • Randomly, image does not load

    Randomly, image does not load

    While loading a list of images, sometimes, randomly, the image does not load. If you restart, after few times, it works.

    Console logs: Task <72B7A449-92F7-41E1-AB00-5A2D634E541B>.<9> finished with error [303] Error Domain=kCFErrorDomainCFNetwork Code=303 "(null)" UserInfo={_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <72B7A449-92F7-41E1-AB00-5A2D634E541B>.<9>, _kCFStreamErrorDomainKey=4, NSErrorPeerAddressKey=<CFData 0x60000086caf0 [0x1da82daf0]>{length = 16, capacity = 16, bytes = 0x100201bbd15e5a010000000000000000}, _kCFStreamErrorCodeKey=-2201, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <72B7A449-92F7-41E1-AB00-5A2D634E541B>.<9>" )}

    Used with: LazyImage(source: imageUrl, resizingMode: .aspectFit) .frame(maxWidth: .infinity, maxHeight: .infinity) .aspectRatio(contentMode: .fit)

    Any idea?

    bug 
    opened by IssaMansour 12
  • Read Image Data

    Read Image Data

    Is it possible to read in the pixel data of the image as a UIImage or NSImage to be used with a plugin that can get the common color of the image so set it as a backdrop / background color?

    As a bonus it would be fantastic if this receiving a background color of the image as built into NukeUI.

    enhancement 
    opened by StarPlayrX 0
  • Placeholder image always displayed before cached image on iOS 15 when using an animation modifier

    Placeholder image always displayed before cached image on iOS 15 when using an animation modifier

    Hello there,

    First of all, let me start by saying, thank you for creating such a great package. It has greatly simplified our image loading and caching, something that we wish Apple offered out of the box.

    When running the app on an iOS 15 device, we have discovered that even if the image has already been loaded, our placeholder view will always be shown before displaying the cached image. When the view reappears, the placeholder will be shown for a brief moment before the cached image is loaded in. This creates the effect that the image is being loaded again, however I have confirmed that there is no network activity. It appears to be something to do with the fact that the image has an animation added to it.

    Example code:

    LazyImage(source: url) { state in
        if let image = state.image {
            image
                .aspectRatio(contentMode: .fit)
        } else {
            generic
                .aspectRatio(contentMode: .fit)
        }
    }
    .frame(height: targetHeight)
    .animation(.easeIn)
    .clipShape(Circle()))
    

    Putting a breakpoint in the content closure shows that it is initially called with a nil value for state.image, before almost immediately being called again with a non-nil image. This results in the behaviour I described above.

    When removing the animation, it works as expected. The above code works fine running on iOS 14, using the same build. We are building using Xcode 12.5.1, and I have also confirmed that this issue is present when building using Xcode 13.

    I suspect that this may be something to do with changes to the way SwiftUI handles animations, but I thought I'd point it out here nonetheless in case it is something you need to look into.

    opened by johnrogers 0
Releases(0.8.3)
  • 0.8.3(Jun 29, 2022)

  • 0.8.2(Jun 12, 2022)

  • 0.8.1(Apr 3, 2022)

  • 0.8.0(Jan 27, 2022)

  • 0.7.0(Oct 26, 2021)

  • 0.6.8(Aug 29, 2021)

  • 0.6.7(Aug 2, 2021)

  • 0.6.6(Jul 31, 2021)

  • 0.6.5(Jul 26, 2021)

  • 0.6.4(Jul 18, 2021)

  • 0.6.3(Jul 8, 2021)

    • Revert the changes to Image sizing behavior. Now it again simply takes all the available space and you can use resizingMode to change the image rendering behavior.
    Source code(tar.gz)
    Source code(zip)
  • 0.6.1(Jun 12, 2021)

    • Fix default placeholder color for LazyImage
    • Update LazyImageView to match LazyImage in terms of the default parameters: placeholder and animation
    Source code(tar.gz)
    Source code(zip)
  • 0.6.0(Jun 11, 2021)

    • Add ImageView (UIKit, AppKit) and Image (SwiftUI) components that support animated images and are now used by LazyImageView
    • Remove LazyImageView API for setting image, use ImageView directly instead
    • Fix reloading when the source changes but view identity is the same
    • All views now support video rendering by default
    • Rename contentMode to resizingMode
    • LazyImage custom initialized now suggest NukeUI.Image
    Source code(tar.gz)
    Source code(zip)
  • 0.5.0(Jun 10, 2021)

    • Rework LazyImage to use FetchImage on all platforms
    • Add new init(source:content:) initializer to LazyImage:
    LazyImage(source: $0) { state in
        if let image = state.image {
            image // Displays the loaded image
        } else if state.error != nil {
            Color.red // Indicates an error
        } else {
            Color.blue // Acts as a placeholder
        }
    }
    
    • Add default placeholder to LazyImage (gray background)
    • Temporarily increase LazyImage supported platforms to iOS 14.0, tvOS 14.0, watchOS 7.0, macOS 10.16
    • LazyImage on watchOS now has an almost complete feature parity with other platforms. The main exception is the support for animated images which is currently missing.
    • Remove LazyImage initializer that take ImageContainer – use LazyImageView directly instead
    • Add infrastructure for registering custom rendering engines:
    import SwiftSVG
    
    // Affects both all `LazyImage` and `LazyImageView` instances
    LazyImageView.registerContentView {
        if $0.type == .svg, let string = $0.data.map( {
            UIView(SVGData: data)
        }
        return nil
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Jun 6, 2021)

    • Extend watchOS support
    • Add animated images support on macOS
    • Display a GIF preview until it is ready to be played (Nuke 10.2 feature)
    • Fix how images are displayed on macOS by default
    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Jun 4, 2021)

    • Allow user interaction during animated transitions
    • Animated transitions are now supported for video
    • Add access to the underlying videoPlayerView, remove separate videoGravity property
    • Add isLooping property to VideoPlayerView which is true by default
    • Add contentView where all content views (both images and video) are displayed
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Jun 4, 2021)

    • Display the first frame of the video as a preview until the video is downloaded and ready to be played
    • Enable video rendering by default. The option renamed from isExperimentalVideoSupportEnabled to isVideoRenderingEnabled.
    • Make sure video doesn't prevent the display from sleeping by setting preventsDisplaySleepDuringVideoPlayback to false
    • Add video support on macOS
    • Optimize performance during scrolling
    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Jun 3, 2021)

Owner
Alexander Grebenyuk
I write kean.blog and like porridge
Alexander Grebenyuk
SwiftUI Image loading and Animation framework powered by SDWebImage

SDWebImageSwiftUI What's for SDWebImageSwiftUI is a SwiftUI image loading framework, which based on SDWebImage. It brings all your favorite features f

null 1.6k Jan 6, 2023
A pure Swift high-performance asynchronous image loading framework. SwiftUI supported.

Longinus Longinus is a pure-Swift high-performance asynchronous web image loading,caching,editing framework. It was learned from Objective-C web image

Qitao Yang 290 Dec 17, 2022
Lightweight and customisable async image loading in SwiftUI. Supports on-disk storage, placeholders and more!

Asyncrounously download and display images in Swift UI. Supports progress indicators, placeholders and image transitions. RemoteImageView Asyncrounous

Callum Trounce 192 Dec 7, 2022
EbImagesSwiftUI - SDWebImageSwiftUI - a SwiftUI image loading framework, which based on SDWebImage

SDWebImageSwiftUI What's for SDWebImageSwiftUI is a SwiftUI image loading framew

An Tran 1 Jan 6, 2022
SwiftUI project to show ActivityIndicator above Image while loading

ImageWithActivityIndicatorDemo SwiftUI project to show ActivityIndicator above Image while loading ImageWithActivityIndicatorDemo is a demo app that s

Ali Adam 4 May 27, 2021
SwiftUI view that download and display image from URL and displaying Activity Indicator while loading .

ViewWithActivityIndicator ViewWithActivityIndicator is a SwiftUI view that download and display image from URL and displaying Activity Indicator while

Ali Adam 28 Feb 3, 2022
Image loading system

Image Loading System Nuke ILS provides an efficient way to download and display images in your app. It's easy to learn and use thanks to a clear and c

Alexander Grebenyuk 7k Dec 31, 2022
Asynchronous image loading framework.

YYWebImage YYWebImage is an asynchronous image loading framework (a component of YYKit). It was created as an improved replacement for SDWebImage, PIN

null 3.5k Dec 27, 2022
LCWebImage - An asynchronous image loading framework based on AFNetworking.

LCWebImage is an asynchronous image loading framework based on AFNetworking, which supports memory and disk caching, and provides functions such as custom caching, custom image decoding, and custom network configuration.

LiuChang 27 Jul 23, 2022
AsyncImage before iOS 15. Lightweight, pure SwiftUI Image view, that displays an image downloaded from URL, with auxiliary views and local cache.

URLImage URLImage is a SwiftUI view that displays an image downloaded from provided URL. URLImage manages downloading remote image and caching it loca

Dmytro Anokhin 1k Jan 4, 2023
πŸ“· A composable image editor using Core Image and Metal.

Brightroom - Composable image editor - building your own UI Classic Image Editor PhotosCrop Face detection Masking component ?? v2.0.0-alpha now open!

Muukii 2.8k Jan 3, 2023
An image download extension of the image view written in Swift for iOS, tvOS and macOS.

Moa, an image downloader written in Swift for iOS, tvOS and macOS Moa is an image download library written in Swift. It allows to download and show an

Evgenii Neumerzhitckii 330 Sep 9, 2022
πŸ“· A composable image editor using Core Image and Metal.

Brightroom - Composable image editor - building your own UI Classic Image Editor PhotosCrop Face detection Masking component ?? v2.0.0-alpha now open!

Muukii 2.8k Jan 2, 2023
AYImageKit is a Swift Library for Async Image Downloading, Show Name's Initials and Can View image in Separate Screen.

AYImageKit AYImageKit is a Swift Library for Async Image Downloading. Features Async Image Downloading. Can Show Text Initials. Can have Custom Styles

Adnan Yousaf 11 Jan 10, 2022
A complete Mac App: drag an image file to the top section and the bottom section will show you the text of any QRCodes in the image.

QRDecode A complete Mac App: drag an image file to the top section and the bottom section will show you the text of any QRCodes in the image. QRDecode

David Phillip Oster 2 Oct 28, 2022
Convert the image to hexadecimal to send the image to e-paper

ConvertImageToHex Convert the image to hexadecimal to send the image to e-paper Conversion Order // 0. hex둜 λ³€ν™˜ν•  이미지 var image = UIImage(named: "sample

Hankyeol Park 0 Feb 26, 2022
Image-cropper - Image cropper for iOS

Image-cropper Example To run the example project, clone the repo, and run pod in

Song Vuthy 0 Jan 6, 2022
An instagram-like image editor that can apply preset filters passed to it and customized editings to a binded image.

CZImageEditor CZImageEditor is an instagram-like image editor with clean and intuitive UI. It is pure swift and can apply preset filters and customize

null 8 Dec 16, 2022
AsyncImageExample An example project for AsyncImage. Loading images in SwiftUI article.

AsyncImageExample An example project for AsyncImage. Loading images in SwiftUI article. Note: The project works in Xcode 13.0 beta (13A5154h).

Artem Novichkov 4 Dec 31, 2021