Hot Reloading for Swift applications!

Overview

Inject

Hot reloading workflow helper that enables you to save hours of time each week, regardless if you are using UIKit, AppKit or SwiftUI.

TLDR: A single line of code change allows you to live code UIKit screen:

HotReloadingDemo.mp4

Read detailed article about this

The heavy lifting is done by the amazing InjectionForXcode. This library is just a thin wrapper to provide the best developer experience possible while requiring minimum effort.

I've been using it for years.

What is hot reloading?

Hot reloading is a technique allowing you to get rid of compiling your whole application and avoiding deploy/restart cycles as much as possible, all while allowing you to edit your running application code and see changes reflected as close as possible to real-time.

This makes you significantly more productive by reducing the time you spend waiting for apps to rebuild, restart, re-navigate to the previous location where you were in the app itself, re-produce the data you need.

This can save you literal hours off development time, each day!

Does it add manual overhead to my workflows?

Once you configured your project initially, it's practically free.

You don’t need to add conditional compilation or remove Inject code from your applications for production, it's already designed to behave as no-op inlined code that will get stripped by LLVM in non-debug builds.

Which means that you can enable it once per view and keep using it for years to come.

Integration

Initial project setup

To integrate Inject just add it as SPM dependency:

via Xcode

Open your project, click on File → Swift Packages → Add Package Dependency…, enter the repository url (https://github.com/krzysztofzablocki/Inject.git) and add the package product to your app target.

via SPM package.swift

dependencies: [
    .package(
      name: "Inject",
      url: "https://github.com/krzysztofzablocki/Inject.git",
      from: "1.0.5"
    )
]

Individual Developer setup (once per machine)

If anyone in your project wants to use injection, they only need to:

  • You must add "-Xlinker -interposable" (without the double quotes) to the "Other Linker Flags" of all targets in your project for the Debug configuration (qualified by the simulator SDK to avoid complications with bitcode), refer to InjectionForXcode documentation if you run into any issues
  • Download newest version of Xcode Injection from it's GitHub Page
  • Unpack it and place under /Applications
  • Make sure that the Xcode version you are using to compile our projects is under the default location: /Applications/Xcode.app
  • Run the injection application
  • Select open project / open recent from it's menu and pick the right workspace file you are using

After choosing the project in Injection app, launch the app

  • If everything is configured correctly you should see similar log in the console:
💉 InjectionIII connected /Users/merowing/work/SourceryPro/App.xcworkspace
💉 Watching files under /Users/merowing/work/SourceryPro

Workflow integration

You can either add import Inject in individual files in your project or use @_exported import Inject in your project target to have it automatically available in all its files.

SwiftUI

Just 2 steps to enable injection in your SwiftUI Views

  • call .enableInjection() at the end of your body definition
  • add @ObserveInjection var inject to your view struct

Remember you don't need to remove this code when you are done, it's NO-OP in production builds.

If you want to see your changes in action, you can enable an optional Animation variable on Inject.animation that will be used when ever new source code is injected into your application.

Inject.animation = .interactiveSpring()

Using Inject is demoed in this example app

UIKit / AppKit

For standard imperative UI frameworks we need a way to clean-up state between code injection phases.

I create the concept of Hosts that work really well in that context, there are 2:

  • Inject.ViewControllerHost
  • Inject.ViewHost

How do we integrate this? We wrap the class we want to iterate on at the parent level, so we don’t modify the class we want to be injecting but we modify the parent callsite.

Eg. If you have a SplitViewController that creates PaneA and PaneB , and you want to iterate on layout/logic code in PaneA, you modify the callsite in SplitViewController:

paneA = Inject.ViewHost(
  PaneAView(whatever: arguments, you: want)
)

That is all the changes you need to do, your app now allows you to change anything in PaneAView except for its initialiser API and the changes will be almost immediately reflected in your App.

Make sure to call initializer inside Inject.ViewControllerHost(...) or Inject.ViewHost(...). Inject relies on @autoclosure to reload views when hot-reload happens. Example:

// WRONG
let viewController = YourViewController()
rootViewController.pushViewController(Inject.ViewControllerHost(viewController), animated: true)

// CORRECT
let viewController = Inject.ViewControllerHost(YourViewController())
rootViewController.pushViewController(viewController, animated: true)

Remember you don't need to remove this code when you are done, it's NO-OP in production builds.

The Composable Architecture

If like myself you love PointFree Composable Architecture, you’d probably want to inject reducer code, this isn’t possible in vanilla TCA because reducer code is a free function which isn’t as straightforward to replace with injection, but our fork at The Browser Company supports it.

Comments
  • Inject View Controller which conforms to protocol

    Inject View Controller which conforms to protocol

    First Thanks for the great tool!!!

    Here is my question: I have a view controller which conforms to protocol "MyProtocol" then I do let calendar = Inject.ViewControllerHost(CalendarViewController()) and try to pass this calendar to the SideMenu which expects VC of MyProtocol type but calendar returns nil, when I do calendar as? MyProtocol

    are there any workarounds of this ?

    opened by romaHerman 23
  • Suggested simplified SwiftUI integration

    Suggested simplified SwiftUI integration

    I've enjoyed the fast iteration afforded by this library, thanks for putting it together!

    In the attached pull request is my suggestion for a slightly simpler SwiftUI integration.

    1. Replaces adding @ObservedObject private var iO = Inject.observer with @Injection var inject.
    2. Move callback config into enableInjection function

    Not sure if everyone would agree on this approach, but feels a little cleaner and also allows stripping the 'ObservedObject' component from release builds.

    opened by apptekstudios 20
  • Not updating in simulator

    Not updating in simulator

    I have a simple SwiftUI project (2 files), everything is installed and set up, I see all the messages from InjectionIII in console. But changes that I make in views do not appear in simulator.

    opened by okla 16
  • Not working in AppCode

    Not working in AppCode

    I'm trying to get this to work in AppCode (it works fine in Xcode) but I keep seeing this, any one knows whats going on?

    💉 Compiling /Users/user/git/MyApp/MyApp.swift 💉 Loading .dylib ... 💉 ⚠️ dlopen() error: dlopen(/Users/user/Library/Developer/CoreSimulator/Devices/3B86055C-0B91-4BCB-894C-F9AE1495D42C/data/Containers/Data/Application/CCFD64A8-BC92-446E-BD13-7601EC4422AD/tmp/eval102.dylib, 0x0002): tried: '/Users/user/Library/Caches/JetBrains/AppCode2022.2/DerivedData/News-ebmudasepawfrxgusfsadmvllwph/Build/Products/debug-iphonesimulator/eval102.dylib' (no such file), '/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 15.2.simruntime/Contents/Resources/RuntimeRoot/Users/user/Library/Developer/CoreSimulator/Devices/3B86055C-0B91-4BCB-894C-F9AE1495D42C/data/Containers/Data/Application/CCFD64A8-BC92-446E-BD13-7601EC4422AD/tmp/eval102.dylib' (no such file), '/Users/user/Library/Developer/CoreSimulator/Devices/3B86055C-0B91-4BCB-894C-F9AE1495D42C/data/Containers/Data/Application/CCFD64A8-BC92-446E-BD13-7601EC4422AD/tmp/eval102.dylib' (mach-o file (/Users/user/Library/Developer/CoreSimulator/Devices/3B86055C-0B91-4BCB-894C-F9AE1495D42C/data/Containers/Data/Application/CCFD64A8-BC92-446E-BD13-7601EC4422AD/tmp/eval102.dylib), but incompatible platform (have 'iOS', need 'iOS-sim')), '/usr/lib/eval102.dylib' (no such file)

    opened by icedice 9
  • Device injection

    Device injection

    I just realised that i was commenting on a closed issue so I deleted my comment and created this instead.

    I am wondering about device injection. I realise that injection on the device is very experimental but it is also extremely cool and useful so I really want to get it working. For me what is happening is that it never connects, in fact nothing is outputtet to the console at all.

    I did mange to get device injection to work using the HotReloading project, but I prefer this way for ease of use and because I'm having issues with hot refreshing collectionView cells with the HotReloading project which seems to work out of the box using this. It was my understanding that this project and the HotReloading project connects to the InjectionIII app the same way which is way I'm confused why device reloading works with HotReloading but not with Inject....

    opened by icedice 8
  • Added cocoapods support

    Added cocoapods support

    • Added podspec file (#50)
    • Updated README.md

    Note: There is already another pod registered with the name inject. (with lowercase 'i') If this results to a problem, a name change in the podspec file maybe considered.

    opened by gcharita 6
  • ❌🫵🏽 Show reloaded result instantly without tapping the simulator

    ❌🫵🏽 Show reloaded result instantly without tapping the simulator

    First of all, thanks for open-sourcing this amazing repo. ❤️ A true time-saver!

    I got it running but to be able to see the change I have to tap on the simulator. Would be neat to show the result instantly.

    I'm guessing enabling the animation is meant for that.

    Inject.animation = .interactiveSpring()

    But I don't know where to place it. Xcode gives me an error no matter where I place it.

    I'm using the @ObserveInjection var inject inside my ContentView.

    My Xcode version is 13.4.1.

    opened by mattigrthr 5
  • Inject on multi frameworks project

    Inject on multi frameworks project

    Hello I have an issue with the integration please. I have a multi frameworks iOS project. I installed injectorIII and I did all the configuration (other linker flags...) But when I make a change in a view controller nothing change. image I have the same issue both for UIKit and swift ui views. Any idea please?

    opened by sassiwalid 4
  • Using hosted instance of Inject.ViewControllerHost

    Using hosted instance of Inject.ViewControllerHost

    Hi

    in README the following example is given

    // WRONG
    let viewController = YourViewController()
    rootViewController.pushViewController(Inject.ViewControllerHost(viewController), animated: true)
    
    // CORRECT
    let viewController = Inject.ViewControllerHost(YourViewController())
    rootViewController.pushViewController(viewController, animated: true)
    

    Existing UIKit projects might want pass the viewController around, e.g. for configuration and then presentation.

    let viewController = Inject.ViewControllerHost(YourViewController())
    configureAndPresentReusableViewController(vc: viewController)
    
    func configureAndPresentReusableViewController(vc: YourViewController) {
      vc.defaultText = "Configured"
      self.present(vc, animated: true)
    }
    

    The code above will not compile due to Cannot convert value of type '_InjectableViewControllerHost<YourViewController>' to expected argument type 'YourViewController'

    If I use instance property of class _InjectableViewControllerHost<Hosted: InjectViewControllerType>: InjectViewControllerType then I can prevent the compilation error.

    let viewController = Inject.ViewControllerHost(YourViewController())
    configureAndPresentReusableViewController(vc: viewController.instance) // fine :)
    
    func configureAndPresentReusableViewController(vc: YourViewController) {
      vc.defaultText = "Configured"
      self.present(vc, animated: true)
    }
    

    But I noticed that this either leads to incorrect visualization or to a runtime error down the road.

    Any recommendation?

    opened by MarcoEidinger 4
  • Older Swift Tool Version Support

    Older Swift Tool Version Support

    Hello,

    Currently, I'm using Xcode 12 with Swift Tool Version 5.4, but the Inject's Swift Package is built with Swift Tool Version Is 5.5. So I cannot add this project to my application. Is it possible to add support for older Xcode versions (< Xcode 13)?

    Thanks in advance, have a nice and safe day.

    opened by Glockx 4
  • Injection is not working Xcode 14.0.1

    Injection is not working Xcode 14.0.1

    Hi! Maybe I'm doing something wrong but I can make Injection work. I've start with a clean project, added Package Dependency through Xcode and thought that this will work, but it don't. After that I've decided to check GitHub for other projects using Inject (like this one) in case of I've missed somethings. I've cloned it but I still get nothing when modifying any code in the controller.

    Maybe anyone can suggest where to look for the root of problem?

    Xcode 14.0.1 Simulator iPhone 12 iOS 16 macOS 13.0.1

    opened by japanese-goblinn 3
  • Debug View Hierarchy stops working after compiling a new ViewController

    Debug View Hierarchy stops working after compiling a new ViewController

    Hey Krzysztof. Thanks for the awesome tool!

    I would like to ask if you have any known issues with Debug View Hierarchy (DVH). I can run the app and navigate to a screen that hosts my ViewController. If at first I debug the view hierarchy, it works ok. Now I update some code and hit save. Once it gets injected, DVH stops working, as in I tap the button and nothing happens. Once I make another save in the file then Xcode opens the DVH window on a loading state until I get this:

    image

    I'm not thinking this will break my workflow a lot but got curious to know if this is known and if there's any explanation for it.

    Thanks again for this awesome tool. You and obviously, @johnno1962 👌🏼 🙏🏼

    opened by nunogoncalves 2
  • Trigger update when non source code file changes

    Trigger update when non source code file changes

    Might be a weird question, but would it trigger a refresh in the sim when a non source code file in the project is changed? My case is to quickly see changes to a json file reflected in the simulator.. This will of cause require the modified json to be injected when changed...

    opened by icedice 1
  • UISearchBar Doesn't Show with UINavigationController + Inject.ViewControllerHost

    UISearchBar Doesn't Show with UINavigationController + Inject.ViewControllerHost

    class ViewController: UIViewController, UISearchResultsUpdating {
    
        let searchController: UISearchController
    
        init() {
            self.searchController = UISearchController(searchResultsController: nil)
    
            super.init(nibName: nil, bundle: nil)
    
            searchController.searchResultsUpdater = self
            searchController.obscuresBackgroundDuringPresentation = false
            searchController.searchBar.placeholder = NSLocalizedString("Search", comment: "")
            searchController.searchBar.searchBarStyle = .minimal
    
            navigationItem.searchController = searchController
            navigationItem.title = "Hello"
            navigationItem.hidesSearchBarWhenScrolling = false
    
            self.definesPresentationContext = true
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        func updateSearchResults(for searchController: UISearchController) {
    
        }
    
    }
    
    // elsewhere
    
    let injectVC = Inject.ViewControllerHost(ViewController())
    let root = UINavigationController(rootViewController: injectVC)
    window.rootViewController = root
    
    self.window = window
    window.makeKeyAndVisible()
    

    Doing something like the following results in the search bar never showing with iOS 16 (I haven't tried iOS 15 yet). Removing the Inject.ViewControllerHost and just using ViewController directly works just fine, so I'm not sure if ViewControllerHost is messing with UIKit's ability to detect where to put the search bar or forwarding or something ¯_(ツ)_/¯

    Any idea for a workaround? For now I've just decided to not use Inject. Tried it with and without Injection app running

    Sorry if you aren't working on iOS 16 support yet, disregard for now if so!

    opened by b3ll 1
  • Add @available(watchOSApplicationExtension 6.0, *) to all Inject classes to allow using it in a library that targets WatchOS as well

    Add @available(watchOSApplicationExtension 6.0, *) to all Inject classes to allow using it in a library that targets WatchOS as well

    (Obligatory intro - Inject is awesome, thank you!)

    Hello, I develop an app that shares view code amon iOS and WatchOS extension targetys in a library. The library has set WatchOS 7.0 as a minimum target (see below), but adding Inject a dependency produces a lot of errors with SwiftUI APIs not available before WatchOS 6.

    Could you please mark the classes (or a whole package - I don't know if it's possible) as WatcOS 6.0+ only?

    Something like @available(watchOSApplicationExtension 6.0, *) should help.

    Or is there a better way? I am confused as for why does Xcode try to build the package for all WatchOS versions if it's only going to be used in a library that targets 7.0+?

    Thank you! Tomas

    Screenshot 2022-04-13 at 11 26 58

    Error Group
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Inject.swift:18:42: 'Animation' is only available in watchOS 6.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Inject.swift:45:30: 'AnyCancellable' is only available in watchOS 6.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Inject.swift:43:33: 'ObservableObject' is only available in watchOS 6.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/Hosts.swift:3:45: cannot find type 'UIViewController' in scope
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/Hosts.swift:4:35: cannot find type 'UIView' in scope
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/Hosts.swift:41:24: method does not override any method from its superclass
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/KitFrameworks.swift:5:11: cannot find type 'UIView' in scope
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/KitFrameworks.swift:6:11: cannot find type 'UIViewController' in scope
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/SwiftUI.swift:6:44: 'View' is only available in watchOS 6.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/SwiftUI.swift:14:74: 'View' is only available in watchOS 6.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/SwiftUI.swift:5:26: 'View' is only available in watchOS 6.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/SwiftUI.swift:6:31: 'some' return types are only available in watchOS 6.0.0 or newer
    <redacted path>/SourcePackages/checkouts/Inject/Sources/Inject/Integrations/SwiftUI.swift:14:61: 'some' return types are only available in watchOS 6.0.0 or newer
    
    opened by tkafka 2
Releases(1.2.2)
  • 1.2.2(Oct 18, 2022)

    What's Changed

    • fix: building failed in release mode by @guzhenhuaGitHub in https://github.com/krzysztofzablocki/Inject/pull/52

    New Contributors

    • @guzhenhuaGitHub made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/52

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.2.1...1.2.2

    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Aug 1, 2022)

    What's Changed

    • Forward toolbarItems from VC instance by @rnystrom in https://github.com/krzysztofzablocki/Inject/pull/48

    New Contributors

    • @rnystrom made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/48

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.2...1.2.1

    Source code(tar.gz)
    Source code(zip)
  • 1.2(Jul 13, 2022)

    What's Changed

    • updating gitignore to exclude macOS DS_Store finder business by @shengchalover in https://github.com/krzysztofzablocki/Inject/pull/34
    • Pass navigation.title to the host by @dasdom in https://github.com/krzysztofzablocki/Inject/pull/36
    • Copy tabBarItem when embedded in TabBarController by @Patrick-Kladek in https://github.com/krzysztofzablocki/Inject/pull/35
    • Set deployment target to iOS 11 by @DennisHirschgaenger in https://github.com/krzysztofzablocki/Inject/pull/37
    • Support hidesBottomBarWhenPushed by @VitaliiDeveloper in https://github.com/krzysztofzablocki/Inject/pull/41

    New Contributors

    • @shengchalover made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/34
    • @dasdom made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/36
    • @Patrick-Kladek made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/35
    • @DennisHirschgaenger made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/37
    • @VitaliiDeveloper made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/41

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.1.1...1.2

    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Apr 26, 2022)

    What's Changed

    • Catalyst support by @johnno1962 in https://github.com/krzysztofzablocki/Inject/pull/33

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.1.0...1.1.1

    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Apr 21, 2022)

    What's Changed

    • Compatibility with HotReloading project by @johnno1962 in https://github.com/krzysztofzablocki/Inject/pull/31
    • Suggested simplified SwiftUI integration by @apptekstudios in https://github.com/krzysztofzablocki/Inject/pull/20

    New Contributors

    • @apptekstudios made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/20

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.0.6...1.1.0

    Source code(tar.gz)
    Source code(zip)
  • 1.0.6(Apr 14, 2022)

    What's Changed

    • Drop Xcode requirement down
    • Update README.md by @MarcoEidinger in https://github.com/krzysztofzablocki/Inject/pull/17
    • Improve wording on adding -Xlinker -interpose flags by @johnno1962 in https://github.com/krzysztofzablocki/Inject/pull/18
    • Forward largeTitleDisplayMode to host by @felginep in https://github.com/krzysztofzablocki/Inject/pull/28
    • Update README.md by @felginep in https://github.com/krzysztofzablocki/Inject/pull/29

    New Contributors

    • @MarcoEidinger made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/17
    • @johnno1962 made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/18
    • @felginep made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/28

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.0.5...1.0.6

    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(Apr 7, 2022)

    What's Changed

    • Fix compiler errors on tvOS by @zenangst in https://github.com/krzysztofzablocki/Inject/pull/15

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.0.4...1.0.5

    Source code(tar.gz)
    Source code(zip)
  • 1.0.4(Apr 7, 2022)

    What's Changed

    • Added release NO-OP code for Hosts + added missing navigation bar setup by @wojciech-kulik in https://github.com/krzysztofzablocki/Inject/pull/14

    New Contributors

    • @wojciech-kulik made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/14

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.0.3...1.0.4

    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Apr 5, 2022)

    What's Changed

    • Update demo video in README by @darioroa in https://github.com/krzysztofzablocki/Inject/pull/9
    • Auto enable injection from SwiftUI views, instead of having to call it once from outside context (e.g. AppDelegate). by @lipka in https://github.com/krzysztofzablocki/Inject/pull/10

    New Contributors

    • @darioroa made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/9
    • @lipka made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/10

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.0.2...1.0.3

    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Apr 5, 2022)

    What's Changed

    • Feature support for animated updates by @zenangst in https://github.com/krzysztofzablocki/Inject/pull/8
    • Enabled Catalyst support

    Full Changelog: https://github.com/krzysztofzablocki/Inject/compare/1.0.1...1.0.2

    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Apr 4, 2022)

    What's Changed

    • Add support for tvOS 13+ by @zenangst in https://github.com/krzysztofzablocki/Inject/pull/1
    • Fix link to blog post by @taruntyagi946 in https://github.com/krzysztofzablocki/Inject/pull/2
    • For non-DEBUG code correct name to InjectListener by @amonshiz in https://github.com/krzysztofzablocki/Inject/pull/4

    New Contributors

    • @zenangst made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/1
    • @taruntyagi946 made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/2
    • @amonshiz made their first contribution in https://github.com/krzysztofzablocki/Inject/pull/4

    Full Changelog: https://github.com/krzysztofzablocki/Inject/commits/1.0.1

    Source code(tar.gz)
    Source code(zip)
