A modern AppList alternative

Related tags

Example Apps AltList
Overview

AltList

A modern AppList alternative

The main focus of this dependency is to be an easy to use and easy to customize framework to handle per app preferences. Unlike AppLists ALApplicationList class, AltList does not have a way to get installed applications yourself, as stock iOS classes like LSApplicationWorkspace and LSApplicationProxy (MobileCoreService / CoreServices framework) can already do that. Communication to SpringBoard is not needed for this.

Example uses:

// get LSApplicationProxy of all installed applications
NSArray* allInstalledApplications = [[LSApplicationWorkspace defaultWorkspace] atl_allInstalledApplications];

// get LSApplicationProxy for one application
LSApplicationProxy* appProxy = [LSApplicationProxy applicationProxyForIdentifier:@"com.yourapp.yourapp"];

Features

  • Uses LSApplicationWorkspace, not dependent on RocketBootstrap / SpringBoard injection
  • Supports search bars
  • Supports application sections (similar to AppList)
  • Supports alphabetic indexing if only one section is specified
  • Doesn't reinvent the wheel
  • Supports iOS 7 and up

Installation

Run install_to_theos.sh and add it to the makefile of your project:

_EXTRA_FRAMEWORKS = AltList

Then you can import it using #import or just use the classes below in your preferences plist.

Documentation

AltList features three PSListController subclasses that can be used from your preference bundle or application. Unlike AppList it is highly customizable, so if you want to adapt something you can just make a subclass and specify that instead.

All classes can be configured via values in your plist.

Plist-Only approach

For very simple preferences, it is possible to use AltList straight from your entry.plist without implementing any class. For an example check out AltListTestBundlelessPreferences.

ATLApplicationSection

Just like the original AppList, AltList allows you to specify the sections of applications it should display.

AltList ships with a few stock section types:

  • All: All Applications, including hidden ones
  • System: System Applications (e.g. App Store, Safari)
  • User: User installed applications (e.g. Reddit, Instagram)
  • Hidden: Hidden applications (e.g. InCallService, Carplay Settings)
  • Visible: All applications that are not hidden (e.g. System and User applications)

The stock section types already have predicates and localized names. Custom sections are also supported and allow you to specify your own section name and predicate. If you want your custom section name to be localized: the value you set will be passed to the localizedStringForString of your ListController (see below).

Key Type Fallback Usage
sectionType String (All/System/User/Hidden/Visible/Custom) Visible Type of the section, see above
sectionName String @"" For custom sections, name of the section
sectionPredicate String @"" For custom sections, predicate to filter the applications, check out the LSApplicationProxy headers for possible values to use
customClass String @"" Custom subclass of ATLApplicationSection to use, in case you want to implement even more custom behaviour

ATLApplicationListControllerBase

ATLApplicationListControllerBase is the base class inherited by the other classes, it has several features that apply to all classes below.

Keys

Key Type Fallback Usage
sections Array One Visible section Array of dictionaries that represent the sections in which the applications are shown
useSearchBar Boolean false Whether there should be a search bar at the top that allows to search for applications (Example)
hideSearchBarWhileScrolling Boolean false When useSearchBar is enabled, whether the search bar should be hidden while scrolling (Always true on iOS 10 and below) (Example)
includeIdentifiersInSearch Boolean false When useSearchBar is enabled, whether it should be possible to search for apps by their identifier. When this is false, it is only possible to search for apps by their name.
showIdentifiersAsSubtitle Boolean false Whether the application identifiers should be shown in the subtitle (Example)
alphabeticIndexingEnabled Boolean false When there is only one section, whether to section and index it by the starting letters (Example)
hideAlphabeticSectionHeaders Boolean false When alphabeticIndexingEnabled is true, whether to hide the sections that contain the first letters (Example)
localizationBundlePath String @"" Path to the bundle that should be used for localizing custom section titles

Methods (Can be subclassed for customization)

