Repository: azonov/ExpandableTable
Branch: master
Commit: b174053436ed
Files: 36
Total size: 84.2 KB
Directory structure:
gitextract_apmunmq8/
├── .gitignore
├── AZExpandable.podspec
├── Example/
│ ├── ExpandableCell/
│ │ ├── Supporting Files/
│ │ │ ├── AppDelegate.swift
│ │ │ ├── Assets.xcassets/
│ │ │ │ └── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ └── LaunchScreen.storyboard
│ │ │ └── Info.plist
│ │ ├── View Controller/
│ │ │ ├── BasicDemoViewController.swift
│ │ │ ├── CellFactory.swift
│ │ │ ├── ComplexDemoViewController.swift
│ │ │ ├── LoadMoreDemoViewController.swift
│ │ │ └── PickerItemsController.swift
│ │ ├── ViewModels/
│ │ │ ├── TableViewModel.swift
│ │ │ └── TableViewModelFactory.swift
│ │ └── Views/
│ │ ├── Base.lproj/
│ │ │ └── Demo.storyboard
│ │ ├── CenteredLabelCell.swift
│ │ └── CenteredLabelCell.xib
│ ├── ExpandableCell.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── ExpandableCell.xcworkspace/
│ │ ├── contents.xcworkspacedata
│ │ └── xcshareddata/
│ │ └── IDEWorkspaceChecks.plist
│ └── Podfile
├── Gemfile
├── LICENSE
├── README.md
├── Source/
│ ├── ExpandableCell-Bridging-Header.h
│ ├── ExpandableTable/
│ │ ├── Cells/
│ │ │ ├── ActivityIndicatorCell.swift
│ │ │ ├── DatePickerCell.swift
│ │ │ ├── PickerCell.swift
│ │ │ └── UIView+Autolayout.swift
│ │ ├── ExpandableCellInfo.swift
│ │ ├── ExpandableTable.swift
│ │ ├── IndexPath+SyntaxSugar.swift
│ │ └── PagingTable.swift
│ └── Proxy/
│ ├── ExpandableProxy.h
│ └── ExpandableProxy.m
└── _config.yml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Mac OS X
.DS_Store
# Xcode
## Build generated
build/
DerivedData
## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
## Other
*.xccheckout
*.moved-aside
*.xcuserstate
*.xcscmblueprint
## Obj-C/Swift specific
*.hmap
*.ipa
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
.build/
# Carthage
Carthage/Build
ExpandableCell.xcworkspace/contents.xcworkspacedata
Pods/Manifest.lock
Pods/Target Support Files/AZExpandable/AZExpandable-dummy.m
Pods/Target Support Files/AZExpandable/AZExpandable-prefix.pch
Pods/Target Support Files/AZExpandable/AZExpandable-umbrella.h
Pods/Target Support Files/AZExpandable/AZExpandable.modulemap
Pods/Target Support Files/AZExpandable/AZExpandable.xcconfig
Pods/Target Support Files/AZExpandable/Info.plist
Pods/Target Support Files/Pods-ExpandableCell/Info.plist
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-acknowledgements.markdown
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-acknowledgements.plist
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-dummy.m
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-frameworks.sh
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-resources.sh
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-umbrella.h
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell.debug.xcconfig
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell.modulemap
Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell.release.xcconfig
================================================
FILE: AZExpandable.podspec
================================================
Pod::Spec.new do |s|
s.name = 'AZExpandable'
s.version = '1.1.0'
s.summary = 'AZExpandable is a lightweight proxy for UITableView to expand cells.'
s.platform = :ios
s.ios.deployment_target = '9.0'
s.swift_version = '5.0'
s.homepage = 'https://github.com/azonov/expandableTable.git'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'Andrey Zonov' => 'andryzonov@gmail.com' }
s.source = { :git => 'https://github.com/azonov/expandableTable.git', :tag => s.version.to_s }
s.source_files = 'Source/**/*'
end
================================================
FILE: Example/ExpandableCell/Supporting Files/AppDelegate.swift
================================================
//
// AppDelegate.swift
// ExpandableCell
//
// Created by Andrey Zonov on 18/10/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
return true
}
}
================================================
FILE: Example/ExpandableCell/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "29x29",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "40x40",
"scale" : "3x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "60x60",
"scale" : "3x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "29x29",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "40x40",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "1x"
},
{
"idiom" : "ipad",
"size" : "76x76",
"scale" : "2x"
},
{
"idiom" : "ipad",
"size" : "83.5x83.5",
"scale" : "2x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/ExpandableCell/Supporting Files/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A277" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
================================================
FILE: Example/ExpandableCell/Supporting Files/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Demo</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>
================================================
FILE: Example/ExpandableCell/View Controller/BasicDemoViewController.swift
================================================
//
// BasicDemoViewController.swift
// ExpandableCell
//
// Created by Andrey Zonov on 19/12/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import Foundation
import AZExpandable
class BasicDemoViewController: UIViewController {
// MARK: IBOutlet's
@IBOutlet private weak var tableView: UITableView!
// MARK: Private Properties
private var expandableTable: ExpandableTable!
private var expandedCell: ExpandedCellInfo?
// MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
CellFactory.registerCells(for: tableView)
expandableTable = ExpandableTable(with: tableView, infoProvider: self)
}
private func toggleItem(at indexPath: IndexPath) {
guard expandedCell?.indexPath != indexPath else {
expandableTable.unexpandCell()
expandedCell = nil
return
}
// Construct your cell here
let cellType: ExpandedCellInfo.CellType = .custom { [weak self] indexPath -> (UITableViewCell) in
let centeredCell = self?.tableView.dequeueReusableCell(withIdentifier: "CenteredLabelCell",
for: indexPath) as! CenteredLabelCell
centeredCell.configure(with: "Hint Inside your custom cell")
centeredCell.backgroundColor = .lightGray
return centeredCell
}
let cell = ExpandedCellInfo(for: indexPath, cellType: cellType)
expandedCell = cell
expandableTable.expandCell(cell)
}
}
// MARK: - UITableViewDataSource
extension BasicDemoViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 100
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CenteredLabelCell", for: indexPath) as! CenteredLabelCell
cell.configure(with: "Tap to reveal hint for \(indexPath.row) row")
return cell
}
}
// MARK: - UITableViewDelegate
extension BasicDemoViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
toggleItem(at: indexPath)
}
}
================================================
FILE: Example/ExpandableCell/View Controller/CellFactory.swift
================================================
//
// CellFactory.swift
// ExpandableCell
//
// Created by Andrey Zonov on 08/11/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import UIKit
struct CellFactory {
// MARK: Private
private static let cellIdentifier = "CenteredLabelCell"
// MARK: Public
enum CellFactoryError: Error {
case unsupportedType
case wrongIdentifier
}
// MARK: Public
static func cell(for cellModel: TableViewModel.Section.Cell,
in tableView: UITableView,
indexPath: IndexPath,
cellAction: @escaping (() -> ())) throws -> UITableViewCell
{
guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier,
for: indexPath) as? CenteredLabelCell
else { throw CellFactoryError.wrongIdentifier }
cell.configure(with: cellModel.title)
return cell
}
static func registerCells(for tableView: UITableView) {
let cellIdentifiers = [cellIdentifier]
for cellIdentifier in cellIdentifiers {
let nib = UINib(nibName: cellIdentifier, bundle: .main)
tableView.register(nib, forCellReuseIdentifier: cellIdentifier)
}
}
}
================================================
FILE: Example/ExpandableCell/View Controller/ComplexDemoViewController.swift
================================================
//
// ComplexDemoViewController.swift
// ExpandableCell
//
// Created by Andrey Zonov on 18/10/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import UIKit
import AZExpandable
class ComplexDemoViewController: UIViewController {
// MARK: IBOutlet's
@IBOutlet private weak var tableView: UITableView!
// MARK: Private Properties
private var expandableTable: ExpandableTable!
private var expandedCell: ExpandedCellInfo?
private var tableViewModel = TableViewModelFactory.staticExpandableTable
private var pickerController: PickerItemsController?
// MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
CellFactory.registerCells(for: tableView)
expandableTable = ExpandableTable(with: tableView, infoProvider: self)
// DataSource and Delegate for PickerView, closure is about value changing
pickerController = PickerItemsController { title in
if let indexPath = self.expandedCell?.indexPath {
var viewModel = self.tableViewModel.cell(for: indexPath)
viewModel.title = title
self.tableViewModel.replace(cell: viewModel, at: indexPath)
self.tableView.reloadRows(at: [indexPath], with: .automatic)
}
}
}
private func toggleItem(at indexPath: IndexPath) {
guard expandedCell?.indexPath != indexPath else {
expandableTable.unexpandCell()
expandedCell = nil
return
}
let cellViewModel = tableViewModel.sections[indexPath.section].cells[indexPath.row]
let cellType: ExpandedCellInfo.CellType
switch cellViewModel.expandingType {
case .date:
cellType = .datePicker { datePicker in
datePicker.minimumDate = Date()
datePicker.addTarget(self.pickerController,
action: #selector(PickerItemsController.datePickerDidChangeValue),
for: .valueChanged)
}
case .picker:
cellType = .picker { picker in
picker.dataSource = self.pickerController
picker.delegate = self.pickerController
}
case .custom:
cellType = .custom { [weak self] indexPath -> (UITableViewCell) in
let centeredCell = self?.tableView.dequeueReusableCell(withIdentifier: "CenteredLabelCell",
for: indexPath) as! CenteredLabelCell
centeredCell.configure(with: "Hint Inside your custom cell")
centeredCell.backgroundColor = .lightGray
return centeredCell
}
}
let cell = ExpandedCellInfo(for: indexPath, cellType: cellType)
expandedCell = cell
expandableTable.expandCell(cell)
}
}
// MARK: - UITableViewDataSource
extension ComplexDemoViewController: UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return tableViewModel.sections.count
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let section = tableViewModel.sections[section]
return section.title
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableViewModel.sections[section].cells.count
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cellModel = tableViewModel.sections[indexPath.section].cells[indexPath.row]
do {
return try CellFactory.cell(for: cellModel, in: tableView, indexPath: indexPath) { [weak self] in
self?.toggleItem(at: indexPath)
}
} catch {
assertionFailure("handle \(error)")
return UITableViewCell(style: .default, reuseIdentifier: "default")
}
}
}
// MARK: - UITableViewDelegate
extension ComplexDemoViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
toggleItem(at: indexPath)
}
}
================================================
FILE: Example/ExpandableCell/View Controller/LoadMoreDemoViewController.swift
================================================
//
// LoadMoreDemoViewController.swift
// ExpandableCell
//
// Created by Andrey Zonov on 11/17/18.
// Copyright © 2018 Andrey Zonov. All rights reserved.
//
import Foundation
import AZExpandable
class LoadMoreDemoViewController: UIViewController {
// MARK: IBOutlet's
@IBOutlet private weak var tableView: UITableView!
// MARK: Private Properties
private var pagingTable: PagingTable!
private var rowsCount = 20
// MARK: Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
CellFactory.registerCells(for: tableView)
pagingTable = PagingTable(tableView: tableView, infoProvider: self)
{ [weak self] paging in
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
self?.rowsCount += 20
self?.tableView.reloadData()
})
}
}
@IBAction func paginationValueChanged(_ sender: UISwitch) {
if sender.isOn {
try? pagingTable.addPagingIndicator()
} else {
try? pagingTable.removePagingIndicator()
}
}
}
// MARK: - UITableViewDataSource
extension LoadMoreDemoViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rowsCount
}
func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CenteredLabelCell", for: indexPath) as! CenteredLabelCell
cell.configure(with: "\(indexPath.row) row")
return cell
}
}
// MARK: - UITableViewDelegate
extension LoadMoreDemoViewController: UITableViewDelegate {}
================================================
FILE: Example/ExpandableCell/View Controller/PickerItemsController.swift
================================================
//
// PickerItemsController.swift
// ExpandableCell
//
// Created by Andrey Zonov on 18/12/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import UIKit
class PickerItemsController: NSObject, UIPickerViewDelegate, UIPickerViewDataSource {
private var updateClosure: (String)->()
init(updateClosure: @escaping (String)->()) {
self.updateClosure = updateClosure
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return 10
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return "row \(row) component \(component)"
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
if let title = self.pickerView(pickerView, titleForRow: row, forComponent: component) {
updateClosure(title)
}
}
@objc func datePickerDidChangeValue(_ datePicker: UIDatePicker) {
let title = DateFormatter.localizedString(from: datePicker.date, dateStyle: .medium, timeStyle: .medium)
updateClosure(title)
}
}
================================================
FILE: Example/ExpandableCell/ViewModels/TableViewModel.swift
================================================
//
// TableViewModel.swift
// ExpandableCell
//
// Created by Andrey Zonov on 27/10/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import Foundation
enum ExpandingType {
case date
case picker
case custom
}
struct TableViewModel {
struct Section {
struct Cell {
var title: String
var expandingType: ExpandingType
}
let title: String?
var cells: [Cell]
}
static var expandable = TableViewModel(sections: [])
var sections: [Section]
}
extension TableViewModel {
func cell(for indexPath: IndexPath) -> TableViewModel.Section.Cell {
return sections[indexPath.section].cells[indexPath.row]
}
mutating func replace(cell: TableViewModel.Section.Cell, at indexPath: IndexPath) {
sections[indexPath.section].cells[indexPath.row] = cell
}
}
================================================
FILE: Example/ExpandableCell/ViewModels/TableViewModelFactory.swift
================================================
//
// TableViewModelFactory.swift
// ExpandableCell
//
// Created by Andrey Zonov on 08/11/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import Foundation
struct TableViewModelFactory {
static var staticExpandableTable: TableViewModel {
let helpCell1 = TableViewModel.Section.Cell(title: "Tap to reveal help1", expandingType: .custom)
let helpCell2 = TableViewModel.Section.Cell(title: "Tap to reveal help2", expandingType: .custom)
let helpCell3 = TableViewModel.Section.Cell(title: "Tap to reveal help3", expandingType: .custom)
let dateCell1 = TableViewModel.Section.Cell(title: "Date 1", expandingType: .date)
let dateCell2 = TableViewModel.Section.Cell(title: "Date 2", expandingType: .date)
let dateCell3 = TableViewModel.Section.Cell(title: "Date 3", expandingType: .date)
let pickerCell1 = TableViewModel.Section.Cell(title: "Picker 1", expandingType: .picker)
let pickerCell2 = TableViewModel.Section.Cell(title: "Picker 2", expandingType: .picker)
let pickerCell3 = TableViewModel.Section.Cell(title: "Picker 3", expandingType: .picker)
let sectionHelp = TableViewModel.Section(title: "Help cells section", cells: [helpCell1, helpCell2, helpCell3])
let sectionDate = TableViewModel.Section(title: "Date cells section", cells: [dateCell1, dateCell2, dateCell3])
let sectionPicker = TableViewModel.Section(title: "Picker cells section", cells: [pickerCell1, pickerCell2, pickerCell3])
return TableViewModel(sections: [sectionHelp, sectionDate, sectionPicker])
}
}
================================================
FILE: Example/ExpandableCell/Views/Base.lproj/Demo.storyboard
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="A4z-GJ-Xm8">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Examples-->
<scene sceneID="3AR-gL-olV">
<objects>
<tableViewController id="Qfe-Kt-zTA" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" id="fi3-ym-b78">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<sections>
<tableViewSection id="QXs-zl-fFO">
<cells>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="tpq-ma-EKT" style="IBUITableViewCellStyleDefault" id="F1j-6Y-3Hi">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="F1j-6Y-3Hi" id="bgp-2L-EUY">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Basic Example" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="tpq-ma-EKT">
<rect key="frame" x="16" y="0.0" width="343" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="LSg-Xo-NAd" kind="show" id="HoI-zk-SeW"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="1Gh-Pr-GGf" style="IBUITableViewCellStyleDefault" id="qMw-69-Tf4">
<rect key="frame" x="0.0" y="44" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="qMw-69-Tf4" id="hjw-MG-isc">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Complex Example" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="1Gh-Pr-GGf">
<rect key="frame" x="16" y="0.0" width="343" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="BYZ-38-t0r" kind="show" id="Gxb-BZ-vJQ"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="mdl-Tm-p7a" style="IBUITableViewCellStyleDefault" id="VfJ-q6-kpM">
<rect key="frame" x="0.0" y="88" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="VfJ-q6-kpM" id="nb4-Uf-AEE">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Load More" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="mdl-Tm-p7a">
<rect key="frame" x="16" y="0.0" width="343" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="8Lg-0Q-EDq" kind="show" id="uG1-EJ-c0d"/>
</connections>
</tableViewCell>
</cells>
</tableViewSection>
</sections>
<connections>
<outlet property="dataSource" destination="Qfe-Kt-zTA" id="7EF-NJ-wdU"/>
<outlet property="delegate" destination="Qfe-Kt-zTA" id="26o-uJ-Gus"/>
</connections>
</tableView>
<navigationItem key="navigationItem" title="Examples" id="rhb-hN-QWP"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="vmo-CE-Vf8" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="262" y="290"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="bbI-hR-dsE">
<objects>
<navigationController id="A4z-GJ-Xm8" sceneMemberID="viewController">
<navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="7gF-My-XSY">
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<connections>
<segue destination="Qfe-Kt-zTA" kind="relationship" relationship="rootViewController" id="qmn-Sf-FOg"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="61i-Ak-vkD" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="-442" y="289"/>
</scene>
<!--Basic Demo View Controller-->
<scene sceneID="N2C-hJ-aZ9">
<objects>
<viewController id="LSg-Xo-NAd" customClass="BasicDemoViewController" customModule="ExpandableCell" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="gJh-hD-um8">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="zAt-Jo-0QJ">
<rect key="frame" x="0.0" y="64" width="375" height="603"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<connections>
<outlet property="dataSource" destination="LSg-Xo-NAd" id="EmZ-vZ-eCY"/>
<outlet property="delegate" destination="LSg-Xo-NAd" id="Oti-bM-5RH"/>
</connections>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstItem="FTD-Ky-SA6" firstAttribute="trailing" secondItem="zAt-Jo-0QJ" secondAttribute="trailing" id="9Ra-iG-d6T"/>
<constraint firstItem="zAt-Jo-0QJ" firstAttribute="leading" secondItem="FTD-Ky-SA6" secondAttribute="leading" id="HKJ-g5-a9H"/>
<constraint firstItem="FTD-Ky-SA6" firstAttribute="bottom" secondItem="zAt-Jo-0QJ" secondAttribute="bottom" id="dQf-6w-MlQ"/>
<constraint firstItem="zAt-Jo-0QJ" firstAttribute="top" secondItem="FTD-Ky-SA6" secondAttribute="top" id="ehM-sf-hZj"/>
</constraints>
<viewLayoutGuide key="safeArea" id="FTD-Ky-SA6"/>
</view>
<connections>
<outlet property="tableView" destination="zAt-Jo-0QJ" id="FAl-ZW-RNe"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="Pvg-22-pqK" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1046" y="-38"/>
</scene>
<!--Complex Demo View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ComplexDemoViewController" customModule="ExpandableCell" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="18" sectionFooterHeight="18" translatesAutoresizingMaskIntoConstraints="NO" id="VAF-Vr-Iar">
<rect key="frame" x="0.0" y="64" width="375" height="603"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
</tableView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="6Tk-OE-BBY" firstAttribute="bottom" secondItem="VAF-Vr-Iar" secondAttribute="bottom" id="7Yz-fu-r5C"/>
<constraint firstItem="VAF-Vr-Iar" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="D0u-CX-aje"/>
<constraint firstItem="VAF-Vr-Iar" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" id="Tfx-hB-Ozd"/>
<constraint firstItem="6Tk-OE-BBY" firstAttribute="trailing" secondItem="VAF-Vr-Iar" secondAttribute="trailing" id="nMB-b7-SUO"/>
</constraints>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
<connections>
<outlet property="tableView" destination="VAF-Vr-Iar" id="dJg-1C-L3F"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1046" y="645"/>
</scene>
<!--Load More Demo View Controller-->
<scene sceneID="ApR-oU-PFc">
<objects>
<viewController id="8Lg-0Q-EDq" customClass="LoadMoreDemoViewController" customModule="ExpandableCell" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="buT-Ho-Chy">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="rbM-8m-cHK">
<rect key="frame" x="0.0" y="64" width="375" height="559"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</tableView>
<toolbar opaque="NO" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Ydc-nw-xFQ">
<rect key="frame" x="0.0" y="623" width="375" height="44"/>
<items>
<barButtonItem style="plain" id="9q0-l9-yY1">
<switch key="customView" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" id="GoA-CG-DTN">
<rect key="frame" x="16" y="6.5" width="51" height="31"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<connections>
<action selector="paginationValueChanged:" destination="8Lg-0Q-EDq" eventType="valueChanged" id="XLd-da-uvq"/>
</connections>
</switch>
</barButtonItem>
</items>
</toolbar>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Load more" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pwF-Yv-Gdh">
<rect key="frame" x="80" y="634.5" width="82" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="rbM-8m-cHK" firstAttribute="leading" secondItem="NoI-GG-6lu" secondAttribute="leading" id="CUR-gC-jag"/>
<constraint firstItem="rbM-8m-cHK" firstAttribute="top" secondItem="NoI-GG-6lu" secondAttribute="top" id="EhK-GG-4Yu"/>
<constraint firstItem="NoI-GG-6lu" firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="pwF-Yv-Gdh" secondAttribute="trailing" symbolic="YES" id="QYH-v5-kVB"/>
<constraint firstItem="NoI-GG-6lu" firstAttribute="bottom" secondItem="Ydc-nw-xFQ" secondAttribute="bottom" id="YyE-gZ-Cjx"/>
<constraint firstItem="NoI-GG-6lu" firstAttribute="trailing" secondItem="rbM-8m-cHK" secondAttribute="trailing" id="Z0n-MM-qaR"/>
<constraint firstItem="Ydc-nw-xFQ" firstAttribute="leading" secondItem="NoI-GG-6lu" secondAttribute="leading" id="cAn-2h-h8J"/>
<constraint firstItem="pwF-Yv-Gdh" firstAttribute="leading" secondItem="NoI-GG-6lu" secondAttribute="leading" constant="80" id="cS6-vY-6Sk"/>
<constraint firstItem="Ydc-nw-xFQ" firstAttribute="top" secondItem="rbM-8m-cHK" secondAttribute="bottom" id="fAp-Ie-nu8"/>
<constraint firstItem="Ydc-nw-xFQ" firstAttribute="trailing" secondItem="NoI-GG-6lu" secondAttribute="trailing" id="tjN-cg-2bF"/>
<constraint firstItem="pwF-Yv-Gdh" firstAttribute="centerY" secondItem="Ydc-nw-xFQ" secondAttribute="centerY" id="ySy-p7-cOP"/>
</constraints>
<viewLayoutGuide key="safeArea" id="NoI-GG-6lu"/>
</view>
<connections>
<outlet property="tableView" destination="rbM-8m-cHK" id="Kzo-m9-FtN"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="HHM-oa-a9d" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1712.8" y="287.40629685157421"/>
</scene>
</scenes>
</document>
================================================
FILE: Example/ExpandableCell/Views/CenteredLabelCell.swift
================================================
//
// CenteredLabelCell.swift
// ExpandableCell
//
// Created by Andrey Zonov on 08/11/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import UIKit
class CenteredLabelCell: UITableViewCell {
// MARK: Private Outlets
@IBOutlet private var label: UILabel!
// MARK: Lifecycle
override func awakeFromNib() {
super.awakeFromNib()
selectionStyle = .none
}
override func prepareForReuse() {
super.prepareForReuse()
label.text = ""
backgroundColor = .white
}
// MARK: Public
func configure(with title: String) {
label.text = title
}
}
================================================
FILE: Example/ExpandableCell/Views/CenteredLabelCell.xib
================================================
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="13196" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13174"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="CenteredLabelCell" id="xDi-h4-UJc" customClass="CenteredLabelCell" customModule="ExpandableCell" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="xDi-h4-UJc" id="1JT-o5-crR">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="WNO-cq-URg">
<rect key="frame" x="8" y="8" width="359" height="24"/>
<fontDescription key="fontDescription" type="system" weight="light" pointSize="20"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstAttribute="bottomMargin" relation="greaterThanOrEqual" secondItem="WNO-cq-URg" secondAttribute="bottom" id="PK8-pX-hXS"/>
<constraint firstAttribute="trailingMargin" secondItem="WNO-cq-URg" secondAttribute="trailing" id="aSP-ZB-rQf"/>
<constraint firstItem="WNO-cq-URg" firstAttribute="top" secondItem="1JT-o5-crR" secondAttribute="topMargin" id="ldP-39-kDB"/>
<constraint firstItem="WNO-cq-URg" firstAttribute="leading" secondItem="1JT-o5-crR" secondAttribute="leadingMargin" id="z8r-8g-1uS"/>
</constraints>
</tableViewCellContentView>
<connections>
<outlet property="label" destination="WNO-cq-URg" id="sgM-OQ-e0I"/>
</connections>
<point key="canvasLocation" x="53" y="29"/>
</tableViewCell>
</objects>
</document>
================================================
FILE: Example/ExpandableCell.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 48;
objects = {
/* Begin PBXBuildFile section */
544BBBECEC7CBA6DC12582BA /* Pods_ExpandableCell.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9CAEC0521AA1804F5AD4A219 /* Pods_ExpandableCell.framework */; };
5759872B1FA39FE200239B5E /* TableViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5759872A1FA39FE200239B5E /* TableViewModel.swift */; };
579732361F971A43006DB071 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 579732351F971A43006DB071 /* AppDelegate.swift */; };
579732381F971A43006DB071 /* ComplexDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 579732371F971A43006DB071 /* ComplexDemoViewController.swift */; };
5797323B1F971A43006DB071 /* Demo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 579732391F971A43006DB071 /* Demo.storyboard */; };
5797323D1F971A43006DB071 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5797323C1F971A43006DB071 /* Assets.xcassets */; };
579732401F971A43006DB071 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5797323E1F971A43006DB071 /* LaunchScreen.storyboard */; };
57FF07FF1FB2CBC2008C0958 /* TableViewModelFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57FF07FE1FB2CBC2008C0958 /* TableViewModelFactory.swift */; };
57FF08071FB2D957008C0958 /* CenteredLabelCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 57FF08061FB2D957008C0958 /* CenteredLabelCell.xib */; };
57FF08091FB2D9BB008C0958 /* CenteredLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57FF08081FB2D9BB008C0958 /* CenteredLabelCell.swift */; };
57FF080D1FB2DB73008C0958 /* CellFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57FF080C1FB2DB73008C0958 /* CellFactory.swift */; };
FB3A0DBB1FE82D2A00D5C0A6 /* PickerItemsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB3A0DBA1FE82D2A00D5C0A6 /* PickerItemsController.swift */; };
FBAA601B219F0E24004CC2FA /* LoadMoreDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBAA601A219F0E24004CC2FA /* LoadMoreDemoViewController.swift */; };
FBDF2A041FE8FCC600889B28 /* BasicDemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBDF2A031FE8FCC600889B28 /* BasicDemoViewController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
5759872A1FA39FE200239B5E /* TableViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewModel.swift; sourceTree = "<group>"; };
579732321F971A43006DB071 /* ExpandableCell.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExpandableCell.app; sourceTree = BUILT_PRODUCTS_DIR; };
579732351F971A43006DB071 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
579732371F971A43006DB071 /* ComplexDemoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComplexDemoViewController.swift; sourceTree = "<group>"; };
5797323A1F971A43006DB071 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Demo.storyboard; sourceTree = "<group>"; };
5797323C1F971A43006DB071 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
5797323F1F971A43006DB071 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
579732411F971A43006DB071 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
57FF07FE1FB2CBC2008C0958 /* TableViewModelFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewModelFactory.swift; sourceTree = "<group>"; };
57FF08061FB2D957008C0958 /* CenteredLabelCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CenteredLabelCell.xib; sourceTree = "<group>"; };
57FF08081FB2D9BB008C0958 /* CenteredLabelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenteredLabelCell.swift; sourceTree = "<group>"; };
57FF080C1FB2DB73008C0958 /* CellFactory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CellFactory.swift; sourceTree = "<group>"; };
5B9DB0A27CB6D3B14B4FA504 /* Pods-ExpandableCell.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpandableCell.debug.xcconfig"; path = "Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell.debug.xcconfig"; sourceTree = "<group>"; };
8A984765D95495A0BB3DFE38 /* Pods-ExpandableCell.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ExpandableCell.release.xcconfig"; path = "Pods/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell.release.xcconfig"; sourceTree = "<group>"; };
9CAEC0521AA1804F5AD4A219 /* Pods_ExpandableCell.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ExpandableCell.framework; sourceTree = BUILT_PRODUCTS_DIR; };
FB3A0DBA1FE82D2A00D5C0A6 /* PickerItemsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PickerItemsController.swift; sourceTree = "<group>"; };
FBAA601A219F0E24004CC2FA /* LoadMoreDemoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadMoreDemoViewController.swift; sourceTree = "<group>"; };
FBDF2A031FE8FCC600889B28 /* BasicDemoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BasicDemoViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
5797322F1F971A43006DB071 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
544BBBECEC7CBA6DC12582BA /* Pods_ExpandableCell.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
0FDE01C8E17946A046C6AC32 /* Frameworks */ = {
isa = PBXGroup;
children = (
9CAEC0521AA1804F5AD4A219 /* Pods_ExpandableCell.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
2CD19F1321C5BD94F03DDF41 /* Pods */ = {
isa = PBXGroup;
children = (
5B9DB0A27CB6D3B14B4FA504 /* Pods-ExpandableCell.debug.xcconfig */,
8A984765D95495A0BB3DFE38 /* Pods-ExpandableCell.release.xcconfig */,
);
name = Pods;
sourceTree = "<group>";
};
579732291F971A43006DB071 = {
isa = PBXGroup;
children = (
579732341F971A43006DB071 /* ExpandableCell */,
579732331F971A43006DB071 /* Products */,
2CD19F1321C5BD94F03DDF41 /* Pods */,
0FDE01C8E17946A046C6AC32 /* Frameworks */,
);
sourceTree = "<group>";
};
579732331F971A43006DB071 /* Products */ = {
isa = PBXGroup;
children = (
579732321F971A43006DB071 /* ExpandableCell.app */,
);
name = Products;
sourceTree = "<group>";
};
579732341F971A43006DB071 /* ExpandableCell */ = {
isa = PBXGroup;
children = (
57FF08031FB2CEDF008C0958 /* ViewModels */,
57FF08021FB2CED3008C0958 /* Views */,
57FF08011FB2CEB8008C0958 /* View Controller */,
57FF08001FB2CE51008C0958 /* Supporting Files */,
);
path = ExpandableCell;
sourceTree = "<group>";
};
57FF08001FB2CE51008C0958 /* Supporting Files */ = {
isa = PBXGroup;
children = (
5797323C1F971A43006DB071 /* Assets.xcassets */,
5797323E1F971A43006DB071 /* LaunchScreen.storyboard */,
579732411F971A43006DB071 /* Info.plist */,
579732351F971A43006DB071 /* AppDelegate.swift */,
);
path = "Supporting Files";
sourceTree = "<group>";
};
57FF08011FB2CEB8008C0958 /* View Controller */ = {
isa = PBXGroup;
children = (
FBDF2A031FE8FCC600889B28 /* BasicDemoViewController.swift */,
579732371F971A43006DB071 /* ComplexDemoViewController.swift */,
FBAA601A219F0E24004CC2FA /* LoadMoreDemoViewController.swift */,
FB3A0DBA1FE82D2A00D5C0A6 /* PickerItemsController.swift */,
57FF080C1FB2DB73008C0958 /* CellFactory.swift */,
);
path = "View Controller";
sourceTree = "<group>";
};
57FF08021FB2CED3008C0958 /* Views */ = {
isa = PBXGroup;
children = (
579732391F971A43006DB071 /* Demo.storyboard */,
57FF08081FB2D9BB008C0958 /* CenteredLabelCell.swift */,
57FF08061FB2D957008C0958 /* CenteredLabelCell.xib */,
);
path = Views;
sourceTree = "<group>";
};
57FF08031FB2CEDF008C0958 /* ViewModels */ = {
isa = PBXGroup;
children = (
5759872A1FA39FE200239B5E /* TableViewModel.swift */,
57FF07FE1FB2CBC2008C0958 /* TableViewModelFactory.swift */,
);
path = ViewModels;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
579732311F971A43006DB071 /* ExpandableCell */ = {
isa = PBXNativeTarget;
buildConfigurationList = 579732441F971A43006DB071 /* Build configuration list for PBXNativeTarget "ExpandableCell" */;
buildPhases = (
3B9DABDA8FCD5AA9B2C3ADF1 /* [CP] Check Pods Manifest.lock */,
5797322E1F971A43006DB071 /* Sources */,
5797322F1F971A43006DB071 /* Frameworks */,
579732301F971A43006DB071 /* Resources */,
C68FC4EE3E073A697ABC5066 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = ExpandableCell;
productName = ExpandableCell;
productReference = 579732321F971A43006DB071 /* ExpandableCell.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
5797322A1F971A43006DB071 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 0900;
LastUpgradeCheck = 1010;
ORGANIZATIONNAME = "Andrey Zonov";
TargetAttributes = {
579732311F971A43006DB071 = {
CreatedOnToolsVersion = 9.0.1;
LastSwiftMigration = 1030;
ProvisioningStyle = Automatic;
};
};
};
buildConfigurationList = 5797322D1F971A43006DB071 /* Build configuration list for PBXProject "ExpandableCell" */;
compatibilityVersion = "Xcode 8.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 579732291F971A43006DB071;
productRefGroup = 579732331F971A43006DB071 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
579732311F971A43006DB071 /* ExpandableCell */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
579732301F971A43006DB071 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
579732401F971A43006DB071 /* LaunchScreen.storyboard in Resources */,
5797323D1F971A43006DB071 /* Assets.xcassets in Resources */,
5797323B1F971A43006DB071 /* Demo.storyboard in Resources */,
57FF08071FB2D957008C0958 /* CenteredLabelCell.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B9DABDA8FCD5AA9B2C3ADF1 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-ExpandableCell-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
C68FC4EE3E073A697ABC5066 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/AZExpandable/AZExpandable.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AZExpandable.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ExpandableCell/Pods-ExpandableCell-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
5797322E1F971A43006DB071 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
5759872B1FA39FE200239B5E /* TableViewModel.swift in Sources */,
57FF08091FB2D9BB008C0958 /* CenteredLabelCell.swift in Sources */,
579732381F971A43006DB071 /* ComplexDemoViewController.swift in Sources */,
57FF07FF1FB2CBC2008C0958 /* TableViewModelFactory.swift in Sources */,
FB3A0DBB1FE82D2A00D5C0A6 /* PickerItemsController.swift in Sources */,
57FF080D1FB2DB73008C0958 /* CellFactory.swift in Sources */,
FBAA601B219F0E24004CC2FA /* LoadMoreDemoViewController.swift in Sources */,
FBDF2A041FE8FCC600889B28 /* BasicDemoViewController.swift in Sources */,
579732361F971A43006DB071 /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
579732391F971A43006DB071 /* Demo.storyboard */ = {
isa = PBXVariantGroup;
children = (
5797323A1F971A43006DB071 /* Base */,
);
name = Demo.storyboard;
sourceTree = "<group>";
};
5797323E1F971A43006DB071 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
5797323F1F971A43006DB071 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
579732421F971A43006DB071 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 4.2;
};
name = Debug;
};
579732431F971A43006DB071 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
SWIFT_VERSION = 4.2;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
579732451F971A43006DB071 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 5B9DB0A27CB6D3B14B4FA504 /* Pods-ExpandableCell.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = "ExpandableCell/Supporting Files/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.azonov.ExpandableCell;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
579732461F971A43006DB071 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 8A984765D95495A0BB3DFE38 /* Pods-ExpandableCell.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_STYLE = Automatic;
INFOPLIST_FILE = "ExpandableCell/Supporting Files/Info.plist";
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.azonov.ExpandableCell;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
5797322D1F971A43006DB071 /* Build configuration list for PBXProject "ExpandableCell" */ = {
isa = XCConfigurationList;
buildConfigurations = (
579732421F971A43006DB071 /* Debug */,
579732431F971A43006DB071 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
579732441F971A43006DB071 /* Build configuration list for PBXNativeTarget "ExpandableCell" */ = {
isa = XCConfigurationList;
buildConfigurations = (
579732451F971A43006DB071 /* Debug */,
579732461F971A43006DB071 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 5797322A1F971A43006DB071 /* Project object */;
}
================================================
FILE: Example/ExpandableCell.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:ExpandableCell.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: Example/ExpandableCell.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:ExpandableCell.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: Example/ExpandableCell.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: Example/Podfile
================================================
use_frameworks!
target 'ExpandableCell' do
pod 'AZExpandable', :path => '../'
end
================================================
FILE: Gemfile
================================================
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "cocoapods"
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2017 Andrey
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================

**AZExpandable** is a lightweight proxy for UITableView to expand cells. It incapsulates native NSProxy mechanism inside and gives swifty api outside.
<br />
<br />General advantages: **No Subclassing**, **No Swizzling**, **Easy to intagrate**
- [Requirements](#requirements)
- [Communication](#communication)
- [Installation](#installation)
- [Usage](#usage)
- [License](#license)
## Example

## Requirements
- iOS 8.0+
- Xcode 9.2+
- Swift 4.0+
## Communication
- If you'd like to **ask a general question**, use [Twitter](http://twitter.com/avzonov).
- 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.
## Installation
### CocoaPods
[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
```bash
$ gem install cocoapods
```
> CocoaPods 1.1+ is required to build AZExpandable.
To integrate AZExpandable into your Xcode project using CocoaPods, specify it in your `Podfile`:
```ruby
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
target '<Your Target Name>' do
pod 'AZExpandable'
end
```
Then, run the following command:
```bash
$ pod install
```
## Usage
```swift
private var expandableTable: ExpandableTable!// Expanding Table Proxy
override func viewDidLoad() {
super.viewDidLoad()
// infoProvider - UITableViewDelegate & UITableViewDataSource
expandableTable = ExpandableTable(with: tableView, infoProvider: self)
}
func expandCell(at indexPath: IndexPath) {
let cellClosure: CellClosure = { (IndexPath) -> (UITableViewCell) in
//Your custom expanding cell
return self.tableView.dequeueReusableCell(withIdentifier: "Identifier", for: indexPath)
}
expandableTable.expandCell(ExpandedCellInfo(for: indexPath, cellType: .custom(cellClosure)))
}
func unexpandCell() {
expandableTable.unexpandCell()
}
```
## License
AZExpandable is released under the MIT license. [See LICENSE](https://github.com/azonov/expandableTable/blob/master/LICENSE) for details.
================================================
FILE: Source/ExpandableCell-Bridging-Header.h
================================================
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "ExpandableProxy.h"
================================================
FILE: Source/ExpandableTable/Cells/ActivityIndicatorCell.swift
================================================
//
// ActivityIndicatorCell.swift
// AZExpandable
//
// Created by Andrey Zonov on 11/17/18.
//
import UIKit
class ActivityIndicatorCell: UITableViewCell {
// MARK: Public Properties
lazy var activityIndicator: UIActivityIndicatorView = {
let frame = CGRect(origin: .zero, size: CGSize(width: 50, height: 50))
let activityIndicator = UIActivityIndicatorView(frame: frame)
activityIndicator.color = .black
activityIndicator.hidesWhenStopped = false
return activityIndicator
}()
// MARK: Lifecycle
init() {
super.init(style: .default, reuseIdentifier: String(describing: type(of: self)))
addSubview(activityIndicator)
activityIndicator.makeEdgesEqualToSuperView()
activityIndicator.startAnimating()
heightAnchor.constraint(equalToConstant: 44).isActive = true
separatorInset = UIEdgeInsets(top: 0, left: CGFloat.infinity, bottom: 0, right: 0)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
================================================
FILE: Source/ExpandableTable/Cells/DatePickerCell.swift
================================================
//
// DatePickerCell.swift
// AZExpandable
//
// Created by Andrey Zonov on 20/10/2017.
//
import UIKit
class DatePickerCell: UITableViewCell {
// MARK: Public Properties
weak var datePicker: UIDatePicker!
// MARK: Lifecycle
init() {
let datePicker = UIDatePicker(frame: .zero)
self.datePicker = datePicker
super.init(style: .default, reuseIdentifier: String(describing: type(of: self)))
addSubview(datePicker)
datePicker.makeEdgesEqualToSuperView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
================================================
FILE: Source/ExpandableTable/Cells/PickerCell.swift
================================================
//
// PickerCell.swift
// Pods-ExpandableCell
//
// Created by Andrey Zonov on 27/10/2017.
//
import UIKit
class PickerCell: UITableViewCell {
// MARK: Public Properties
weak var picker: UIPickerView!
// MARK: Lifecycle
init() {
let picker = UIPickerView(frame: .zero)
self.picker = picker
super.init(style: .default, reuseIdentifier: String(describing: type(of: self)))
addSubview(picker)
picker.makeEdgesEqualToSuperView()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
================================================
FILE: Source/ExpandableTable/Cells/UIView+Autolayout.swift
================================================
//
// UIView+Autolayout.swift
// AZExpandable
//
// Created by Andrey Zonov on 11/16/18.
//
import UIKit
extension UIView {
func makeEdgesEqualToSuperView() {
guard let superView = superview else {
return
}
translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
topAnchor.constraint(equalTo: superView.topAnchor),
bottomAnchor.constraint(equalTo: superView.bottomAnchor),
leftAnchor.constraint(equalTo: superView.leftAnchor),
rightAnchor.constraint(equalTo: superView.rightAnchor)])
}
}
================================================
FILE: Source/ExpandableTable/ExpandableCellInfo.swift
================================================
//
// ExpandableCellInfo.swift
// Pods
//
// Created by Andrey Zonov on 20/10/2017.
//
import UIKit
public typealias CellClosure = ((IndexPath) -> (UITableViewCell))
public typealias DatePickerSetupClosure = ((UIDatePicker) -> ())
public typealias PickerSetupClosure = ((UIPickerView) -> ())
public struct ExpandedCellInfo: Equatable {
// MARK: Private Data Structures
public enum CellType {
case datePicker(DatePickerSetupClosure?)
case picker(PickerSetupClosure)
case custom(CellClosure)
}
// MARK: Public Properties
public var indexPath: IndexPath
public var cellType: CellType
// MARK: Lifecycle
public init(for indexPath: IndexPath, cellType: CellType) {
self.indexPath = indexPath
self.cellType = cellType
}
// MARK: Public
public static func ==(lhs: ExpandedCellInfo, rhs: ExpandedCellInfo) -> Bool {
return lhs.indexPath == rhs.indexPath
}
func isHigherInSameSection(than hint: ExpandedCellInfo) -> Bool {
return hint.indexPath.section == indexPath.section
&& hint.indexPath.row > indexPath.row
}
func computedIndexPath(from indexPath: IndexPath) -> IndexPath {
var computedIndexPath = indexPath
if indexPath.section == self.indexPath.section
&& indexPath.row > self.indexPath.row {
computedIndexPath.decrementRow()
}
return computedIndexPath
}
}
================================================
FILE: Source/ExpandableTable/ExpandableTable.swift
================================================
//
// ExpandableTable.swift
// ExpandableCell
//
// Created by Andrey Zonov on 18/10/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
import Foundation
public typealias TableInfoProvider = UITableViewDelegate & UITableViewDataSource
public class ExpandableTable: NSObject {
// MARK: Private Properties
private var proxy: ExpandableProxy?
private var expandedCell: ExpandedCellInfo?
private weak var tableView: UITableView!
private weak var infoProvider: TableInfoProvider!
// MARK: Lifecycle
public init(with tableView: UITableView, infoProvider: TableInfoProvider) {
self.tableView = tableView
self.infoProvider = infoProvider
super.init()
proxy = ExpandableProxy(tableDelegate: infoProvider, proxyDelegate: self)
tableView.dataSource = proxy
tableView.delegate = proxy
}
// MARK: Public
public func expandCell(_ cell: ExpandedCellInfo) {
var resultCell = cell
resultCell.indexPath.incrementRow()
guard expandedCell != resultCell else { return }
if expandedCell != nil {
unexpandCell()
}
expandedCell = resultCell
tableView.beginUpdates()
tableView?.insertRows(at: [resultCell.indexPath], with: .middle)
tableView.endUpdates()
}
public func unexpandCell() {
guard let indexPath = expandedCell?.indexPath else { return }
expandedCell = nil
tableView.beginUpdates()
tableView?.deleteRows(at: [indexPath], with: .middle)
tableView.endUpdates()
}
}
// MARK: - UITableViewDataSource
extension ExpandableTable: UITableViewDataSource {
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let rows = infoProvider.tableView(tableView ,numberOfRowsInSection: section)
guard let expandedCell = expandedCell else {
return rows
}
return expandedCell.indexPath.section == section ? rows + 1 : rows
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard indexPath != expandedCell?.indexPath else {
switch expandedCell!.cellType {
case .custom(let cellClosure):
return cellClosure(indexPath)
case .datePicker(let setupClosure):
let cell = DatePickerCell()
setupClosure?(cell.datePicker)
return cell
case .picker(let setupClosure):
let cell = PickerCell()
setupClosure(cell.picker)
return cell
}
}
let computedIndexPath = expandedCell?.computedIndexPath(from: indexPath) ?? indexPath
return infoProvider.tableView(tableView, cellForRowAt: computedIndexPath)
}
}
// MARK: - UITableViewDelegate
extension ExpandableTable: UITableViewDelegate {
public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
guard indexPath != expandedCell?.indexPath else {
return UITableView.automaticDimension
}
let computedIndexPath = expandedCell?.computedIndexPath(from: indexPath) ?? indexPath
return infoProvider.tableView?(tableView, heightForRowAt: computedIndexPath) ?? UITableView.automaticDimension
}
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if indexPath != expandedCell?.indexPath {
let computedIndexPath = expandedCell?.computedIndexPath(from: indexPath) ?? indexPath
infoProvider.tableView?(tableView, didSelectRowAt: computedIndexPath)
}
}
}
================================================
FILE: Source/ExpandableTable/IndexPath+SyntaxSugar.swift
================================================
//
// IndexPath+SyntaxSugar.swift
// Pods
//
// Created by Andrey Zonov on 20/10/2017.
//
import Foundation
extension IndexPath {
mutating func incrementRow() {
row += 1
}
mutating func decrementRow() {
row -= 1
}
}
================================================
FILE: Source/ExpandableTable/PagingTable.swift
================================================
//
// PagingTable.swift
// AZExpandable
//
// Created by Andrey Zonov on 18/11/2018.
//
import UIKit
public typealias NextPageClosure = (PagingTable) -> ()
public class PagingTable: NSObject {
public enum PagingError: Error {
case described(string: String)
}
// MARK: Private Properties
private var proxy: ExpandableProxy?
private var loadMoreIndexPath: IndexPath?
private weak var tableView: UITableView!
private weak var infoProvider: TableInfoProvider!
private var nextPageClosure: NextPageClosure
// MARK: Lifecycle
public init(tableView: UITableView,
infoProvider: TableInfoProvider,
nextPage: @escaping NextPageClosure) {
self.tableView = tableView
self.infoProvider = infoProvider
self.nextPageClosure = nextPage
super.init()
proxy = ExpandableProxy(tableDelegate: infoProvider, proxyDelegate: self)
tableView.dataSource = proxy
tableView.delegate = proxy
}
public func addPagingIndicator() throws {
try makePagingIndicatorVisible(true)
}
public func removePagingIndicator() throws {
try makePagingIndicatorVisible(false)
}
private func makePagingIndicatorVisible(_ isVisible: Bool) throws {
let sectionsCount = tableView.numberOfSections
guard sectionsCount > 0 else {
throw PagingError.described(string: "numberOfSections > 0")
}
let rowsCount = tableView.numberOfRows(inSection: sectionsCount - 1)
guard rowsCount > 0 else {
throw PagingError.described(string: "rowsCount > 0")
}
var indexPath = IndexPath(item: rowsCount - 1,
section: sectionsCount - 1)
loadMoreIndexPath = isVisible ? indexPath : nil
tableView.beginUpdates()
if isVisible {
indexPath.incrementRow()
tableView?.insertRows(at: [indexPath], with: .top)
} else {
tableView?.deleteRows(at: [indexPath], with: .bottom)
}
tableView.endUpdates()
}
}
// MARK: - UITableViewDataSource
extension PagingTable: UITableViewDataSource {
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let rows = infoProvider.tableView(tableView ,numberOfRowsInSection: section)
if loadMoreIndexPath?.section == section {
loadMoreIndexPath?.row = rows
return rows + 1
} else {
return rows
}
}
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard loadMoreIndexPath != indexPath else {
return ActivityIndicatorCell()
}
return infoProvider.tableView(tableView, cellForRowAt: indexPath)
}
}
// MARK: - UITableViewDelegate
extension PagingTable: UITableViewDelegate {
public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
guard loadMoreIndexPath != indexPath else {
nextPageClosure(self)
return
}
infoProvider.tableView?(tableView, willDisplay: cell, forRowAt: indexPath)
}
public func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
guard loadMoreIndexPath != indexPath else {
return UITableView.automaticDimension
}
return infoProvider.tableView?(tableView, heightForRowAt: indexPath) ?? UITableView.automaticDimension
}
public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
guard loadMoreIndexPath != indexPath else {
return
}
infoProvider.tableView?(tableView, didSelectRowAt: indexPath)
}
}
================================================
FILE: Source/Proxy/ExpandableProxy.h
================================================
//
// ExpandableProxy.h
// ExpandableCell
//
// Created by Andrey Zonov on 18/10/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ExpandableProxy : NSProxy <UITableViewDelegate, UITableViewDataSource>
- (instancetype)initWithTableDelegate:(id <UITableViewDelegate, UITableViewDataSource>)tableDelegate
proxyDelegate:(id <UITableViewDelegate, UITableViewDataSource>)proxyDelegate;
@end
================================================
FILE: Source/Proxy/ExpandableProxy.m
================================================
//
// ExpandableProxy.m
// ExpandableCell
//
// Created by Andrey Zonov on 18/10/2017.
// Copyright © 2017 Andrey Zonov. All rights reserved.
//
#import "ExpandableProxy.h"
@interface ExpandableProxy()
@property (nonatomic, weak) id proxyDelegate;
@property (nonatomic, weak) id tableDelegate;
@end
@implementation ExpandableProxy
- (instancetype)initWithTableDelegate:(id <UITableViewDelegate, UITableViewDataSource>)tableDelegate
proxyDelegate:(id <UITableViewDelegate, UITableViewDataSource>)proxyDelegate
{
self.tableDelegate = tableDelegate;
self.proxyDelegate = proxyDelegate;
return self;
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
if ([self.proxyDelegate respondsToSelector:aSelector]) {
return self.proxyDelegate;
} else if ([self.tableDelegate respondsToSelector:aSelector]) {
return self.tableDelegate;
}
return nil;
}
- (BOOL)respondsToSelector:(SEL)aSelector {
if ([self.proxyDelegate respondsToSelector:aSelector]) {
return YES;
} else if ([self.tableDelegate respondsToSelector:aSelector]) {
return YES;
}
return NO;
}
- (void)forwardInvocation:(NSInvocation *)invocation {
[invocation invokeWithTarget:self.tableDelegate];
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
return [self.tableDelegate methodSignatureForSelector:sel];
}
@end
================================================
FILE: _config.yml
================================================
theme: jekyll-theme-architect
gitextract_apmunmq8/ ├── .gitignore ├── AZExpandable.podspec ├── Example/ │ ├── ExpandableCell/ │ │ ├── Supporting Files/ │ │ │ ├── AppDelegate.swift │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ └── LaunchScreen.storyboard │ │ │ └── Info.plist │ │ ├── View Controller/ │ │ │ ├── BasicDemoViewController.swift │ │ │ ├── CellFactory.swift │ │ │ ├── ComplexDemoViewController.swift │ │ │ ├── LoadMoreDemoViewController.swift │ │ │ └── PickerItemsController.swift │ │ ├── ViewModels/ │ │ │ ├── TableViewModel.swift │ │ │ └── TableViewModelFactory.swift │ │ └── Views/ │ │ ├── Base.lproj/ │ │ │ └── Demo.storyboard │ │ ├── CenteredLabelCell.swift │ │ └── CenteredLabelCell.xib │ ├── ExpandableCell.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ └── contents.xcworkspacedata │ ├── ExpandableCell.xcworkspace/ │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata/ │ │ └── IDEWorkspaceChecks.plist │ └── Podfile ├── Gemfile ├── LICENSE ├── README.md ├── Source/ │ ├── ExpandableCell-Bridging-Header.h │ ├── ExpandableTable/ │ │ ├── Cells/ │ │ │ ├── ActivityIndicatorCell.swift │ │ │ ├── DatePickerCell.swift │ │ │ ├── PickerCell.swift │ │ │ └── UIView+Autolayout.swift │ │ ├── ExpandableCellInfo.swift │ │ ├── ExpandableTable.swift │ │ ├── IndexPath+SyntaxSugar.swift │ │ └── PagingTable.swift │ └── Proxy/ │ ├── ExpandableProxy.h │ └── ExpandableProxy.m └── _config.yml
Condensed preview — 36 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (94K chars).
[
{
"path": ".gitignore",
"chars": 1664,
"preview": "# Mac OS X\n.DS_Store\n\n# Xcode\n\n## Build generated\nbuild/\nDerivedData\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.m"
},
{
"path": "AZExpandable.podspec",
"chars": 614,
"preview": "\nPod::Spec.new do |s|\n s.name = 'AZExpandable'\n s.version = '1.1.0'\n s.summary = 'AZExp"
},
{
"path": "Example/ExpandableCell/Supporting Files/AppDelegate.swift",
"chars": 442,
"preview": "//\n// AppDelegate.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 18/10/2017.\n// Copyright © 2017 Andrey Zo"
},
{
"path": "Example/ExpandableCell/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 1590,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"iphone\",\n \"size\" : \"20x20\",\n \"scale\" : \"2x\"\n },\n {\n \"idiom\""
},
{
"path": "Example/ExpandableCell/Supporting Files/Base.lproj/LaunchScreen.storyboard",
"chars": 1681,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "Example/ExpandableCell/Supporting Files/Info.plist",
"chars": 1463,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/ExpandableCell/View Controller/BasicDemoViewController.swift",
"chars": 2389,
"preview": "//\n// BasicDemoViewController.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 19/12/2017.\n// Copyright © 20"
},
{
"path": "Example/ExpandableCell/View Controller/CellFactory.swift",
"chars": 1320,
"preview": "//\n// CellFactory.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 08/11/2017.\n// Copyright © 2017 Andrey Zo"
},
{
"path": "Example/ExpandableCell/View Controller/ComplexDemoViewController.swift",
"chars": 4322,
"preview": "//\n// ComplexDemoViewController.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 18/10/2017.\n// Copyright © "
},
{
"path": "Example/ExpandableCell/View Controller/LoadMoreDemoViewController.swift",
"chars": 1772,
"preview": "//\n// LoadMoreDemoViewController.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 11/17/18.\n// Copyright © 2"
},
{
"path": "Example/ExpandableCell/View Controller/PickerItemsController.swift",
"chars": 1283,
"preview": "//\n// PickerItemsController.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 18/12/2017.\n// Copyright © 2017"
},
{
"path": "Example/ExpandableCell/ViewModels/TableViewModel.swift",
"chars": 901,
"preview": "//\n// TableViewModel.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 27/10/2017.\n// Copyright © 2017 Andrey"
},
{
"path": "Example/ExpandableCell/ViewModels/TableViewModelFactory.swift",
"chars": 1658,
"preview": "//\n// TableViewModelFactory.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 08/11/2017.\n// Copyright © 2017"
},
{
"path": "Example/ExpandableCell/Views/Base.lproj/Demo.storyboard",
"chars": 21261,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3"
},
{
"path": "Example/ExpandableCell/Views/CenteredLabelCell.swift",
"chars": 657,
"preview": "//\n// CenteredLabelCell.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 08/11/2017.\n// Copyright © 2017 And"
},
{
"path": "Example/ExpandableCell/Views/CenteredLabelCell.xib",
"chars": 3323,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
},
{
"path": "Example/ExpandableCell.xcodeproj/project.pbxproj",
"chars": 21108,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 48;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "Example/ExpandableCell.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 159,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:ExpandableCell."
},
{
"path": "Example/ExpandableCell.xcworkspace/contents.xcworkspacedata",
"chars": 232,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:ExpandableCell"
},
{
"path": "Example/ExpandableCell.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "Example/Podfile",
"chars": 83,
"preview": "use_frameworks!\n\ntarget 'ExpandableCell' do\n\tpod 'AZExpandable', :path => '../'\nend"
},
{
"path": "Gemfile",
"chars": 148,
"preview": "# frozen_string_literal: true\n\nsource \"https://rubygems.org\"\n\ngit_source(:github) {|repo_name| \"https://github.com/#{rep"
},
{
"path": "LICENSE",
"chars": 1063,
"preview": "MIT License\n\nCopyright (c) 2017 Andrey\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof "
},
{
"path": "README.md",
"chars": 2273,
"preview": "\n\n**AZExpandable** is a li"
},
{
"path": "Source/ExpandableCell-Bridging-Header.h",
"chars": 132,
"preview": "//\n// Use this file to import your target's public headers that you would like to expose to Swift.\n//\n\n#import \"Expanda"
},
{
"path": "Source/ExpandableTable/Cells/ActivityIndicatorCell.swift",
"chars": 1116,
"preview": "//\n// ActivityIndicatorCell.swift\n// AZExpandable\n//\n// Created by Andrey Zonov on 11/17/18.\n//\n\nimport UIKit\n\nclass "
},
{
"path": "Source/ExpandableTable/Cells/DatePickerCell.swift",
"chars": 664,
"preview": "//\n// DatePickerCell.swift\n// AZExpandable\n//\n// Created by Andrey Zonov on 20/10/2017.\n//\n\nimport UIKit\n\nclass DateP"
},
{
"path": "Source/ExpandableTable/Cells/PickerCell.swift",
"chars": 639,
"preview": "//\n// PickerCell.swift\n// Pods-ExpandableCell\n//\n// Created by Andrey Zonov on 27/10/2017.\n//\n\nimport UIKit\n\nclass Pi"
},
{
"path": "Source/ExpandableTable/Cells/UIView+Autolayout.swift",
"chars": 631,
"preview": "//\n// UIView+Autolayout.swift\n// AZExpandable\n//\n// Created by Andrey Zonov on 11/16/18.\n//\n\nimport UIKit\n\nextension "
},
{
"path": "Source/ExpandableTable/ExpandableCellInfo.swift",
"chars": 1479,
"preview": "//\n// ExpandableCellInfo.swift\n// Pods\n//\n// Created by Andrey Zonov on 20/10/2017.\n//\n\nimport UIKit\n\npublic typealia"
},
{
"path": "Source/ExpandableTable/ExpandableTable.swift",
"chars": 3806,
"preview": "//\n// ExpandableTable.swift\n// ExpandableCell\n//\n// Created by Andrey Zonov on 18/10/2017.\n// Copyright © 2017 Andre"
},
{
"path": "Source/ExpandableTable/IndexPath+SyntaxSugar.swift",
"chars": 263,
"preview": "//\n// IndexPath+SyntaxSugar.swift\n// Pods\n//\n// Created by Andrey Zonov on 20/10/2017.\n//\n\nimport Foundation\n\nextensi"
},
{
"path": "Source/ExpandableTable/PagingTable.swift",
"chars": 3914,
"preview": "//\n// PagingTable.swift\n// AZExpandable\n//\n// Created by Andrey Zonov on 18/11/2018.\n//\n\nimport UIKit\n\npublic typeali"
},
{
"path": "Source/Proxy/ExpandableProxy.h",
"chars": 501,
"preview": "//\n// ExpandableProxy.h\n// ExpandableCell\n//\n// Created by Andrey Zonov on 18/10/2017.\n// Copyright © 2017 Andrey Zo"
},
{
"path": "Source/Proxy/ExpandableProxy.m",
"chars": 1407,
"preview": "//\n// ExpandableProxy.m\n// ExpandableCell\n//\n// Created by Andrey Zonov on 18/10/2017.\n// Copyright © 2017 Andrey Zo"
},
{
"path": "_config.yml",
"chars": 29,
"preview": "theme: jekyll-theme-architect"
}
]
About this extraction
This page contains the full source code of the azonov/ExpandableTable GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 36 files (84.2 KB), approximately 23.3k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.