Swift/iOS viewer for photography galleries or portfolios

Overview

Contributors Forks Stargazers Issues MIT License

Portfolios Screen Shot

Table of Contents
  1. About The Project
  2. Getting Started
  3. Usage and features
  4. Roadmap
  5. Contributing
  6. About the model
  7. License
  8. Contact
  9. Acknowledgments

About The Project

The name

Photo Club Waalre is a photography club named after Waalre, a town in the south of The Netherlands. Since 1988 its club members meet to critique each other’s photos, organize excursions, and hold yearly photo expositions.

Portfolios

The goal of this app is to showcase curated work of members of photo clubs.

The work is organized into portfolios. Each portfolio covers that part of a photographer's work that was shared within a photo club. If a photographer is (or was) a member of more than one of the supported photo clubs, the app will contain multiple portfolios for that photographer.

Each portfolio is shown in chronological order, with the latest work shown first, and typically spans multiple years.

Built With

(back to top)

Getting Started

To get a local copy up and running, use GitHub’s Open with Xcode feature, compile and run on a simulator or physical device. Those who prefer running git from the command line should be able to manage on their own.

Installation

(back to top)

Usage and features

Opening animation

When the app opens, it shows a large image corresponding to the app’s icon. If you tap somewhere inside the image, it zooms out to show the full image representing how digital cameras see color.

This involves a Bayer color filter array that filters the light per pixel. The filter array is shown here superimposed on a colorful photo.

Tapping inside the image allows you to zoom in or out to your heart's content. Tapping outside the image area ends the animation. You can trigger the animation again by restarting the app. A single tap outside the image allows you to skip the animation entirely.

The screens

  • Portfolios shows the available portfolios (gallery of images of a photographer in the context of one club). Clicking on one item shows a detail screen with the contents of the selected portfolio. Swiping left can, in exceptional cases, be used to delete an entry. The Search bar filters the list of portfolios.
  • Settings allows you to configure what types of members you want to see in the list of Portfolios.
  • Readme contains a scrollable explanation, similar to what you are reading.
  • Photo clubs lists the photo clubs that are currently loaded. A purple pin on the map show the location of the club's club house (where they meet). A blue pin shows the location of other loaded photo clubs. A lock icon selects whether a map can be zoomed and panned, or is pinned in place.
  • Photographers lists the photographers currently loaded into the app. It gives information which is club-independent. The entries may store birthdays, and clickable links to personal (club-independent) photography sites. The Search bar filters the list of portfolios.

Multi-club support

Version one the app only supported Photo Club Waalre (aka Fotogroep Waalre), but Version 2 supports multiple photo clubs. For a preview, drag down (“pull to refresh”) the Photo Club page. This loads just enough test data to show what multi-club support looks like.

(back to top)

Roadmap

  • Distribute the source code on GitHub
    • Publish article to get attention in Dutch photo club organization
  • MemberListView: show thumbnails of most recent photos
  • MemberListView: remove members who are removed on server
  • MemberGaleryView: use of WebKit by SwiftUI equivalent
  • Support onboarding of clubs without code changes
  • Notifications of portfolio changes (?)

See the open issues for a full list of proposed features (and known issues).

(back to top)

Contributing

All contributions are greatly appreciated.

Areas for contribution

Welcome contributions include adding features, code improvements, ideas on architecture and interface definition, and possibly even a backend.

Contributions that don't require coding are also welcome: beta testing via TestFlight, feature requests, translations, SVG icon design, and maybe UI/UX design.

One likely big change

A central design challenge for a next stage will be to provide a clean, standardized interface to retrieve data per photo club. The interface is needed to load the data, but also keeps the data within the app up to date. After all, membership data and portfolios change regularly. The current interface is essentially a plug-in design with an adaptor per photo club. This needs to be replaced by a standard data interface to avoid having to extend the source code whenever a new club comes aboard.

The app currently uses a software module per club. That module loads membership and portfolio data from the club’s server and merges it into the in-app database. For Photo Club Waalre, the membership data is read from a HTML table on a password protected part of the club’s website. The portfolios use a somewhat more robust solution: they are read from XML files generated by a Lightroom Web plug-in called JuiceBox-Pro Thus portfolios are created and managed as Lightroom collections. These collections are then uploaded to the webserver with a single Upload click (thus triggering JuiceBox-Pro) where they can be downloaded by the app.

