Make your table view expandable just by implementing one method.

Overview

ExpyTableView

Version Swift 5.0 iOS 10.0+ License: MIT Platform contributions welcome

Alt Text

About

ExpyTableView is a re-write based on SLExpandableTableView. Takes some ideas, concepts and codes and regenerates them in Swift. Lets you create expandable table views as easily as its ancestor.

With ExpyTableView, you make an expandable table view by using multiple cells and inserting/deleting them(which can mean expanding and collapsing). With this approach, you will have a great chance in future design requests. All you will have to do is adding a new UITableViewCell and writing the code for it. You will easily have the new design.

When using ExpyTableView, sections are being expanded and collapsed. You implement your table view as you always do, and add an extra method. Then your section becomes expandable.

Requirements

VERSION 1.2.2:

  • SPM Support
  • iOS 10.0+
  • Swift 5.0+
  • Objective-C compatibility

VERSION 1.2.1:

  • CocoaPods version
  • iOS 10.0+
  • Swift 5.0+
  • Objective-C compatibility

VERSION 1.0:

  • iOS 8.0+
  • Swift 4.0+

VERSION 0.3.1:

  • iOS 8.0+
  • Swift 3.0+

Installation

ExpyTableView is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'ExpyTableView'

Or you can manually drag and drop the ExpyTableView.swift AND ExpyAbstractions.swift into your project, then use it.

How to use

First of all, if you are using Interface Builder, set your table view's class and module as ExpyTableView.'

Then start implementing required methods:

import ExpyTableView

class ViewController: ExpyTableViewDataSource {

  @IBOutlet weak var expandableTableView: ExpyTableView!

  // First, set data source for your table view.
  override func viewDidLoad() {
    super.viewDidLoad() 
    expandableTableView.dataSource = self
    //Set delegate if you will implement any UITableViewDelegate or ExpyTableViewDelegate methods.
    //expandableTableView.delegate = self 
  }

  // Then return your expandable cell instance from this data source method.
  func tableView(_ tableView: ExpyTableView, expandableCellForSection section: Int) -> UITableViewCell {
    // This cell will be displayed at IndexPath with (section: section and row: 0)
  }
} 

You are ready to go with the setup above.

Customization (optional)

extension ViewController {
  //OPTIONAL DATA SOURCE METHOD, default is true for all sections.
  func tableView(_ tableView: ExpyTableView, canExpandSection section: Int) -> Bool {
    return true //Return false if you want your section not to be expandable
  }
}

You can use optional delegate method:

extension ViewController: ExpyTableViewDelegate {

  //OPTIONAL DELEGATE METHOD, receives callbacks when a section will expand, will collapse, did expand, did collapse. A unified method.
  func tableView(_ tableView: ExpyTableView, expyState state: ExpyState, changeForSection section: Int) {

    switch state {
    case .willExpand:
     print("WILL EXPAND")

    case .willCollapse:
     print("WILL COLLAPSE")

    case .didExpand:
     print("DID EXPAND")

    case .didCollapse:
     print("DID COLLAPSE")
    }
  } 

If your header cell (which is section: section and row: 0) conforms to ExpyTableViewHeaderCell protocol which is optional, it gets notifications in changeState method: (See example project for more detailed usage)

class YourTableViewCell: UITableViewCell, ExpyTableViewHeaderCell{

  //changeState method has a cellReuse parameter to allow you to prepare your cell for reusing. 
  //All state info is allocated by ExpyTableView.
  func changeState(_ state: ExpyState, cellReuseStatus cellReuse: Bool) {

    switch state {
    case .willExpand:
     print("WILL EXPAND")

    case .willCollapse:
     print("WILL COLLAPSE")

    case .didExpand: 
     print("DID EXPAND")

    case .didCollapse:
     print("DID COLLAPSE")
    }
  }
}

You can manually expand or collapse any section like below:

  //These two methods are exposed publicly.
  public func expand(_ section: Int) {}
  public func collapse(_ section: Int) {}

  //You can use these methods as below.
  expandableTableView.collapse(0) //Collapse section at (index: 0) manually
  expandableTableView.expand(1) //Expand section at (index: 1) manually

You will get callbacks for all of the UITableViewDataSource or UITableViewDelegate methods. Just conform to ExpyTableViewDataSource and ExpyTableViewDelegate and they will forward you all the methods you need.

extension ViewController{

