Easy to use UIPageViewController to create a view navigation like Snapchat/Tinder/iOS Main Pages

Related tags

UI EZSwipeController
Overview

EZSwipeController

Cocoapods Compatible
Carthage compatible

Easy to use UIPageViewController to create a view navigation like Snapchat/Tinder/iOS Main Pages.

Demo

Manual Install (~10 seconds)

  1. Download and drop 'EZSwipeController.swift' in your project.
  2. Congratulations!

Install via CocoaPods (~10 seconds)

You can use CocoaPods to install EZSwipeController by adding it to your Podfile:

platform :ios, '8.0'
use_frameworks!
pod 'EZSwipeController'
import EZSwipeController

Install via Carthage (~5 seconds)

Carthage is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.

You can install Carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

To integrate EZSwipeController into your Xcode project using Carthage, specify it in your Cartfile:

github "goktugyil/EZSwipeController"

Run carthage update.

$ carthage update

Setup

Use with Storyboard

You can also use EZSwipeController via push or present on your UIViewcontrollers like:

presentViewController(EZSwipeController(), animated: true, completion: nil)

Use without Storyboard

If you want to use EZSwipe as root viewcontroller (Your apps starting point):

Go to Targets -> Your Target -> General -> Main Interface -> Delete it

Add this to your AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    window = UIWindow(frame: UIScreen.main.bounds)
    window!.rootViewController = MySwipeVC()
    window!.makeKeyAndVisible()
    return true
}

Usage

Create a subclass of EZSwipeController

import UIKit
// import EZSwipeController // if using CocoaPods
class MySwipeVC: EZSwipeController {
    override func setupView() {
        datasource = self
    }
}

extension MySwipeVC: EZSwipeControllerDataSource {
    func viewControllerData() -> [UIViewController] {
        let redVC = UIViewController()
        redVC.view.backgroundColor = UIColor.red
        
        let blueVC = UIViewController()
        blueVC.view.backgroundColor = UIColor.blue
        
        let greenVC = UIViewController()
        greenVC.view.backgroundColor = UIColor.green
        
        return [redVC, blueVC, greenVC]
    }
}

You should have something like this:

Change Background Color

class MySwipeVC: EZSwipeController {
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.yellowColor()
    }
}

Gives Titles To Pages

extension MySwipeVC: EZSwipeControllerDataSource {   
    func titlesForPages() -> [String] {
        return ["red", "blue", "green"]
    }
}

Starting Page Index

extension MySwipeVC: EZSwipeControllerDataSource {
    func indexOfStartingPage() -> Int {
        return 2 // EZSwipeController starts from 2nd, green page
    }
}

On Changed Page Index

extension MySwipeVC: EZSwipeControllerDataSource {
    func changedToPageIndex(index: Int) {
    	// You can do anything from here, for now we'll just print the new index
        print(index)
    }
}

Custom Navigation Bar

Setting up navigationBarDataForPageIndex overrides effects in titlesForPages.

extension MySwipeVC: EZSwipeControllerDataSource {
    func navigationBarDataForPageIndex(index: Int) -> UINavigationBar {
        var title = ""
        if index == 0 {
            title = "Charmander"
        } else if index == 1 {
            title = "Squirtle"
        } else if index == 2 {
            title = "Bulbasaur"
        }

        let navigationBar = UINavigationBar()
        navigationBar.barStyle = UIBarStyle.Default
//        navigationBar.barTintColor = QorumColors.WhiteLight
        print(navigationBar.barTintColor)
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blackColor()]
        
        let navigationItem = UINavigationItem(title: title)
        navigationItem.hidesBackButton = true
        
        if index == 0 {
            let rightButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "a")
            rightButtonItem.tintColor = UIColor.blackColor()
            