Method Purpose
- (void)loadPreferences Load the preference value that the list controller will display
- (void)prepareForPopulatingSections Initialize stuff that needs to be done before the populating starts
- (NSString*)localizedStringForString:(NSString*)string Localize string if possible from internal AltList bundle or the localization bundle specified by localizationBundlePath
- (void)reloadApplications Reload applications and specifiers
- (BOOL)shouldHideApplicationSpecifiers Whether any specifier at all should be hidden (internally used for search bar)
- (BOOL)shouldHideApplicationSpecifier:(PSSpecifier*)specifier Whether the specifier specifier should be hidden (internally used for search bar)
- (BOOL)shouldShowSubtitles Whether subtitles should be shown on the application cells
- (NSString*)subtitleForApplicationWithIdentifier:(NSString*)applicationID The subtitle that should be displayed in the cell for the specific application that's passed as applicationID
- (PSCellType)cellTypeForApplicationCells Cell type for the application cells
- (Class)customCellClassForCellType:(PSCellType)cellType Custom cell class for the application cells
- (Class)detailControllerClassForSpecifierOfApplicationProxy:(LSApplicationProxy*)applicationProxy detailControllerClass to be used by the application specifiers
- (SEL)getterForSpecifierOfApplicationProxy:(LSApplicationProxy*)applicationProxy getter to be used by the application specifiers
- (SEL)setterForSpecifierOfApplicationProxy:(LSApplicationProxy*)applicationProxy setter to be used by the application specifiers
- (PSSpecifier*)createSpecifierForApplicationProxy:(LSApplicationProxy*)applicationProxy Create a specifier for the application represented by applicationProxy
- (NSArray*)createSpecifiersForApplicationSection:(ATLApplicationSection*)section Create the specicifers for a whole application section represented by section (Calls the method above)

ATLApplicationListSelectionController

ATLApplicationListSelectionController can be used as the detail class of a PSLinkListCell to have a list of applications of which one can be selected. The selected applications bundle identifier will be saved in the preference domain specified via defaults under the specified key. It respects the get / set attributes so by default it will use the readPreferenceValue and setPreferenceValue:specifier: methods of the PSListController that contains the cell for reading / writing the value. Setting the cellClass to ATLApplicationSelectionCell is recommended so the value preview shows the application name instead of the application bundle identifier.

Example

<dict>
	<key>cellkey>
	<string>PSLinkListCellstring>
	<key>detailkey>
	<string>ATLApplicationListSelectionControllerstring>
	<key>cellClasskey>
	<string>ATLApplicationSelectionCellstring>
	<key>defaultskey>
	<string>com.yourcompany.yourtweakprefsstring>
	<key>keykey>
	<string>(...)string>
	<key>labelkey>
	<string>(...)string>
	<key>sectionskey>
	<array>
		<dict>
			<key>sectionTypekey>
			<string>Systemstring>
		dict>
		<dict>
			<key>sectionTypekey>
			<string>Userstring>
		dict>
	array>
	<key>useSearchBarkey>
	<true/>
	<key>hideSearchBarWhileScrollingkey>
	<false/>
dict>

ATLApplicationListMultiSelectionController

ATLApplicationListSelectionController can be used as the detail class of a PSLinkListCell to have a list of applications where each has a switch next to it. The key defaultApplicationSwitchValue can be set to a boolean and will be used as the default value of the application switches. An array with the application identifiers of the enabled (or disabled when defaultApplicationSwitchValue is true) applications will be saved in the preference domain specified via defaults under the specified key. It respects the get / set attributes so by default it will use the readPreferenceValue and setPreferenceValue:specifier: methods of the PSListController that contains the cell for reading / writing the value.

Keys

Key Type Fallback Usage
defaultApplicationSwitchValue Boolean false Default value of the application switches

Example

<dict>
	<key>cellkey>
	<string>PSLinkListCellstring>
	<key>detailkey>
	<string>ATLApplicationListMultiSelectionControllerstring>
	<key>defaultskey>
	<string>(...)string>
	<key>keykey>
	<string>(...)string>
	<key>labelkey>
	<string>(...)string>
	<key>sectionskey>
	<array>
		<dict>
			<key>sectionTypekey>
			<string>Visiblestring>
		dict>
		<dict>
			<key>sectionTypekey>
			<string>Hiddenstring>
		dict>
	array>
	<key>showIdentifiersAsSubtitlekey>
	<true/>
	<key>defaultApplicationSwitchValuekey>
	<false/>
	<key>useSearchBarkey>
	<true/>