How to contribute

If you have a suggestion that would make this better, you can fork the repo and create a pull request. The command line git commands to do this (but the Xcode IDE has equivalent commands under Source Control):

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

You can alternatively submit an issue with a tag like ”enhancement" or “bug” without having to do the code changes yourself.

(back to top)

About the model

The app uses a Swift-style MVVM design, meaning the model data is stored in structs (and in database tables) rather than in classes. As an intro for developers, here is a quick tour of the model.

Product schema

Every PhotoClub has zero or more Members of various types (current, former, etc.). Some of these Members have a formal role like chairman within the PhotoClub. We will come back to why Member is not visible in the model in a moment.

Some of information about a Photographer (like name, birthday, a personal website) is unrelated to the Photographer's Membership of a PhotoClub.

Portfolios represent the body of work of a Photographer in the context of a single PhotoClub. A Portfolio contains Images, but an Image could be in multiple Portfolios - depending on where the Image was shared.

Member and Portfolio can be considered synonyms from a modeling perspective: we create exactly one Portfolio for each PhotoClub that a Photographer joined. And every Member of a PhotoClub has exactly one Portfolio in the app. Therefore Member and Portfolio are from a formal perspective synonyms, and thus modelled as a single concept or table.

(back to top)

License

Distributed under the MIT License. See LICENSE.txt for more information.

(back to top)

Contact

Peter van den Hamer - [email protected]

Project Link: https://github.com/vdhamer/PhotoClubWaalre

(back to top)

Acknowledgments

  • The opening image animation uses an image by Greetje van Son.

(back to top)