  //All of the UITableViewDataSource and UITableViewDelegate methods will be forwarded to you right as they are.
  //Here you can see two examples below.
  func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("DID SELECT row: \(indexPath.row), section: \(indexPath.section)")
  }

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
  }
}

See example code for more details and implementation examples.

Example

To run the example project, just download the project and open the xcworkspace file in Example folder.

Roadmap

  • Add a variable that allows collapsing the recently expanded section, when any other section is expanded
  • Add a variable that allows scrolling to recent expanded section rect to show it completely
  • Add a variable that allows clicking on any cell in section to expand or collapse the whole section
  • Add expandAll and collapseAll methods and functionality

All contributions about these issues or other improvements are really appreciated.

Screenshots

License

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

Comments
  • Compile errors in iOS 13.4

    Compile errors in iOS 13.4

    Hi, I'm getting compile errors using Xcode Version 11.4 (11E146), on iOS 13.4. The error is:

    /ExpyTableView/BasicExampleViewController.swift:30:1: Non-'@objc' method 'tableView(_:canExpandSection:)' does not satisfy requirement of '@objc' protocol 'ExpyTableViewDataSource'

    Please advise. Many thanks

    opened by daviddelmonte 3
  • Expanding section manually crashes the app

    Expanding section manually crashes the app

    I have tried to expand the section manually after table data is populated, like this:

    tableView.reloadData()
    DispatchQueue.main.async {
     self.tableView.expand(0)
    }
    

    The section header arrow does indicate that the section is expanded but it does not show any row. When I tap the section header again to collapse the section, it crashes with following error log:

    Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete row 4 from section 0 which only contains 1 rows before the update'
    *** First throw call stack:
    (
    	0   CoreFoundation                      0x00000001131e11e6 __exceptionPreprocess + 294
    	1   libobjc.A.dylib                     0x0000000111ee8031 objc_exception_throw + 48
    	2   CoreFoundation                      0x00000001131e6472 +[NSException raise:format:arguments:] + 98
    	3   Foundation                          0x000000010f5d1652 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
    	4   UIKit                               0x000000010fe6ba2c -[UITableView _endCellAnimationsWithContext:] + 5864
    	5   UIKit                               0x000000010fe88787 -[UITableView endUpdates] + 75
    	6   ExpyTableView                       0x000000010e8bba82 _T013ExpyTableViewAAC14startAnimating33_C70CB3C2C4CC770977F31BF165688B53LLyAB_AA0A10ActionTypeO4withSi10forSectiontF + 2994
    	7   ExpyTableView                       0x000000010e8babf3 _T013ExpyTableViewAAC7animate33_C70CB3C2C4CC770977F31BF165688B53LLyAA0A10ActionTypeO4with_Si10forSectiontF + 467
    	8   ExpyTableView                       0x000000010e8bac34 _T013ExpyTableViewAAC8collapseySiF + 36
    	9   ExpyTableView                       0x000000010e8bcc88 _T013ExpyTableViewAAC05tableC0ySo07UITableC0C_10Foundation9IndexPathV14didSelectRowAttF + 648
    	10  ExpyTableView                       0x000000010e8bcebc _T013ExpyTableViewAAC05tableC0ySo07UITableC0C_10Foundation9IndexPathV14didSelectRowAttFTo + 92
    	11  UIKit                               0x000000010fe8be89 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1813
    	12  UIKit                               0x000000010fe8c0a4 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 344
    	13  UIKit                               0x000000010fd584b3 _runAfterCACommitDeferredBlocks + 318
    	14  UIKit                               0x000000010fd4771e _cleanUpAfterCAFlushAndRunDeferredBlocks + 388
    	15  UIKit                               0x000000010fd75ea5 _afterCACommitHandler + 137
    	16  CoreFoundation                      0x0000000113183607 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    	17  CoreFoundation                      0x000000011318355e __CFRunLoopDoObservers + 430
    	18  CoreFoundation                      0x0000000113167b81 __CFRunLoopRun + 1537
    	19  CoreFoundation                      0x000000011316730b CFRunLoopRunSpecific + 635
    	20  GraphicsServices                    0x0000000119894a73 GSEventRunModal + 62
    	21  UIKit                               0x000000010fd4d057 UIApplicationMain + 159
    	22  QuranInHand                         0x000000010e0e4237 main + 55
    	23  libdyld.dylib                       0x000000011523b955 start + 1
    	24  ???                                 0x0000000000000001 0x0 + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException
    
    opened by zishanj 3
  • expyState automatically expand and collapse

    expyState automatically expand and collapse

    Hi, just trying to use your project. but my tableview always automatically expand and collapse (the expand even didn't show its item) whenever i click the section. Is there any wrong with that? i've been following and study your example as well

    expystate

    opened by vanillatte09 2
  • Unexpadable section collapses.

    Unexpadable section collapses.

    I have two sections in table view with first section having only one item and second section having multiple (header, detail) items. When any item in second section is expanded the first section expands and collapses simultaneously causing fluctuation in scroll. Any idea how to solve the same.

    opened by jombie 2
  • Error when adding just files and not using cocoapods

    Error when adding just files and not using cocoapods

    i believe the error is because in the file ExpyAbstractions.swift the import is for Foundation instead of UIKit. I changed the import and it's working fine now

    opened by RogelioHIT 2
  • Spaces in between section headers

    Spaces in between section headers

    Currently getting space between the section headers when the rows are closed. No spaces appear between the rows under the section. But can't seem to get rid of the spaces between the section headers.

    opened by marknf94 2
  • Set header multiline text?

    Set header multiline text?

    I want to set header multiline in header expand and in set cell.labelName.numberOfLines = 0 cell.labelName.lineBreakMode = .byWordWrapping is not multiline. And I want this header to be automatically height based on the number of lines.

    opened by Ligament 2
  • How change height for title

    How change height for title

    Its possible change height for title(section)? I try use autolayout, but always get same height. I try use override tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath), but not work, section and row get same height.

    Screenshot 2020-07-06 at 17 14 58

    Thanks

    opened by Leao-zz 1
  • Hello I found one problem that when I expand tableview but unable to collpased

    Hello I found one problem that when I expand tableview but unable to collpased

    This is the error log that debug to me

    how to reproduce is just scroll and expand that its..

    Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. ( "<NSLayoutConstraint:0x600003ef3d40 UIView:0x7fdcb112bf00.height == 15 (active)>", "<NSLayoutConstraint:0x600003eedc70 UIStackView:0x7fdcadc6f510.height == 66 (active)>", "<NSLayoutConstraint:0x600003eece10 'UISV-canvas-connection' UIStackView:0x7fdcadc6f510.top == UIView:0x7fdcb112bf00.top (active)>", "<NSLayoutConstraint:0x600003eef8e0 'UISV-canvas-connection' V:[UIView:0x7fdcade60cb0]-(0)-| (active, names: '|':UIStackView:0x7fdcadc6f510 )>", "<NSLayoutConstraint:0x600003eed400 'UISV-fill-equally' UIView:0x7fdcade820b0.height == UIView:0x7fdcb112bf00.height (active)>", "<NSLayoutConstraint:0x600003eed0e0 'UISV-fill-equally' UIView:0x7fdcade60cb0.height == UIView:0x7fdcb112bf00.height (active)>", "<NSLayoutConstraint:0x600003eece60 'UISV-spacing' V:[UIView:0x7fdcb112bf00]-(5)-[UIView:0x7fdcade820b0] (active)>", "<NSLayoutConstraint:0x600003eed040 'UISV-spacing' V:[UIView:0x7fdcade820b0]-(5)-[UIView:0x7fdcade60cb0] (active)>" )

    Will attempt to recover by breaking constraint <NSLayoutConstraint:0x600003ef3d40 UIView:0x7fdcb112bf00.height == 15 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful. 2020-03-16 17:27:59.271736+0700 True Smart Merchant[79627:2566823] [LayoutConstraints] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. ( "<NSLayoutConstraint:0x600003ef5d60 UIView:0x7fdcade820b0.height == 15 (active)>", "<NSLayoutConstraint:0x600003eedc70 UIStackView:0x7fdcadc6f510.height == 66 (active)>", "<NSLayoutConstraint:0x600003eece10 'UISV-canvas-connection' UIStackView:0x7fdcadc6f510.top == UIView:0x7fdcb112bf00.top (active)>", "<NSLayoutConstraint:0x600003eef8e0 'UISV-canvas-connection' V:[UIView:0x7fdcade60cb0]-(0)-| (active, names: '|':UIStackView:0x7fdcadc6f510 )>", "<NSLayoutConstraint:0x600003eed400 'UISV-fill-equally' UIView:0x7fdcade820b0.height == UIView:0x7fdcb112bf00.height (active)>", "<NSLayoutConstraint:0x600003eed0e0 'UISV-fill-equally' UIView:0x7fdcade60cb0.height == UIView:0x7fdcb112bf00.height (active)>", "<NSLayoutConstraint:0x600003eece60 'UISV-spacing' V:[UIView:0x7fdcb112bf00]-(5)-[UIView:0x7fdcade820b0] (active)>", "<NSLayoutConstraint:0x600003eed040 'UISV-spacing' V:[UIView:0x7fdcade820b0]-(5)-[UIView:0x7fdcade60cb0] (active)>" )

    Will attempt to recover by breaking constraint <NSLayoutConstraint:0x600003ef5d60 UIView:0x7fdcade820b0.height == 15 (active)>

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

    opened by bave233 1
  • Support Use in Objective C Projects

    Support Use in Objective C Projects

    For my particular application, the minimum adjustments needed for using ExpyTableView in Objective C were:

    • Add @objcMembers to ExpyTableView open class
    • Add @objc to necessary protocol definitions in ExpyAbstractions
    opened by ProximalPod 1
  • Selecting specific row under specific section

    Selecting specific row under specific section

    Is there any supporting function that selects specific row under specific section? It should auto scroll to specific section, expand it and then select specific row updating the scroll position.

    opened by zishanj 1
  • Certain Cells Only Expandable Possible?

    Certain Cells Only Expandable Possible?

    Hey, looking through your examples I did not see this but is it possible to have only certain cells expandable and others not? I have a scenario where the user can click on a cell and it does something, but then another cell would expand with options.

    Thanks!

    opened by gintechsystems 0
  • Section cell multi-line not supported

    Section cell multi-line not supported

    For some reason the section cell does not support multi-line label with wordwrap. It always show single line. May be its not auto-adjusting the height of the cell, although I am using tableView.rowHeight = UITableViewAutomaticDimension. Whereas child rows are auto-adjusting their height.

    Is there any workaround?

    opened by zishanj 3
  • Make sections non-collapsable once opened?

    Make sections non-collapsable once opened?

    Been trying to get cells to be non-collapsable once a user has expanded it. Turning off user interaction removes the scroll so thats no preferable. Setting a expanded state and then returning false in the canExpand function removes the first row (the expandable section). Any one have to implement a similar use case or know how to achieve this?

    opened by marknf94 1
  • ContentOffset/ScrollView is jumping when expanding/collapsing cells

    ContentOffset/ScrollView is jumping when expanding/collapsing cells

    Hi Guys.

    Thanks for this awesome library, it saved my life. Perhaps I met with an annoying bug. When I collapsed/expanded a section, the tableview's contentoffset had a weird jumping. After spent some hours of researching to solve this really annoying problem, I found out the best solution is to set an observer when the contentOffset is changing.

    After implementing some properties and the observer, the jumping affect disappears.

    fileprivate var isCellUpdateInProgress: Bool = false
    fileprivate var lastScrollOffset: CGPoint!
    open override var dataSource: UITableViewDataSource? {
    	get {
    		return super.dataSource
    	}
    	set(dataSource) {
    		guard let dataSource = dataSource else { return }
    		expyDataSource = dataSource as? ExpyTableViewDataSource
    		super.dataSource = self
            self.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.new, context: nil)
    	}
    }
    
    private func startAnimating(_ tableView: ExpyTableView, with type: ExpyActionType, forSection section: Int) {
    
    	let headerCell = (self.cellForRow(at: IndexPath(row: 0, section: section)))
    	let headerCellConformant = headerCell as? ExpyTableViewHeaderCell
    	
        
    	CATransaction.begin()
    
    	headerCell?.isUserInteractionEnabled = false
    	
    	//Inform the delegates here.
    	headerCellConformant?.changeState((type == .expand ? .willExpand : .willCollapse), cellReuseStatus: false)
    	expyDelegate?.tableView?(tableView, expyState: (type == .expand ? .willExpand : .willCollapse), changeForSection: section)
    
    	CATransaction.setCompletionBlock { [weak self] () -> (Void) in
    		//Inform the delegates here.
    		headerCellConformant?.changeState((type == .expand ? .didExpand : .didCollapse), cellReuseStatus: false)
    		
    		self?.expyDelegate?.tableView?(tableView, expyState: (type == .expand ? .didExpand : .didCollapse), changeForSection: section)
    		headerCell?.isUserInteractionEnabled = true
            self?.isCellUpdateInProgress = false
    	}
        isCellUpdateInProgress = true
        lastScrollOffset = tableView.contentOffset
    	tableView.beginUpdates()
        
    	//Don't insert or delete anything if section has only 1 cell.
    	if let sectionRowCount = expyDataSource?.tableView(tableView, numberOfRowsInSection: section), sectionRowCount > 1 {
    		
    		var indexesToProcess: [IndexPath] = []
    		
    		//Start from 1, because 0 is the header cell.
    		for row in 1..<sectionRowCount {
    			indexesToProcess.append(IndexPath(row: row, section: section))
    		}
    		//Expand means inserting rows, collapse means deleting rows.
    		if type == .expand {
    			self.insertRows(at: indexesToProcess, with: expandingAnimation)
    		}else if type == .collapse {
    			self.deleteRows(at: indexesToProcess, with: collapsingAnimation)
    		}
    	}
        
        tableView.endUpdates()
        tableView.layer.removeAllAnimations()
        self.setContentOffset(self.lastScrollOffset, animated: false)
    	CATransaction.commit()
    }
    
    override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "contentOffset" {
            if isCellUpdateInProgress {
                self.setContentOffset(self.lastScrollOffset, animated: false)
            }
        }
    }
    

    Hope it will help!

    opened by gaborcsontos 6
  • Support UITableView moveSection:toSection:

    Support UITableView moveSection:toSection:

    Visible sections is not updated when using moveSection:toSection:. So, if you try to move a section that is expanded to a location of a section that is not expanded, it will crash. I wrote an override for moveSection:toSection which works, but only for single moves. It will not work when moving multiple sections using performBatchUpdates:completion: or beginUpdates() and endUpdates().

    override open func moveSection(_ section: Int, toSection newSection: Int) {
        let sectionIsVisible = visibleSections[section] ?? false
        visibleSections.removeValue(forKey: section)
        if (newSection < section) {
            for i in stride(from:section - 1, through:newSection, by:-1){
                visibleSections[i+1] = visibleSections[i] ?? false
            }
        }else if (section < newSection){
            for i in stride(from:section + 1, through:newSection, by:1){
                visibleSections[i-1] = visibleSections[i] ?? false
            }
        }
        visibleSections[newSection] = sectionIsVisible
        super.moveSection(section, toSection: newSection)
    }
    
    opened by rholstad 3