dict>

ATLApplicationListSubcontrollerController

ATLApplicationListSubcontrollerController can be used as the detail class of a PSLinkListCell to have one PSListController per application. The key subcontrollerClass is used to specify the PSListController subclass, although you can also subclass ATLApplicationListSubcontroller instead which has a convienience method to get the application identifier and also automatically reloads the preview string shown in the application list. Preview strings are supported but require you to subclass ATLApplicationListSubcontrollerController and use your subclass instead. In your subclass you need to overwrite the previewStringForApplicationWithIdentifier: method and return the preview string there. Preferences also need to be handled in your PSListController/ATLApplicationListSubcontrollerController subclass, if you want an example for this, check out the Choicy preferences.

Keys

Key Type Fallback Usage
subcontrollerClass String None (Required) Name of the class that should be used for the application subpages

Example

<dict>
	<key>cellkey>
	<string>PSLinkListCellstring>
	<key>detailkey>
	<string>ATLApplicationListSubcontrollerControllerstring>
	<key>subcontrollerClasskey>
	<string>(...)string>
	<key>labelkey>
	<string>(...)string>
	<key>sectionskey>
	<array>
		<dict>
			<key>sectionTypekey>
			<string>Visiblestring>
		dict>
		<dict>
			<key>sectionTypekey>
			<string>Hiddenstring>
		dict>
	array>
	<key>showIdentifiersAsSubtitlekey>
	<true/>
	<key>useSearchBarkey>
	<true/>