Comments
  • iOS 16.2 warning (UIScene configuration dictionary)

    iOS 16.2 warning (UIScene configuration dictionary)

    [SceneConfiguration] Info.plist contained no UIScene configuration dictionary (looking for configuration named "(no name)")

    https://developer.apple.com/forums/thread/721912

    opened by vdhamer 1
  • Test / improve timezone handling

    Test / improve timezone handling

    Because date strings are converted to Date objects, and then shown as strings, check if all goes well when user is located in a different time zone than currently used for string>Date conversion.

    bug enhancement 
    opened by vdhamer 1
  • Bug: when a user's role is removed in code, role doesn't disappear in CoreData

    Bug: when a user's role is removed in code, role doesn't disappear in CoreData

    The update function for MemberPortfolio contains a club member's roles ("Joe is treasurer of photo club HappyPixels") and status ("Joe is a former member of photo club Kodachrome").

    If Joe stops being the treasurer of HappyPixels, the MemberPortfolio.isTreasurer flag should be cleared for Joe (and likely set for someone else).

    But the update() function that changes these properties gets called with with parameter values corresponding to

    • Joe is currently treasurer
    • no info available about whether Joe is treasurer
    bug 
    opened by vdhamer 1
  • Refactor name of core data Member table

    Refactor name of core data Member table

    Member table is renamed to MemberPortfolio.

    This is because it represents information about a Member of a PhotoClub, but simultaneously about the image Portfolio of the Member of the PhotoClub. Because the relationships are 1:1, the information is stored in a single table. And Member and Portfolio are synonyms, thus called MemberPortfolio.

    The Schema.png file used in the in-app Readme and Github's README.md is also updated to reflect the new table name.

    enhancement 
    opened by vdhamer 1
  • Incorrect “all toggles are off” message

    Incorrect “all toggles are off” message

    Reproduce using:

    1. Select only Aspiring members (or any category with only a few entries)
    2. Temporarily remove these entries in Portfolios screen (swipe left)

    Now the list of displayed members should be empty. But the text (at the bottom of the empty list of Portfolios) says this is because all settings are disabled. This is incorrect: there are settings enabled, but there is no data that matches the filter criteria. Fix logic (or text message).

    Actually the code looks correct, so maybe this is just a translation to NL problem:

    if fetchRequest.nsPredicate == NSPredicate.none {
            Text("""
                 Warning: all member categories on the Preferences page are disabled. \
                 Please enable one or more options in Preferences.
                 """, comment: "Hint to the user if all of the Preference toggles are disabled.")
    

    English version was fine. Was a misleading translation.

    bug 
    opened by vdhamer 0
  • Crash likely due to Photographer and PhotoClub zombies

    Crash likely due to Photographer and PhotoClub zombies

    This crash looks like an Automatic Reference Counting issue. ARC is removing PhotoClub or Photographer objects (NSManagedObject in Core Data) that are still being referenced. This is known as "zombie objects".

    Observed error messages (listed below)

    • isTemporaryID seems to be CoreData internal, but is work on behalf of the PhotoClub object.
    • name is probably PhotoClub.name
    • givenName_ is Photographer.givenName_

    Analysis

    This shouldn't with structure (as there are no references with value semantics). And shouldn't happen with normal strong references to objects, but could happen with weak references that may be used internally within Core Data. In particular, this is used to break a cycle between MemberPortfolio which "points to" both a PhotoClub and to a Photographer. While PhotoClub has a computed CoreData attribute called 'members_'; and Photographer has a similar property called memberships_. To avoid this "classical" ARC risk of memory leaks, one of the references is probably weak.

    But what to do about it?

    • pinpoint exactly what is going on using the Zombie detection Instrument in XCode. Doesn't seem to detect this? Which is suspicious.
    • remove memberships_ and members_ from the data model, hoping that the weak reference no longer exists. This means generating this info ourselves, when needed, using a query to the database. In fact, it may be possible to implement Photographer.memberships and PhotoClub.members as custom computed properties. Core Data however doesn't seem to like relationships without inverse relationships.
    • carefully add a temporary copy of PhotoClub and Membership to some scope, thus leaving the objects longer. There is actually a keyword for that.
    • put more permanent references to PhotoClub and Membership objects somewhere (at top level). Essentially trying to deliberately create a memory leak. This isn't too bad if you have say 20 PhotoClub objects with 20 members each: 20 + 400 objects.

    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[PhotoClub isTemporaryID]: unrecognized selector sent to instance 0x2819cdea0' *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCoreDataTaggedObjectID name]: unrecognized selector sent to instance 0x93b50e9d26960d3b' *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCoreDataTaggedObjectID givenName]: unrecognized selector sent to instance 0xb37907d875249736'

    https://developer.apple.com/documentation/xcode/investigating-crashes-for-zombie-objects https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

    bug 
    opened by vdhamer 0
  • filteredPhotographerFetchResult is calculated 3 times

    filteredPhotographerFetchResult is calculated 3 times

    Computed property .filteredPhotographerFetchResult is calculated 3 times (and in 4 places) in filteredPhotographerFetchResult.body

    This is normally not a big deal, but is an issue if we trigger network requests each time filteredPhotographerFetchResult is computed.

    bug 
    opened by vdhamer 0
  • Make state of locks on PhotoClubs page persistent

    Make state of locks on PhotoClubs page persistent

    Currently, the state is lost after then app (really) closes. This is not expected behavior for an - admittedly very minor - user preference setting.

    Note that lock state is currently configurable per PhotoClub, and that the set of supported Photo Clubs should ultimately be determined at runtime (=dynamcally).

    Alternative designs:

    • store state in UserDefaults as a dictionary. The dictionary can grow.
    • store state in UserDefaults as a Boolean. Means all locks open/close together. User won’t mind/notice.
    • store state using existing Core Data database. There is already a PhotoClubs table, so just requires one extra property, and the ability to get is (no effort) and set it (some code).

    Not sure which to choose yet.

    opened by vdhamer 0
  • Show photo club in title of Portfolio screen

    Show photo club in title of Portfolio screen

    The Portfolio of photographer “John Doe” in the context of photo club “Club Foobar” is currently entitled “John Doe”. Change this to “John Doe (Club Foobar)” because that’s more accurate.

    Arguably this could be done only if the database contains more than one photo club, but as soon as there are multiple photo clubs, this becomes important given the definition (see README.me) of portfolio.

    enhancement good first issue 
    opened by vdhamer 0
  • Add Storekit reviewRequest()

    Add Storekit reviewRequest()

    StoreKit allows you to bug users up to three times per year for a rating or review (if they haven't already provided one?). So this is mainly about delaying calls to requestReview() until the app estimates it has been used enough that the user might be willing to provide feedback.

    So this is about maintaining counters (in UserDefaults) that keep track of in-session or cross-session statistics. Current idea is to collect experience 'points' whenever the user activates a feature. And to trigger requestReview() at say multiples of 100 points. Features that might be monitored (possibly with weight factors):

    • accessing individual screens
      • Animation (= launching app from scratch)
      • Preference
      • Readme
      • Who's Who
      • Photo Clubs
      • viewing Portfolio (there are currently about 20)
    • using Search feature
    • pulldown-to-refresh
    • changing the lock setting on a map
    • viewing the end of the Readme

    https://www.youtube.com/watch?v=_oTPT3gFUms

    opened by vdhamer 0
Releases(v2.2.7)
  • v2.2.7(Jan 1, 2023)

    This is build #4580 in Apple's App Store

    • Portfolios screen
      • Thumbnails are now shown for former members (etc).
      • Thumbnails fetch small versions of the images (instead of the larger images themselves).
      • Thumbnails automatically show the latest image per portfolio (sorted on latest image capture date).
      • Spinning progress indicator while waiting for thumbnail response. It is currently shown on top of the embarrassed snail.
    • Maintainability
      • Thumbnails are now read from a config.xml file per portfolio (instead of being hardcoded).
      • Used Swift 5.7 RegexBuilder (new in iOS 16), replacing older Regex API.
      • Improved parsing of the Fotogroep Waalre membership HTML file (Regex related).
      • Logging message cleanup. Many lines now start with photo club. And use ERROR in caps if something fails.
    Source code(tar.gz)
    Source code(zip)
  • v2.2.6(Dec 25, 2022)

    This is build (4579) in Apple's App Store

    • adapted for iOS 16.2, Swift 5.7, XCode 14.2, and SwiftLint 0.50.3
      • converted to NavigationStack and replaced deprecated NavigationLink (new in iOS 16)
    • Prelude screen (formerly known as Animation screen)
      • on iPad and large iPhones: user can return to Prelude screen from Portfolios screen via nav bar
      • if you press outside the central image, there is a brief flash to confirm the Button press
      • debug features available on devices with a keyboard (such as iPad with Magic Keyboard)
        • pressing "d" toggles a debug panel with coordinates of last tap on central image
        • pressing "c" toggles crosshairs to identify indicate exact location of center of screen
    Source code(tar.gz)
    Source code(zip)
  • v2.2.5(Dec 10, 2022)

    This is build (4578) in Apple's App Store

    • Who's who screen
      • Extract date of birth from (now extended) membership HTML file for FGW. This was previously hardcoded.
      • Birthdays of former members of FGW are now shown.
      • Renamed associated SwiftUI Views to WhoIsWho.
    • Portfolios screen
      • Changed vice-chairman status for Fotogroep Waalre (temporarily GvS)
    • Refactoring
      • Improved robustness of HTML parsing in FGWMembersProvider class
      • Split the FGWMemberProvider.swift file into 2 files to appease the SwiftLint gods
      • Extra param called okToUseEncryptedFile in getFileAsString() for testing purposes
      • Deleted a few Git branches that were no longer in use
    Source code(tar.gz)
    Source code(zip)
  • v2.2.4(Dec 2, 2022)

    This is build (4577) in Apple's App Store

    • Updated README.md file (mainly architecture topics)
    • Portfolios screen
      • Changed vice-chairman status for Fotogroep Waalre
      • Updated hardcoded thumbnails uses various Expo2022 images
    • Refactoring
      • Minor: tweaked capitalization of titles
      • upgraded to SwiftLint 0.50.1
      • removed file DeviceOwnership.swift (it was not part of the build, but SwiftLint was checking it)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.3(Oct 23, 2022)

    This is build (4576). Release 2.2.2 didn't make it to the App Store (due to mistake on my part). Consequently, the App Store release notes for 2.2.3 also contain the 2.2.2 release notes.

    • Portfolios screen
      • yellow question mark is no longer used (replaced by orange question mark stored internally)
    Source code(tar.gz)
    Source code(zip)
  • v2.2.2(Oct 23, 2022)

    This is build (4575) in Apple's App Store

    • Photo Clubs screen
      • Switched from MapPin to MapMarker on map (MapPin deprecated in iOS16)
      • adapted icon representing photo clubs to match MapMarker
    • Portfolios screen
      • changed one thumbnail (for CK)
    • Who's Who screen
      • fixed one incorrect role (CK was admin)
    • Refactoring
      • Renamed TestClubMembersProvider class
      • Added comments on club loading in Fotogroep_Waalre_App
      • Renamed insertSomeHardcodedMemberData() method
      • Renamed latestImageURL in database and struct
      • Converted WhatNew.txt to ReleaseNotes.md
    Source code(tar.gz)
    Source code(zip)
  • v2.2.1(Oct 9, 2022)

    • This is build 4574 in Apple's App Store
      • The v2.2.1 release notes on the App Store contain the v2.2.0 release notes (because v2.2.0 didn't make it into the App Store)
    • Preferences screen
      • Bug fix (iPad only): incorrect attachment point at top of screen. Cosmetic flaw.
    • Readme screen
      • Bug fix (iPad only): incorrect attachment point at top of screen. Cosmetic flaw.
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Oct 8, 2022)

    • This is build 4573 (but it didn't make it onto Apple's App Store)
    • Minimum required iOS version is now 16.0 (16.0 is available for iPhone, 16.x is expected soon for iPad).
    • Portfolios screen
      • Displays a (temp hardcoded) thumbnail image per portfolio for all current members of the FGW club
      • Increased font size (on iPad only) within the Portfolio list.
      • If no recent image is available yet (e.g. ex-members), a stylised question mark is shown.
      • While downloading the thumbnail, a sketch of an anxious-looking snail is shown (only visible if download takes a while).
      • Incidentally, both the question-mark and the snail were generated using Stable Diffusion text-to-image software.
    • Photo Clubs screen
      • Swipe-left to delete an unneeded photo club (usually not needed). FGW can be deleted, but will reappears on restart.
      • Added a brief explanation at the bottom of the screen (about swiping and more).
      • Renamed "Test Photo Club" (was "Nederlands Fotografie Museum", which is simply not a photo club).
    • Who's Who screen
      • Extended list of birthdays (still hardcoded) to cover all current members of FGW.
    • Preferences screen
      • Minor text change (single to double quotes)
    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Oct 8, 2022)

    • This is build 4381 in Apple's App Store
    • Bug fix
      • Immediate crash running Github version (due to file name error). No impact on App Store version.
    • Refactoring
      • Renamed a CoreData table from Member to MemberPortfolio
      • Renamed various SwiftUI views (e.g. MemberListView > MemberPortfolioView)
      • Upgraded to XCode 14 and swiftlint 0.49.1
    • SwiftUI previews
      • Now all Previews of all Views work again
    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Oct 8, 2022)

    • Minimum required iOS version is 15.5
    • This is build 4379 in Apple's App Store
    • Github support
      • Source code is publically available (https://github.com/vdhamer/PhotoClubWaalre)
      • Mechanism to secure some data of photo club members (GitHub related)
      • New README.md for GitHub web site (it is not included in or used by the App itself)
    • Robustness
      • added an extra save() when app goes to background state
      • Linked loading of Fotogroep Waalre data to .onAppear of first view
      • Disabled autocorrection on Search text
      • [ removed unneeded SwiftUIEnvirontValue.png graphic from build ]
    • Removed dedicated accessibility feature for specific user
    • Added .mp4 "App Preview" video to App Store
    Source code(tar.gz)
    Source code(zip)
Owner
Peter van den Hamer
iOS app development in Swift
Peter van den Hamer
Agrume - 🍋 An iOS image viewer written in Swift with support for multiple images.

Agrume An iOS image viewer written in Swift with support for multiple images. Requirements Swift 5.0 iOS 9.0+ Xcode 10.2+ Installation Use Swift Packa

Jan Gorman 601 Dec 26, 2022
An iOS/tvOS photo gallery viewer, useful for viewing a large (or small!) number of photos.

This project is unmaintained. Alex passed away in an accident in late 2019. His love of iOS development will always be remembered. AXPhotoViewer AXPho

Alex Hill 596 Dec 30, 2022
Lightbox is a convenient and easy to use image viewer for your iOS app

Lightbox is a convenient and easy to use image viewer for your iOS app, packed with all the features you expect: Paginated image slideshow. V

HyperRedink 1.5k Dec 22, 2022
Simple PhotoBrowser/Viewer inspired by facebook, twitter photo browsers written by swift

SKPhotoBrowser [![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) Simple PhotoBrowser

keishi suzuki 2.4k Jan 6, 2023
Swift image slideshow with circular scrolling, timer and full screen viewer

?? ImageSlideshow Customizable Swift image slideshow with circular scrolling, timer and full screen viewer ?? Example To run the example project, clon

Petr Zvoníček 1.7k Dec 21, 2022
A simple mesh viewer for MacOS based on Swift and Metal and using Assimp for loading meshes

Metal Mesh Viewer A simple triangle mesh viewer for MacOS This application is a simple (triangle) mesh viewer that should be capable of rendering even

J. Andreas Bærentzen 0 Dec 13, 2021
Image slide-show viewer with multiple predefined transition styles, with ability to create new transitions with ease.

ATGMediaBrowser ATGMediaBrowser is an image slide-show viewer that supports multiple predefined transition styles, and also allows the client to defin

null 200 Dec 19, 2022
An image viewer à la Twitter

For the latest changes see the CHANGELOG Install CocoaPods pod 'ImageViewer' Carthage github "Krisiacik/ImageViewer" Sample Usage For a detailed examp

Kristian Angyal 2.4k Dec 29, 2022
Image viewer (or Lightbox) with support for local and remote videos and images

Table of Contents Features Focus Browse Rotation Zoom tvOS Setup Installation License Author Features Focus Select an image to enter into lightbox mod

Nes 534 Jan 3, 2023
Photo Browser / Viewer inspired by Facebook's and Tweetbot's with ARC support, swipe-to-dismiss, image progress and more

IDMPhotoBrowser IDMPhotoBrowser is a new implementation based on MWPhotoBrowser. We've added both user experience and technical features inspired by F

Thiago Peres 2.7k Dec 21, 2022
A snappy image viewer with zoom and interactive dismissal transition.

A snappy image viewer with zoom and interactive dismissal transition. Features Double tap to zoom in/out Interactive dismissal transition Animate in f

Lucas 421 Dec 1, 2022
Slide image viewer library similar to Twitter and LINE.

Overview You can use it simply by passing the necessary information! Serrata is a UI library that allows you to intuitively view images. Features King

Takuma Horiuchi 324 Dec 9, 2022
A snappy image viewer with zoom and interactive dismissal transition.

A snappy image viewer with zoom and interactive dismissal transition. Features Double tap to zoom in/out Interactive dismissal transition Animate in f

Lucas 421 Dec 1, 2022
A lightweight generic cache for iOS written in Swift with extra love for images.

Haneke is a lightweight generic cache for iOS and tvOS written in Swift 4. It's designed to be super-simple to use. Here's how you would initalize a J

Haneke 5.2k Dec 11, 2022
A lightweight and fast image loader for iOS written in Swift.

ImageLoader ImageLoader is an instrument for asynchronous image loading written in Swift. It is a lightweight and fast image loader for iOS. Features

Hirohisa Kawasaki 293 Nov 24, 2022
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
High-performance animated GIF support for iOS in Swift

Gifu adds protocol-based, performance-aware animated GIF support to UIKit. (It's also a prefecture in Japan). Install Swift Package Manager Add the fo

Reda Lemeden 2.6k Jun 21, 2021
XAnimatedImage is a performant animated GIF engine for iOS written in Swift based on FLAnimatedImage

XAnimatedImage is a performant animated GIF engine for iOS written in Swift based on FLAnimatedImage. An illustration is shown below: Features Plays m

Khaled Taha 561 Sep 9, 2022
An extremely high-performance, lightweight, and energy-efficient pure Swift async web image loader with memory and disk caching for iOS and  Watch.

KFSwiftImageLoader KFSwiftImageLoader is an extremely high-performance, lightweight, and energy-efficient pure Swift async web image loader with memor

Kiavash Faisali 343 Oct 29, 2022