Owner
Krzysztof Zabłocki
Making Swift engineers more efficient through tools and workflows.  My code powers up over 70 000+ apps.
Krzysztof Zabłocki
MisterFusion is Swift DSL for AutoLayout. It is the extremely clear, but concise syntax, in addition, can be used in both Swift and Objective-C. Support Safe Area and Size Class.

MisterFusion MisterFusion makes more easier to use AutoLayout in Swift & Objective-C code. Features Simple And Concise Syntax Use in Swift and Objecti

Taiki Suzuki 316 Nov 17, 2022
VidyoPlatform Basic CustomLayouts Reference App for iOS (Swift)VidyoPlatform Basic CustomLayouts Reference App for iOS (Swift)

VidyoPlatform Basic CustomLayouts Reference App for iOS (Swift) VidyoPlatform reference application highlighting how to integrate video chat into a na

Taras Melko 0 Nov 19, 2021
100-days-swift-project-8 - The eighth project from 100 days of Swift course

7 Swifty Words This is the eighth project from Hacking With Swift 100 days of Sw

Bruno Guirra 0 Jan 24, 2022
SwiftLanguageWeather-master - Swift Language Weather is an iOS weather app developed in Swift 4

Swift Language Weather SwiftWeather has renamed to Swift Language Weather. Becau