            navigationItem.leftBarButtonItem = nil
            navigationItem.rightBarButtonItem = rightButtonItem
        } else if index == 1 {
            let rightButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Bookmarks, target: self, action: "a")
            rightButtonItem.tintColor = UIColor.blackColor()
            
            let leftButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Camera, target: self, action: "a")
            leftButtonItem.tintColor = UIColor.blackColor()
            
            navigationItem.leftBarButtonItem = leftButtonItem
            navigationItem.rightBarButtonItem = rightButtonItem
        } else if index == 2 {            
            let leftButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Search, target: self, action: "a")
            leftButtonItem.tintColor = UIColor.blackColor()
            
            navigationItem.leftBarButtonItem = leftButtonItem
            navigationItem.rightBarButtonItem = nil
        } 
        navigationBar.pushNavigationItem(navigationItem, animated: false)
        return navigationBar
    }
}

You don't need to set actions to buttons, EZSwipeController automatically overrides them and makes them work.

Add Images To Navigation Bar

UIImage { let newSize = CGSize(width: w, height: h) UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) image.drawInRect(CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)) let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage } ">
extension MySwipeVC: EZSwipeControllerDataSource {
    func navigationBarDataForPageIndex(index: Int) -> UINavigationBar {
        var title = ""
        if index == 0 {
            title = "Charmander"
        } else if index == 1 {
            title = "Squirtle"
        } else if index == 2 {
            title = "Bulbasaur"
        }

        let navigationBar = UINavigationBar()
        navigationBar.barStyle = UIBarStyle.Default
        navigationBar.barTintColor = UIColor.purpleColor()
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.blackColor()]
        
        let navigationItem = UINavigationItem(title: title)
        navigationItem.hidesBackButton = true
        
        if index == 0 {
            var sImage = UIImage(named: "squir")!
            sImage = scaleTo(image: sImage, w: 22, h: 22)
            let rightButtonItem = UIBarButtonItem(image: sImage, style: UIBarButtonItemStyle.Plain, target: self, action: "a")
            rightButtonItem.tintColor = UIColor.blueColor()
            
            navigationItem.leftBarButtonItem = nil
            navigationItem.rightBarButtonItem = rightButtonItem
        } else if index == 1 {
            var cImage = UIImage(named: "char")!
            cImage = scaleTo(image: cImage, w: 22, h: 22)
            let leftButtonItem = UIBarButtonItem(image: cImage, style: UIBarButtonItemStyle.Plain, target: self, action: "a")
            leftButtonItem.tintColor = UIColor.redColor()
            
            var bImage = UIImage(named: "bulb")!
            bImage = scaleTo(image: bImage, w: 22, h: 22)
            let rightButtonItem = UIBarButtonItem(image: bImage, style: UIBarButtonItemStyle.Plain, target: self, action: "a")
            rightButtonItem.tintColor = UIColor.greenColor()
            
            navigationItem.leftBarButtonItem = leftButtonItem
            navigationItem.rightBarButtonItem = rightButtonItem
        } else if index == 2 {
            var sImage = UIImage(named: "squir")!
            sImage = scaleTo(image: sImage, w: 22, h: 22)
            let leftButtonItem = UIBarButtonItem(image: sImage, style: UIBarButtonItemStyle.Plain, target: self, action: "a")
            leftButtonItem.tintColor = UIColor.blueColor()
            
            navigationItem.leftBarButtonItem = leftButtonItem
            navigationItem.rightBarButtonItem = nil
        }
        navigationBar.pushNavigationItem(navigationItem, animated: false)
        return navigationBar
    }
}

private func scaleTo(image image: UIImage, w: CGFloat, h: CGFloat) -> UIImage {
    let newSize = CGSize(width: w, height: h)
    UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)
    image.drawInRect(CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return newImage
}

Custom Button Settings

Sometimes you may want to add your own actions to buttons, in that case you should disable the default button behaviour:

extension MySwipeVC: EZSwipeControllerDataSource {    
    func disableSwipingForLeftButtonAtPageIndex(index: Int) -> Bool {
        if index == 1 {
            return true
        }
        return false
    }
    
    func clickedLeftButtonFromPageIndex(index: Int) {
        if index == 1 {
            print("What!?! Squirtle is evolving!!")
        }
    }
}

You can also add your analytics and other stuff in here.

Move Navigation Bar to Bottom

class MySwipeVC: EZSwipeController {
    override func setupView() {
        super.setupView()
        datasource = self
        navigationBarShouldBeOnBottom = true
    }
}