Releases(1.0)
  • 1.0(Mar 8, 2018)

    BREAKING CHANGES:

    • Removing unnecessary "expandableSection" array and its use cases
    • Clean up the code, rename some delegate methods:
      • OLD func expandableCell(forSection section: Int, inTableView tableView: ExpyTableView) -> UITableViewCell

      • OLD func canExpand(section: Int, inTableView tableView: ExpyTableView) -> Bool

      • NEW func tableView(tableView: ExpyTableView, expandableCellForSection section: Int) -> UITableViewCell

      • NEW func tableView(_ tableView: ExpyTableView, canExpandSection section: Int) -> Bool

    see commit "134e83f" for more details.

    ADDITIONS:

    • Support Swift 4.0 #15

    • Completes #21 and adds abstractions to ExpyTableView class

    • Add explanations for #12

    Source code(tar.gz)
    Source code(zip)
  • 0.3.0(Jun 22, 2017)

    • Delegate methods are unified now. It returns ExpyState instead of ExpyActionType.
    • ExpyTableViewHeaderCell protocol is added. If a cell conforms to it, it gets state change updates in the changeState method.
    • Method named getActionType is removed.
    • ExpyState with didExpand and didColapse works more accurate now.(They were being called before the animation completely finished.)
    • First cell which is used to generate an expandable header is not being reloaded anymore during the expanding or collapsing animation. Because, this was preventing implementation of independent animations in it. (For example rotating the arrow in header cell.)
    • When an expandable cell tapped, its userInteractionEnabled parameter becomes false until the animation is completed.
    • Adding cellReuseStatus to changeState method of ExpyTableViewHeaderCell
    • Exposing (expand: section) and (collapse: section) methods.
    Source code(tar.gz)
    Source code(zip)