Kushal Shingote 1 Feb 5, 2022
Fancy Swift implementation of the Visual Format Language (experimental and doesn't work with the recent version of Swift)

VFLToolbox Autolayout is awesome! VFL a.k.a Visual Format Language is even more awesome because it allows you to shorten constraints setting code. The

0xc010d 144 Jun 29, 2022
BrickKit is a delightful layout library for iOS and tvOS. It is written entirely in Swift!

BrickKit is a delightful layout library for iOS and tvOS. It is written entirely in Swift! Deprecated BrickKit is being phased out at Wayfair, and the

Wayfair Tech – Archive 608 Sep 15, 2022
FlexLayout adds a nice Swift interface to the highly optimized facebook/yoga flexbox implementation. Concise, intuitive & chainable syntax.

FlexLayout adds a nice Swift interface to the highly optimized Yoga flexbox implementation. Concise, intuitive & chainable syntax. Flexbox is an incre

layoutBox 1.7k Dec 30, 2022
A powerful Swift programmatic UI layout framework.

Build dynamic and beautiful user interfaces like a boss, with Swift. Neon is built around how user interfaces are naturally and intuitively designed.

Mike 4.6k Dec 26, 2022
Fast Swift Views layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable & chainable. [iOS/macOS/tvOS/CALayer]

Extremely Fast views layouting without auto layout. No magic, pure code, full control and blazing fast. Concise syntax, intuitive, readable & chainabl

layoutBox 2.1k Dec 22, 2022
Simple static table views for iOS in Swift.

Simple static table views for iOS in Swift. Static's goal is to separate model data from presentation. Rows and Sections are your “view models” for yo

Venmo 1.3k Jan 5, 2023
A declarative Auto Layout DSL for Swift :iphone::triangular_ruler:

Cartography ?? ?? Using Cartography, you can set up your Auto Layout constraints in declarative code and without any stringly typing! In short, it all

Robb Böhnke 7.3k Jan 4, 2023
A Swift port of the Cassowary linear constraint solver

Cassowary Swift A Swift port of the Cassowary linear constraints solver. Tested on OS X, iOS and Linux. Example usage let solver = Solver() let left

Tribal Worldwide London 110 Oct 18, 2022
An easy way to create and layout UI components for iOS (Swift version).

Introduction Cupcake is a framework that allow you to easily create and layout UI components for iOS 8.0+. It use chaining syntax and provides some fr

nerdycat 288 Oct 9, 2022
Lightweight Swift framework for Apple's Auto-Layout

I am glad to share with you a lightweight Swift framework for Apple's Auto-Layout. It helps you write readable and compact UI code using simple API. A

null 349 Dec 20, 2022
An Impressive Auto Layout DSL for iOS, tvOS & OSX. & It is written in pure swift.

KVConstraintKit KVConstraintKit is a DSL to make easy & impressive Auto Layout constraints on iOS, tvOS & OSX with Swift Installation Using CocoaPods

Keshav Vishwkarma 90 Sep 1, 2022
A compact but full-featured Auto Layout DSL for Swift

Mortar allows you to create Auto Layout constraints using concise, simple code statements. Use this: view1.m_right |=| view2.m_left - 12.0 Instead of:

Jason Fieldman 83 Jan 29, 2022
The ultimate API for iOS & OS X Auto Layout — impressively simple, immensely powerful. Objective-C and Swift compatible.

The ultimate API for iOS & OS X Auto Layout — impressively simple, immensely powerful. PureLayout extends UIView/NSView, NSArray, and NSLayoutConstrai

PureLayout 7.6k Jan 6, 2023
A Swift Autolayout DSL for iOS & OS X

SnapKit is a DSL to make Auto Layout easy on both iOS and OS X. ⚠️ To use with Swift 4.x please ensure you are using >= 4.0.0 ⚠️ ⚠️ To use with Swift

null 19.1k Jan 2, 2023
Auto Layout In Swift Made Easy

Swiftstraints Swiftstraints can turn verbose auto-layout code: let constraint = NSLayoutConstraint(item: blueView, attr

null 119 Jan 29, 2022