Move To New Page

class MySwipeVC: EZSwipeController {
    override func setupView() {
        super.setupView()
        datasource = self
        
        self.moveToPage(0)
    }
}

Hide Navigation Bar

class MySwipeVC: EZSwipeController {
    override func setupView() {
        super.setupView()
        navigationBarShouldNotExist = true
    }
}

Extra Settings

override func setupView() {
    cancelStandardButtonEvents()
    // Use this setting if you are using custom button that  
    // has nothing to do with swiping the viewcontroller
}
self.currentVCIndex 
//Use this to get the current page index

Requirements

  • Swift 3 or later
  • For Swift 2 support use any Version before 0.6

Possible features

  • Better documentation with more fancy pictures!
  • Completing TODOs inside source files

Communication

  • If you need help, use Stack Overflow. (Tag 'ezswipecontroller')
  • If you found a bug, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.

License

EZSwipeController is available under the MIT license. See the LICENSE file.

Keywords

swift, extension, pageviewcontroller, uipageviewcontroller, tinder, snapchat, navigation

Comments
  • work with existing viewcontrollers in storyboard?

    work with existing viewcontrollers in storyboard?

    Is there a way to integrate EZSwipeController with existing view controllers in storyboard? I tried to do this but received an error when EZSwipeController tried to access view controllers. error : fatal error: unexpectedly found nil while unwrapping an Optional value

    opened by Jackson0111 14
  • Navigate to another controller with button action

    Navigate to another controller with button action

    Hey guys,

    I'm new to swift programming and wanted to know how to perform a swipe segue to another view controller using the same concept of the left button and right button except my buttons aren't part of a navigation controller.

    I have tried presenting the view controller when the user clicks the button but that destroys the whole swipe setup for obvious reasons.

    Please advise.

    Thank you!

    opened by itsjc 7
  • Crash when swaping and calling moveToPage at the same time.

    Crash when swaping and calling moveToPage at the same time.

    *** Assertion failure in -[UIPageViewController queuingScrollView:didEndManualScroll:toRevealView:direction:animated:didFinish:didComplete:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3512.60.12/UIPageViewController.m:2028

    bug 
    opened by DamonChen117 5
  • Swift 3 version

    Swift 3 version

    There are multiple ones, which one would you guys like to have implemented here?

    https://github.com/goktugyil/EZSwipeController/pull/36 https://github.com/goktugyil/EZSwipeController/pull/37 https://github.com/goktugyil/EZSwipeController/tree/swift-3

    opened by goktugyil 4
  • Added Page Change Handler and Carthage info to Readme.

    Added Page Change Handler and Carthage info to Readme.

    Heya.

    Last PR, I swear.. Just patched up the final thing I needed, and thought it might be useful as a general function.

    Edit: Also added a quick function to easily change your page programatically.

    If there are any issues, feel free to ping me!

    opened by JFKingsley 4
  • navigatiob bar issue

    navigatiob bar issue

    Ass all my view controllers have buttons on then and after passing the View controllers the newly crety view didnt contain their navigation bars included

    opened by gaganpsinghkrishnais 4
  • Implementing Init

    Implementing Init

    Hi! Any reason to leave init?(coder) unimplemented? Would this:

    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    

    cause any problems?

    opened by chrisnovello 4
  • Problem with View Controllers

    Problem with View Controllers

    Any UI design or work I do directly on one of the view controllers in the storyboard doesn't show up when compiled. It seems that i cant do any work outside the actual .Swift file. what's going on?

    extension INTNavigationController: EZSwipeControllerDataSource {
        func viewControllerData() -> [UIViewController] {
    
            let feedVC = FeedViewController()
            //feedVC.view.backgroundColor = UIColor.hotPink()
            let cameraVC = CameraViewController()
            //cameraVC.view.backgroundColor = UIColor.hotBlack()
            let profileVC = ProfileViewController()
            //profileVC.view.backgroundColor = UIColor.hotGreen()
    
            return [feedVC, cameraVC, profileVC]
        }
    }
    
    opened by boshd 3
  • Question

    Question

    Is there a way to start the navigation from a middle panel. Just like how tinder's main view is in the middle and you swipe to either the left side or right side to get to other views

    opened by AdventuresOfMar 3
  • it crashes on swift 3

    it crashes on swift 3

    trying to run on my ios 10

    private func setupViewControllers() {
        stackPageVC = [UIViewController]()
        stackVC.enumerated().forEach { index, viewController in
            let pageViewController = UIViewController()
            if !navigationBarShouldBeOnBottom && !navigationBarShouldNotExist {
                viewController.view.frame.origin.y += Constants.navigationBarHeight
            }
            pageViewController.addChildViewController(viewController)
            pageViewController.view.addSubview(viewController.view)
            viewController.didMove(toParentViewController: pageViewController)
            if !stackNavBars.isEmpty {
                pageViewController.view.addSubview(stackNavBars[index])
            }
            **stackPageVC.append(pageViewController)**
        }
        
        currentStackVC = stackPageVC[stackStartLocation]
    }
    

    the bold line causes SIGBART error

    opened by San-Jeevan 2
  • Question: Return correct view controllers?

    Question: Return correct view controllers?

    How do I return the correct view controllers? Here's my code that loops through the objects:

    ` // Loop through objects to determine which view controller to show for postObject in stackObjects {

            print("***STACKOBJECTS:***\(stackObjects)\n****")
            
            if postObject.value(forKey: "contentType") as! String == "tp" {
                // I) TEXT POST
                textPostObject.append(postObject)
                let textPostVC = self.storyboard?.instantiateViewController(withIdentifier: "textPostVC") as! TextPost
                // Append VC
                postControllers.append(textPostVC)
                
            } else if postObject.value(forKey: "contentType") as! String == "ph" {
                // II) PHOTO
                photoAssetObject.append(postObject)
                let photoVC = self.storyboard?.instantiateViewController(withIdentifier: "photoAssetVC") as! PhotoAsset
                // Append VC
                postControllers.append(photoVC)
                
            } else if postObject.value(forKey: "contentType") as! String == "pp" {
                // III) PROFILE PHOTO
                proPicObject.append(postObject)
                otherObject.append(postObject.value(forKey: "byUser") as! PFUser)
                otherName.append(postObject.value(forKey: "username") as! String)
                let proPicVC = self.storyboard?.instantiateViewController(withIdentifier: "profilePhotoVC") as! ProfilePhoto
                // Append VC
                postControllers.append(proPicVC)
                
            } else if postObject.value(forKey: "contentType") as! String == "sh" {
                // IV) SHARED POST
                sharedObject.append(postObject)
                let sharedPostVC = self.storyboard?.instantiateViewController(withIdentifier: "sharedPostVC") as! SharedPost
                // Append VC
                postControllers.append(sharedPostVC)
                
            } else if postObject.value(forKey: "contentType") as! String == "sp" {
                // V) SPACE POST
                spaceObject.append(postObject)
                otherObject.append(postObject.value(forKey: "toUser") as! PFUser)
                otherName.append(postObject.value(forKey: "toUsername") as! String)
                let spacePostVC = self.storyboard?.instantiateViewController(withIdentifier: "spacePostVC") as! SpacePost
                // Append VC
                postControllers.append(spacePostVC)
                
            } else if postObject.value(forKey: "contentType") as! String == "itm" {
                // VI) MOMENT
                itmObject.append(postObject)
                let itmVC = self.storyboard?.instantiateViewController(withIdentifier: "itmVC") as! InTheMoment
                // Append VC
                postControllers.append(itmVC)
                
            } else if postObject.value(forKey: "contentType") as! String == "vi" {
                // VII) VIDEO
                videoObject.append(postObject)
                let videoVC = self.storyboard?.instantiateViewController(withIdentifier: "videoVC") as! VideoAsset
                // Append VC
                postControllers.append(videoVC)
                
            }
            
        }`
    

    Where postControllers, is an array that holds all the UIViewControllers. HOWEVER, even with the correct startingIndex, it doesn't load the correct UIViewController. How do I handle this correctly?

    opened by HackShitUp 2
  • calling moveToPage from another View Controller

    calling moveToPage from another View Controller

    When I try to call moveToPage from another class it fails on this line:

    let currentIndex = stackPageVC.index(of: currentStackVC)!

    with the error:

    fatal error: unexpectedly found nil while unwrapping an Optional value

    here is my code:

    //View controller where the call is started
    @IBAction func buttonRightView(_ sender: Any) {
            let vc:ViewController = storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
            vc.goRight()
        }
    
    
    class ViewController: EZSwipeController {
        override func setupView() {
            datasource = self
            navigationBarShouldNotExist = true
        }
        func goRight(){
            moveToPage(1, animated: true)
        }
    }
    
    opened by Jmandarino 3
  • tableview inside swipe controller?

    tableview inside swipe controller?

    I have a tableview inside of a swipe controller, but i can't seem to swipe when im swiping on the cells. if i swipe in the section header it allows me to swipe.

    opened by patthehuman 0
  • linker command failed with exit code 1

    linker command failed with exit code 1

    The pull request you merged 7 days ago (from bryant1410), caused some problems for me. Im using Cocoapods and NeverCode (to push my test builds to HockeyApp), and everytime NeverCode compiled the source code, it would return a 'Undefined symbols for architecture arm64', followed by 'linker command failed with exit code 1'.

    If anyone experiences this, remove EZSwipeController from CocoaPods and do a manual install.

    Here was my SO question (which I solved): http://stackoverflow.com/questions/43685126/undefined-symbols-for-architecture-arm64-ios

    opened by joshoconnor89 0
  • moveToPage implementation incorrect

    moveToPage implementation incorrect

    `class FeaturedSwipeViewController: EZSwipeController, UIGestureRecognizerDelegate {

    let seg = UISegmentedControl(items: ["1", "2"])
    
    var advisor: Advisor!
    
    override func setupView() {
        super.setupView()
        datasource = self
        navigationBarShouldNotExist = true
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        seg.selectedSegmentIndex = 0
        seg.frame = CGRect(x: 0, y: 0, width: 200, height: 30)
        seg.addTarget(self, action: #selector(switchViewController(sender:)), for: .valueChanged)
        self.navigationItem.titleView = seg 
    }
    
    override var hidesBottomBarWhenPushed: Bool {
        get {
            return navigationController?.topViewController != self
        }
        set {
            super.hidesBottomBarWhenPushed = newValue
        }
    }
    
    func switchViewController(sender: UISegmentedControl) {
        self.moveToPage(sender.selectedSegmentIndex, animated: true)
    }
    

    }

    extension FeaturedSwipeViewController: EZSwipeControllerDataSource { func viewControllerData() -> [UIViewController] {

        let featuredTopicVC = STORY_BOARD.instantiateViewController(withIdentifier: "featuredTopicVC") as! FeaturedTopicTableViewController
        
        let featuredAMAVC = FeaturedAMATableViewController()
        
        return [featuredTopicVC, featuredAMAVC]
    }
    
    func changedToPageIndex(_ index: Int) {
        seg.selectedSegmentIndex = index
    }
    

    } `

    When tap on the second item of segmentedControl EZSwipeVC can move to second page correctly, but after sequentially tapping on the first segmentedControl item EZSwipeVC can't move back to the first page. Sorry for the broken code block styling.

    opened by Tinyik 0
Releases(0.6.1)
Owner
Goktug Yilmaz
World-class code copy paster.
Goktug Yilmaz
A drop-in universal library helps you to manage the navigation bar styles and makes transition animations smooth between different navigation bar styles

A drop-in universal library helps you to manage the navigation bar styles and makes transition animations smooth between different navigation bar styles while pushing or popping a view controller for all orientations. And you don't need to write any line of code for it, it all happens automatically.

Zhouqi Mo 3.3k Dec 21, 2022
Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if you are using Excel.

kishikawakatsumi/SpreadsheetView has moved! It is being actively maintained at bannzai/SpreadsheetView. This fork was created when the project was mov

Kishikawa Katsumi 34 Sep 26, 2022
Swift programming language hackathon. Implementation of the main logic of working with an ATM in the Playground environment.

Hackaton-ATM-PJ04 Swift programming language hackathon. Implementation of the main logic of working with an ATM in the Playground environment. The tas

Raman Kozar 2 Oct 4, 2022
List tree data souce to display hierachical data structures in lists-like way. It's UI agnostic, just like view-model and doesn't depend on UI framework

SwiftListTreeDataSource List tree data souce to display hierachical data structures in lists-like way. It's UI agnostic, just like view-model, so can

Dzmitry Antonenka 26 Nov 26, 2022
Confetti View lets you create a magnificent confetti view in your app

ConfettiView Confetti View lets you create a magnificent confetti view in your app. This was inspired by House Party app's login screen. Written in Sw

Or Ron 234 Nov 22, 2022
A library, which adds the ability to hide navigation bar when view controller is pushed via hidesNavigationBarWhenPushed flag

HidesNavigationBarWhenPushed A library, which adds the ability to hide navigation bar when view controller is pushed via hidesNavigationBarWhenPushed

Danil Gontovnik 55 Oct 19, 2022
An easy to use FAQ view for iOS written in Swift

FAQView An easy to use FAQ view for iOS written in Swift. This view is a subclass of UIView. Setup with CocoaPods If you are using CocoaPods add this

Mukesh Thawani 467 Dec 5, 2022
An easy to use FAQ view for iOS written in Swift

FAQView An easy to use FAQ view for iOS written in Swift. This view is a subclass of UIView. Setup with CocoaPods If you are using CocoaPods add this

Mukesh Thawani 466 Nov 9, 2021
Easy to use, highly customizable gauge view

GDGauge - Customizable Gauge View Requirements Xcode 11+ Swift 5 iOS 9+ Installation Swift Package Manager .package(url: "https://github.com/saeid/GDG

Saeid 74 Dec 5, 2022
Easily use UIKit views in your SwiftUI applications. Create Xcode Previews for UIView elements

SwiftUIKitView Easily use UIKit views in SwiftUI. Convert UIView to SwiftUI View Create Xcode Previews from UIView elements SwiftUI functional updatin

Antoine van der Lee 682 Dec 29, 2022
A UIControl subclass that makes it easy to create empty states.

AZEmptyState Making empty state simple. Screenshots Installation Cocoa Pods: pod 'AZEmptyState' Manual: Simply drag and drop the Sources folder to you

Antonio Zaitoun 88 Oct 2, 2022
Create view hierarchies declaratively.

Create view hierarchies declaratively. Quick Look view.pd.add( imageView.pd.image(logoImage), label.pd.text("Logo").textColor(.red).font(size:

Javier Zhang 69 Oct 19, 2022
🔍 Awesome fully customize search view like Pinterest written in Swift 5.0 + Realm support!

YNSearch + Realm Support Updates See CHANGELOG for details Intoduction ?? Awesome search view, written in Swift 5.0, appears search view like Pinteres

Kyle Yi 1.2k Dec 17, 2022
Powerful and easy-to-use vector graphics Swift library with SVG support

Macaw Powerful and easy-to-use vector graphics Swift library with SVG support We are a development agency building phenomenal apps. What is Macaw? Mac

Exyte 5.9k Jan 1, 2023
An easy to use UI component to help display a signal bar with an added customizable fill animation

TZSignalStrengthView for iOS Introduction TZSignalStrengthView is an easy to use UI component to help display a signal bar with an added customizable

TrianglZ LLC 22 May 14, 2022
Easy-to-use HStack that snaps to elements on scroll.

SnapToScroll Drop-in SwiftUI-based container view for horizontal snapping. example-video.mp4 Getting Started Using SnapToScroll is straightforward. Th

null 206 Jan 7, 2023
A child view controller framework that makes setting up your parent controllers as easy as pie.

Description Family is a child view controller framework that makes setting up your parent controllers as easy as pie. With a simple yet powerful publi

Christoffer Winterkvist 246 Dec 28, 2022
An easy way to add a shimmering effect to any view with just one line of code. It is useful as an unobtrusive loading indicator.

LoadingShimmer An easy way to add a shimmering effect to any view with just single line of code. It is useful as an unobtrusive loading indicator. Thi

Jogendra 1.4k Jan 4, 2023