Owner
Okhan Okbay
Okhan Okbay
✨ Awesome expandable, collapsible tableview cell for iOS written in Swift 5

ExpandableCell Intoduction Fully refactored YNExapnadableCell with more concise, bug free. Easiest usage of expandable & collapsible cell for iOS, wri

Kyle Yi 728 Jan 1, 2023
Swift library to support collapsible sections in a table view.

CollapsibleTableSectionViewController A Swift library that helps you collapse table view sections. Features Support collapsible sections in a table vi

Su 349 Dec 18, 2022
Three Level Accordian View for IOS

ThreeLevelAccordian ThreeLevelAccordian is a three level accordian for IOS. It owes its base code to SwiftyAccordionCells. Most of the design is custo

Amrata Baghel 44 Sep 23, 2022
Savory is swift accrodion view implementation

Savory Savory is a swift accordion view implementation. Requirements Xcode 8.0 Swift 3.0 iOS 8 Installation Using CocoaPods: pod 'Savory', :git => 'ht

Nandin Borjigin 4 May 30, 2019
`SimpleExpandableView` is a SwiftUI view which can collapse and expand the content

SimpleExpandableView 中文说明 ExpandableView structure Example ExpandableView( headerSize: CGSize(width: 250.0, height: 50.0), cardSize: CGSize(wi

Tomortec 5 Oct 6, 2022
API to make great custom transitions in one method

AZTransitions Make your modal transition with custom animation. AZTransitions helps you think about creativity, giving specific API methods. Visual Ex

Alexander 418 Aug 4, 2022
This app is a sample app that recognizes specific voice commands such as "make it red", "make it blue", "make it green", and "make it black" and change the background color of the view in the frame.

VoiceOperationSample This app is a sample app that recognizes specific voice commands such as "make it red", "make it blue", "make it green", and "mak

Takuya Aso 3 Dec 3, 2021
App uses API to display information about City and State user using expandable table cell

Expandable Table Cell iOS App App uses API to display information about City and State user using expandable table cell Implemented Using MVVM with Cl

null 2 Nov 30, 2021
JSPatch bridge Objective-C and Javascript using the Objective-C runtime. You can call any Objective-C class and method in JavaScript by just including a small engine. JSPatch is generally used to hotfix iOS App.

JSPatch 中文介绍 | 文档 | JSPatch平台 请大家不要自行接入 JSPatch,统一接入 JSPatch 平台,让热修复在一个安全和可控的环境下使用。原因详见 这里 JSPatch bridges Objective-C and JavaScript using the Object

bang 11.4k Jan 1, 2023
Have you ever wanted to just throw your optional like a table?

JebStolem Have you ever wanted to just throw your optional like a table? Or mayb

Piotr Szadkowski 1 Feb 23, 2022
Collapse and expand UICollectionView sections with one method call.

This library provides a custom UICollectionView that allows to expand and collapse sections. Provides a simple API to manage collection view appearanc

Touchlane 172 Dec 26, 2022
TwilioChat_iOS - Twilio iOS SDK Implementaion Chat one-one Chat One-Many (Group)

TwilioChat_iOS - Twilio iOS SDK Implementaion Chat one-one Chat One-Many (Group) - Add Participant - Remove Participant Send Attachment Image Android - iOS Tested iOS - iOS Tested iOS - Android Tested React to Message, Delete a Message Read, Delivered, Sent Delete a Conversation Unread Messages Filter

Zeeshan Haider 2 May 23, 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
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 6, 2023
ViewAnimator brings your UI to life with just one line

ViewAnimator is a library for building complex iOS UIView animations in an easy way. It provides one line animations for any view included the ones wh

Marcos Griselli 6.9k Jan 2, 2023
AVXCAssets Generator takes path for your assets images and creates appiconset and imageset for you in just one click

AVXCAssets Generator Often while developing an app, We ran into a condition when we need to scale images to each and every aspect ratios for icons and

Angel Vasa 339 Dec 6, 2022
A Swift utility to make updating table views/collection views trivially easy and reliable.

ArrayDiff An efficient Swift utility to compute the difference between two arrays. Get the removedIndexes and insertedIndexes and pass them directly a

Adlai Holler 100 Jun 5, 2022
Automaticly display Log,Crash,Network,ANR,Leak,CPU,RAM,FPS,NetFlow,Folder and etc with one line of code based on Swift. Just like God opened his eyes

GodEye Automaticly display Log,Crash,Network,ANR,Leak,CPU,RAM,FPS,NetFlow,Folder and etc with one line of code based on Swift. Just like God opened hi

陈奕龙(子循) 3.7k Dec 23, 2022
This "Calculator" application is a simple one screen design of calculator screen i have made this single screen design application just to practice AutoLayout concepts.

Calculator Layout This "Calculator" application is a simple one screen design of calculator screen i have made this single screen design application j

Chetan Parate 1 Oct 29, 2021