dict>
Comments
  • Cannot install to theos

    Cannot install to theos

    This is the output I get when I run ./install_to_theos.sh

    `==> Cleaning…

    Making clean in AltListTestBundle… ==> Cleaning… Making all for framework AltList… ==> Copying resource directories into the framework wrapper… ==> Copying public headers into the framework wrapper… ==> Preprocessing AltList.x… ==> Preprocessing AltList.x… ==> Compiling ATLApplicationListControllerBase.m (armv7)… ATLApplicationListControllerBase.m:14:6: error: comparison of function 'dispatch_queue_attr_make_with_qos_class' not equal to a null pointer is always true [-Werror,-Wtautological-pointer-compare] if (dispatch_queue_attr_make_with_qos_class != NULL) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ ATLApplicationListControllerBase.m:14:6: note: prefix with the address-of operator to silence this warning if (dispatch_queue_attr_make_with_qos_class != NULL) ^ & 1 error generated. make[3]: *** [/home/atrt7/theos/makefiles/instance/rules.mk:193: /home/atrt7/AltList/.theos/obj/armv7/ATLApplicationListControllerBase.m.9349dfb3.o] Error 1 make[3]: *** Waiting for unfinished jobs.... ==> Compiling ATLApplicationListControllerBase.m (arm64)… ATLApplicationListControllerBase.m:14:6: error: comparison of function 'dispatch_queue_attr_make_with_qos_class' not equal to a null pointer is always true [-Werror,-Wtautological-pointer-compare] if (dispatch_queue_attr_make_with_qos_class != NULL) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~ ATLApplicationListControllerBase.m:14:6: note: prefix with the address-of operator to silence this warning if (dispatch_queue_attr_make_with_qos_class != NULL) ^ & 1 error generated. make[3]: *** [/home/atrt7/theos/makefiles/instance/rules.mk:193: /home/atrt7/AltList/.theos/obj/arm64/ATLApplicationListControllerBase.m.2699f159.o] Error 1 make[3]: *** Waiting for unfinished jobs.... ==> Compiling ATLApplicationListMultiSelectionController.m (armv7)… rm /home/atrt7/AltList/.theos/obj/armv7/AltList.x.m make[2]: *** [/home/atrt7/theos/makefiles/instance/framework.mk:36: /home/atrt7/AltList/.theos/obj/armv7/AltList.framework/AltList] Error 2 make[2]: *** Waiting for unfinished jobs.... ==> Compiling ATLApplicationListMultiSelectionController.m (arm64)… ==> Compiling ATLApplicationListSelectionController.m (arm64)… rm /home/atrt7/AltList/.theos/obj/arm64/AltList.x.m make[2]: *** [/home/atrt7/theos/makefiles/instance/framework.mk:36: /home/atrt7/AltList/.theos/obj/arm64/AltList.framework/AltList] Error 2 make[1]: *** [/home/atrt7/theos/makefiles/instance/framework.mk:27: internal-framework-all_] Error 2 make: *** [/home/atrt7/theos/makefiles/master/rules.mk:117: AltList.all.framework.variables] Error 2`

    opened by atrt7 9
  • AltList 1.0.5-2 crash

    AltList 1.0.5-2 crash

    iOS Settings crashes when I tried to open any preference which have com.opa334.altlist dependencies, such as: Crane, Bakgrunnur, bfdecrypt.

    Crash log: https://pastebin.com/aaRegR5L

    💥 AltList versions that crash: 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5-2 ✅ Worked fine with AltList 1.0-1

    Device: iPhone 12 Pro Max iOS: 14.3 Jailbreak: Taurine 1.0.4

    opened by sadalhayat 5
  • Having trouble compiling and installing to theos

    Having trouble compiling and installing to theos

    Hey opa, i am in the process of migrating over from applist to AltList. I have cloned the AltList repository and ran ./install_to_theos.sh. i am getting these errors:

    ==> Compiling LSApplicationProxy+AltList.m (arm64)…
    LSApplicationProxy+AltList.m:66:26: error: property 'bundleURL' not found on object of type 'LSApplicationProxy *'
            NSURL* bundleURL = self.bundleURL;
                                    ^
    LSApplicationProxy+AltList.m:91:26: error: property 'bundleURL' not found on object of type 'LSApplicationProxy *'
            NSURL* bundleURL = self.bundleURL;
                                    ^
    LSApplicationProxy+AltList.m:143:16: error: no visible @interface for 'LSApplicationProxy' declares the selector 'bundleIdentifier'
                    return [self bundleIdentifier];
                            ~~~~ ^~~~~~~~~~~~~~~~
    LSApplicationProxy+AltList.m:160:16: error: no visible @interface for 'LSApplicationWorkspace' declares the selector 'allInstalledApplications'
                    return [self allInstalledApplications];
                            ~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~
    4 errors generated.
    

    I have looked around the other issues on the repository and found that you asked people to use this iOS 13 SDK https://github.com/xybp888/iOS-SDKs/tree/master/iPhoneOS13.0.sdk. i have replaced my iOS 13 SDK with it and im still getting the same errors.

    Hope that you can help me out. i really appriciate your work. <3

    The full output:

    gilshahar7@Gil-PC:/mnt/e/Tweaks/AltList$ ./install_to_theos.sh 
    fcntl(): Operation not supported
    ==> Cleaning…
    > Making clean in AltListTestPreferences…
    fcntl(): Operation not supported
    ==> Cleaning…
    > Making clean in AltListTestBundlelessPreferences…
    fcntl(): Operation not supported
    ==> Cleaning…
    > Making all for framework AltList…
    fcntl(): Operation not supported
    ==> Copying resource directories into the framework wrapper…
    ==> Copying public headers into the framework wrapper…
    fcntl(): Operation not supported
    ==> Preprocessing AltList.x…
    fcntl(): Operation not supported
    ==> Preprocessing AltList.x…
    fcntl(): Operation not supported
    ==> Compiling ATLApplicationListControllerBase.m (arm64)…
    fcntl(): Operation not supported
    ==> Compiling ATLApplicationListControllerBase.m (armv7)…
    fcntl(): Operation not supported
    ==> Compiling LSApplicationProxy+AltList.m (armv7)…
    LSApplicationProxy+AltList.m:66:26: error: property 'bundleURL' not found on object of type 'LSApplicationProxy *'
            NSURL* bundleURL = self.bundleURL;
                                    ^
    LSApplicationProxy+AltList.m:91:26: error: property 'bundleURL' not found on object of type 'LSApplicationProxy *'
            NSURL* bundleURL = self.bundleURL;
                                    ^
    LSApplicationProxy+AltList.m:143:16: error: no visible @interface for 'LSApplicationProxy' declares the selector 'bundleIdentifier'
                    return [self bundleIdentifier];
                            ~~~~ ^~~~~~~~~~~~~~~~
    LSApplicationProxy+AltList.m:160:16: error: no visible @interface for 'LSApplicationWorkspace' declares the selector 'allInstalledApplications'
                    return [self allInstalledApplications];
                            ~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~
    4 errors generated.
    /home/gilshahar7/theos/makefiles/instance/rules.mk:192: recipe for target '/mnt/e/Tweaks/AltList/.theos/obj/armv7/LSApplicationProxy+AltList.m.c68d4022.o' failed
    make[3]: *** [/mnt/e/Tweaks/AltList/.theos/obj/armv7/LSApplicationProxy+AltList.m.c68d4022.o] Error 1
    make[3]: *** Waiting for unfinished jobs....
    fcntl(): Operation not supported
    ==> Compiling LSApplicationProxy+AltList.m (arm64)…
    LSApplicationProxy+AltList.m:66:26: error: property 'bundleURL' not found on object of type 'LSApplicationProxy *'
            NSURL* bundleURL = self.bundleURL;
                                    ^
    LSApplicationProxy+AltList.m:91:26: error: property 'bundleURL' not found on object of type 'LSApplicationProxy *'
            NSURL* bundleURL = self.bundleURL;
                                    ^
    LSApplicationProxy+AltList.m:143:16: error: no visible @interface for 'LSApplicationProxy' declares the selector 'bundleIdentifier'
                    return [self bundleIdentifier];
                            ~~~~ ^~~~~~~~~~~~~~~~
    LSApplicationProxy+AltList.m:160:16: error: no visible @interface for 'LSApplicationWorkspace' declares the selector 'allInstalledApplications'
                    return [self allInstalledApplications];
                            ~~~~ ^~~~~~~~~~~~~~~~~~~~~~~~
    4 errors generated.
    /home/gilshahar7/theos/makefiles/instance/rules.mk:192: recipe for target '/mnt/e/Tweaks/AltList/.theos/obj/arm64/LSApplicationProxy+AltList.m.9be9e4d9.o' failed
    make[3]: *** [/mnt/e/Tweaks/AltList/.theos/obj/arm64/LSApplicationProxy+AltList.m.9be9e4d9.o] Error 1
    make[3]: *** Waiting for unfinished jobs....
    fcntl(): Operation not supported
    ==> Compiling ATLApplicationListMultiSelectionController.m (arm64)…
    fcntl(): Operation not supported
    ==> Compiling ATLApplicationListMultiSelectionController.m (armv7)…
    rm /mnt/e/Tweaks/AltList/.theos/obj/armv7/AltList.x.m
    /home/gilshahar7/theos/makefiles/instance/framework.mk:35: recipe for target '/mnt/e/Tweaks/AltList/.theos/obj/armv7/AltList.framework/AltList' failed
    make[2]: *** [/mnt/e/Tweaks/AltList/.theos/obj/armv7/AltList.framework/AltList] Error 2
    make[2]: *** Waiting for unfinished jobs....
    fcntl(): Operation not supported
    ==> Compiling ATLApplicationSubtitleSwitchCell.m (arm64)…
    rm /mnt/e/Tweaks/AltList/.theos/obj/arm64/AltList.x.m
    /home/gilshahar7/theos/makefiles/instance/framework.mk:35: recipe for target '/mnt/e/Tweaks/AltList/.theos/obj/arm64/AltList.framework/AltList' failed
    make[2]: *** [/mnt/e/Tweaks/AltList/.theos/obj/arm64/AltList.framework/AltList] Error 2
    /home/gilshahar7/theos/makefiles/instance/framework.mk:27: recipe for target 'internal-framework-all_' failed
    make[1]: *** [internal-framework-all_] Error 2
    /home/gilshahar7/theos/makefiles/master/rules.mk:118: recipe for target 'AltList.all.framework.variables' failed
    make: *** [AltList.all.framework.variables] Error 2
    
    opened by gilshahar7 3
  • Feature request: Ability to search bundleId

    Feature request: Ability to search bundleId

    In some cases(eg. Chinese name), searching bundleId is faster than names. It would be handy if there is a key in preference plist to enable the ability to search names and Ids simultaneously.

    opened by brendonjkding 1
  • Feature request: Bundleless approach for using AltList

    Feature request: Bundleless approach for using AltList

    Seen from the example AltList project, there’s still the need to build s bundle that does nothing more than loading the Root plist. Just like AppList, it would be handy if we can plug bundle and isController properties and everything in one plist. AltList.bundle should be created or symlinked to /System/Library/PreferenceBundles, to start the matter.

    opened by PoomSmart 1
  • ar.Localization

    ar.Localization

    "Applications" = "التطبيقات"; "System Applications" = "تطبيقات النظام"; "User Applications" = "تطبيقات المستخدم"; "Hidden Applications" = "التطبيقات المخفية

    opened by ammaripa 1
  • Better Portuguese localization

    Better Portuguese localization

    It's better to use "Aplicativos" (more suitable to mobile apps) in Portuguese than "Aplicações" (IMHO more suitable to desktop applications).

    opened by rdaraujo 0
  • Uppercase UITableViewIndex

    Uppercase UITableViewIndex

    Uppercase letters at the right of the list when there is only one section, to make it more consistent with iOS. Should work but I wasn't able to test due to linker issues.

    opened by RedenticDev 0
  •  Turkish language file tr.strings

    Turkish language file tr.strings

    "Applications" = "Uygulamalar"; "System Applications" = "Sistem Uygulamaları"; "User Applications" = "Kullanıcı Uygulamaları"; "Hidden Applications" = "Gizlenmiş Uygulamalar";

    opened by serif61 0
  • Linker Error

    Linker Error

    I fixed the compilation issues by doing #import <Foundation/Foundation.h> in some files. now I get a linker error

    Undefined symbols for architecture armv7:
      "___isOSVersionAtLeast", referenced from:
          -[ATLApplicationListControllerBase _setUpSearchBar] in ATLApplicationListControllerBase.m.ee6620ba.o
          -[ATLApplicationSubtitleCell initWithStyle:reuseIdentifier:specifier:] in ATLApplicationSubtitleCell.m.ee6620ba.o
    ld: symbol(s) not found for architecture armv7
    clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
    make[3]: *** [/home/atrt7/theos/makefiles/instance/framework.mk:36: /home/atrt7/AltList/.theos/obj/armv7/AltList.framework/AltList] Error 1
    rm /home/atrt7/AltList/.theos/obj/armv7/AltList.x.m
    make[2]: *** [/home/atrt7/theos/makefiles/instance/framework.mk:36: /home/atrt7/AltList/.theos/obj/armv7/AltList.framework/AltList] Error 2
    make[2]: *** Waiting for unfinished jobs....
    ==> Linking framework AltList (arm64)…
    ==> Generating debug symbols for AltList…
    ==> Stripping AltList (arm64)…
    rm /home/atrt7/AltList/.theos/obj/arm64/AltList.x.m
    make[1]: *** [/home/atrt7/theos/makefiles/instance/framework.mk:27: internal-framework-all_] Error 2
    make: *** [/home/atrt7/theos/makefiles/master/rules.mk:117: AltList.all.framework.variables] Error 2```
    opened by atrt7 4
Owner
Lars Fröder
Lars Fröder
Exchanger - a simple iOS application demonstrating one of approaches to implement VIPER 💎 architecture in modern Objective-C

The Exchanger is a simple iOS application demonstrating one of approaches to implement VIPER ?? architecture in modern Objective-C.

Vladimir Kaltyrin 11 Oct 11, 2022
Modern-collection-view - Modern collection view for swift

Modern collection view Sample application demonstrating the use of collection vi

Nitanta Adhikari 1 Jan 24, 2022
Schedule timing task in Swift using a fluent API. (A friendly alternative to Timer)

Schedule(简体中文) Schedule is a timing tasks scheduler written in Swift. It allows you run timing tasks with elegant and intuitive syntax. Features Elega

Luo Xiu 1.8k Jan 7, 2023
MZFormSheetPresentationController provides an alternative to the native iOS UIModalPresentationFormSheet, adding support for iPhone and additional opportunities to setup UIPresentationController size and feel form sheet.

MZFormSheetPresentationController MZFormSheetPresentationController provides an alternative to the native iOS UIModalPresentationFormSheet, adding sup

Michał Zaborowski 979 Nov 17, 2022
🔄 GravitySlider is a beautiful alternative to the standard UICollectionView flow layout.

GravitySliderFlowLayout Made by Applikey Solutions Find this project on Dribbble Table of Contents Purpose Supported OS & SDK Versions Installation Us

Applikey Solutions 958 Dec 23, 2022
An alternative SwiftUI NavigationView implementing classic stack-based navigation giving also some more control on animations and programmatic navigation.

swiftui-navigation-stack An alternative SwiftUI NavigationView implementing classic stack-based navigation giving also some more control on animations

Matteo 753 Jan 2, 2023
Schedule timing task in Swift using a fluent API. (A friendly alternative to Timer)

Schedule(简体中文) Schedule is a timing tasks scheduler written in Swift. It allows you run timing tasks with elegant and intuitive syntax. Features Elega

Luo Xiu 1.8k Dec 21, 2022
🔸 A customizable alternative to UIPickerView in Swift.

PickerView PickerView is an easy to use and customize alternative to UIPickerView written in Swift. It was developed to provide a highly customizable

Filipe Alvarenga 488 Dec 21, 2022
iOS / Objective C: an extremely simple UIAlertView alternative

RKDropdownAlert an extremely simple (and customizeable) alert alternative based on Facebook's app Slingshot, and inspiration from SVProgressHUD (yes,

Richard Kim 1.5k Nov 20, 2022
A WeChat alternative. Written in Swift 5.

TSWeChat - A WeChat alternative, updated to Swift 5. 中文说明 Requirements Cocoapods 1.2.0 + iOS 10.0+ / Mac OS X 10.9+ Xcode 10.0+ Features Send your ric

Hilen Lai 3.7k Dec 31, 2022
An alternative to Core Data for people who like having direct SQL access.

FCModel 2 An alternative to Core Data for people who like having direct SQL access. By Marco Arment. See the LICENSE file for license info (it's the M

null 1.7k Dec 28, 2022
An alternative app store for non-jailbroken iOS devices

AltStore AltStore is an alternative app store for non-jailbroken iOS devices. AltStore is an iOS application that allows you to sideload other apps (.

null 1 Dec 9, 2021
ChatLayout is an alternative solution to MessageKit.

ChatLayout is an alternative solution to MessageKit. It uses custom UICollectionViewLayout to provide you full control over the presentation as well as all the tools available in UICollectionView.

Eugene Kazaev 527 Jan 4, 2023
The alternative last.fm client for iOS made with SwiftUI

first.fm - The alternative last.fm client for iOS (it's actually not available on the App Store... yet) Features Your profile (top artists, tracks and

Stanislas 22 Aug 22, 2022
An alternative to UIStackView for common Auto Layout patterns.

StackLayout StackLayout builds on Auto Layout to make some of the most common layouts easier to manage. It creates the constraints that you need and a

Bridger Maxwell 76 Jun 29, 2022
Working alternative to Xcode previews.

SwiftUIPlaygrounds! A shell project you can use to iterate over SwiftUI interfaces using the HotReloading project. Instead of a "preview" the interfac

John Holdsworth 9 Dec 21, 2021
An elegant alternative to the UIStepper written in Swift

An elegant alternative to the UIStepper in Swift with a thumb slider addition to control the value update with more flexibility. Usage let stepper = S

Yannick Loriot 426 Sep 22, 2022
Nicely animated flat design switch alternative to UISwitch

AIFlatSwitch A smooth, nice looking and IBDesignable flat design switch for iOS. Can be used instead of UISwitch. Inspired by Creativedash's Dribbble

null 963 Jan 5, 2023
📱 A minimal tab bar alternative

MiniTabBar A clean simple alternative to the UITabBar. Only shows the title when being tapped on. Gives the app a way cleaner look :) Requirements iOS

Dylan Marriott 155 Dec 20, 2022
● ○ ○ ○ A nice, animated UIPageControl alternative.

Page Control Installation Usage Example import UIKit import PageControl class ViewController: UIViewController, UIScrollViewDelegate { @IBOu

Kasper Lahti 113 Sep 1, 2022