├── .gitignore ├── .travis.yml ├── ContentLoader.podspec ├── ContentLoader ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── CollectionOriginalFormat.swift │ ├── ContentLoader.swift │ ├── ContentLoaderAnimation.swift │ ├── ContentLoaderDataSource.swift │ ├── ContentLoaderFormat.swift │ ├── Extensions │ ├── CALayer+Tools.swift │ ├── String+Tools.swift │ ├── UICollectionView+Loader.swift │ ├── UIColor+Tools.swift │ ├── UIImageView+Loader.swift │ ├── UITableView+Loader.swift │ ├── UIView+Loader.swift │ └── UIView+Tools.swift │ ├── TableOriginalFormat.swift │ └── Utils │ └── AssociationPolicy.swift ├── Example ├── ContentLoader.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── ContentLoader-Example.xcscheme ├── ContentLoader.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── ContentLoader │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard │ ├── CollectionViewCell.swift │ ├── CollectionViewController.swift │ ├── Images.xcassets │ │ ├── 21.imageset │ │ │ ├── 21.jpg │ │ │ └── Contents.json │ │ ├── Alice Arnold.imageset │ │ │ ├── 7.jpg │ │ │ └── Contents.json │ │ ├── Angela Davis.imageset │ │ │ ├── 24.jpg │ │ │ └── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── Icon-20@2x.png │ │ │ ├── Icon-20@3x.png │ │ │ ├── Icon-29@2x.png │ │ │ ├── Icon-29@3x.png │ │ │ ├── Icon-40@2x.png │ │ │ ├── Icon-40@3x.png │ │ │ ├── Icon-60@2x.png │ │ │ ├── Icon-60@3x.png │ │ │ └── iTunesArtwork@2x.png │ │ ├── Billy Allen.imageset │ │ │ ├── 10.jpg │ │ │ └── Contents.json │ │ ├── Bobby Anderson.imageset │ │ │ ├── 8.jpg │ │ │ └── Contents.json │ │ ├── Contents.json │ │ ├── Debra Howard.imageset │ │ │ ├── 12.jpg │ │ │ └── Contents.json │ │ ├── Hannah Lawrence.imageset │ │ │ ├── 16.jpg │ │ │ └── Contents.json │ │ ├── Howard Greene.imageset │ │ │ ├── 17.jpg │ │ │ └── Contents.json │ │ ├── Jacqueline Rose.imageset │ │ │ ├── 2-2.jpg │ │ │ └── Contents.json │ │ ├── Joshua Dunn.imageset │ │ │ ├── 9.jpg │ │ │ └── Contents.json │ │ ├── Kathy Hill.imageset │ │ │ ├── 21.jpg │ │ │ └── Contents.json │ │ ├── Paul Murray.imageset │ │ │ ├── 20.jpg │ │ │ └── Contents.json │ │ ├── User.imageset │ │ │ ├── Contents.json │ │ │ ├── user_placeholder@1x.png │ │ │ ├── user_placeholder@2x.png │ │ │ └── user_placeholder@3x.png │ │ └── Vincent Nichols.imageset │ │ │ ├── 2.jpg │ │ │ └── Contents.json │ ├── Info.plist │ ├── TableViewCell.swift │ ├── TableViewController.swift │ └── ViewController.swift ├── Podfile ├── Podfile.lock ├── Pods │ ├── Local Podspecs │ │ └── ContentLoader.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ │ └── project.pbxproj │ └── Target Support Files │ │ ├── ContentLoader │ │ ├── ContentLoader-Info.plist │ │ ├── ContentLoader-dummy.m │ │ ├── ContentLoader-prefix.pch │ │ ├── ContentLoader-umbrella.h │ │ ├── ContentLoader.modulemap │ │ └── ContentLoader.xcconfig │ │ └── Pods-ContentLoader_Example │ │ ├── Pods-ContentLoader_Example-Info.plist │ │ ├── Pods-ContentLoader_Example-acknowledgements.markdown │ │ ├── Pods-ContentLoader_Example-acknowledgements.plist │ │ ├── Pods-ContentLoader_Example-dummy.m │ │ ├── Pods-ContentLoader_Example-frameworks.sh │ │ ├── Pods-ContentLoader_Example-umbrella.h │ │ ├── Pods-ContentLoader_Example.debug.xcconfig │ │ ├── Pods-ContentLoader_Example.modulemap │ │ └── Pods-ContentLoader_Example.release.xcconfig └── Tests │ ├── Info.plist │ └── Tests.swift ├── Images ├── Apps │ └── fashtime.png ├── Pods │ ├── AnimatedField.png │ ├── CiaoTransitions.png │ ├── ContentLoader.png │ ├── DateScrollPicker.png │ ├── EmptyStateKit.png │ ├── GridTimerView.png │ └── PaintCodeKit.png ├── header_ContentLoader.png ├── screenshot_1.png └── video.gif ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | 39 | _Pods.xcodeproj 40 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * https://www.objc.io/issues/6-build-tools/travis-ci/ 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/ContentLoader.xcworkspace -scheme ContentLoader-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /ContentLoader.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint ContentLoader.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | 11 | # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 12 | 13 | s.platform = :ios 14 | s.ios.deployment_target = '10.0' 15 | s.name = 'ContentLoader' 16 | s.summary = 'Create an animated placeholder loading to your content like Slack, Instagram, or even Facebook.' 17 | s.description = 'Use ContentLoader to display awesome animated placeholder loading to your content. Use your custom views to generate low-contrast blocks, with the same shapes, positions. Make beautiful animations using your own format as Slack, Instagram, or Facebook does.' 18 | s.version = '1.1.1' 19 | 20 | # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 21 | 22 | s.license = { :type => 'MIT', :file => 'LICENSE' } 23 | 24 | # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 25 | 26 | s.author = { 'Alberto Aznar' => 'info@alberdev.com' } 27 | s.homepage = 'https://github.com/alberdev/ContentLoader' 28 | s.social_media_url = 'https://twitter.com/alberdev' 29 | 30 | # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 31 | 32 | s.source = { :git => 'https://github.com/alberdev/ContentLoader.git', :tag => s.version.to_s } 33 | 34 | # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 35 | 36 | s.framework = 'UIKit' 37 | 38 | # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 39 | 40 | s.source_files = 'ContentLoader/**/*' 41 | 42 | # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 43 | 44 | # s.resources = 'ContentLoader/Resources/**/*.{png,jpeg,jpg,storyboard,xib,xcassets}' 45 | 46 | # ――― Swift Version ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # 47 | 48 | s.swift_version = '5.0' 49 | 50 | 51 | end 52 | -------------------------------------------------------------------------------- /ContentLoader/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/ContentLoader/Assets/.gitkeep -------------------------------------------------------------------------------- /ContentLoader/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/ContentLoader/Classes/.gitkeep -------------------------------------------------------------------------------- /ContentLoader/Classes/CollectionOriginalFormat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | public struct CollectionOriginalFormat { 9 | var userInteractionEnabled: Bool? 10 | } 11 | -------------------------------------------------------------------------------- /ContentLoader/Classes/ContentLoader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | public class ContentLoader: NSObject { 9 | 10 | weak var contentLoaderDataSource: ContentLoaderDataSource? 11 | weak var originalTableDataSource: UITableViewDataSource? 12 | weak var originalCollectionDataSource: UICollectionViewDataSource? 13 | 14 | var tableView: UITableView? 15 | var collectionView: UICollectionView? 16 | var format: ContentLoaderFormat? 17 | 18 | convenience init(view: UIView, format: ContentLoaderFormat?) { 19 | if let tableView = view as? UITableView { self.init(tableView, format: format) } 20 | else if let collectionView = view as? UICollectionView { self.init(collectionView, format: format) } 21 | else { self.init() } 22 | } 23 | 24 | convenience init(_ tableView: UITableView, format: ContentLoaderFormat?) { 25 | self.init() 26 | self.tableView = tableView 27 | self.contentLoaderDataSource = tableView.dataSource as? ContentLoaderDataSource 28 | self.originalTableDataSource = tableView.dataSource 29 | self.format = format 30 | } 31 | 32 | convenience init(_ collectionView: UICollectionView, format: ContentLoaderFormat?) { 33 | self.init() 34 | self.collectionView = collectionView 35 | self.contentLoaderDataSource = collectionView.dataSource as? ContentLoaderDataSource 36 | self.originalCollectionDataSource = collectionView.dataSource 37 | self.format = format 38 | } 39 | } 40 | 41 | extension ContentLoader { 42 | 43 | func showLoading() { 44 | // Table option 45 | tableView?.contentLoaderDataSource = self 46 | tableView?.originalFormat = TableOriginalFormat( 47 | separatorStyle: tableView?.separatorStyle, 48 | userInteractionEnabled: tableView?.isUserInteractionEnabled, 49 | showsVerticalScrollIndicator: tableView?.showsVerticalScrollIndicator, 50 | showsHorizontalScrollIndicator: tableView?.showsHorizontalScrollIndicator) 51 | 52 | tableView?.separatorStyle = .none 53 | tableView?.isUserInteractionEnabled = false 54 | tableView?.showsVerticalScrollIndicator = false 55 | tableView?.showsHorizontalScrollIndicator = false 56 | tableView?.reloadData() 57 | 58 | // Collection option 59 | collectionView?.contentLoaderDataSource = self 60 | collectionView?.originalFormat = CollectionOriginalFormat( 61 | userInteractionEnabled: collectionView?.isUserInteractionEnabled) 62 | 63 | collectionView?.isUserInteractionEnabled = false 64 | collectionView?.reloadData() 65 | } 66 | 67 | func hideLoading() { 68 | // Table option 69 | tableView?.hideLoadingCells() 70 | tableView?.contentLoaderDataSource = nil 71 | tableView?.dataSource = originalTableDataSource 72 | tableView?.separatorStyle = tableView?.originalFormat.separatorStyle ?? .none 73 | tableView?.isUserInteractionEnabled = tableView?.originalFormat.userInteractionEnabled ?? true 74 | tableView?.showsVerticalScrollIndicator = tableView?.originalFormat.showsVerticalScrollIndicator ?? true 75 | tableView?.showsHorizontalScrollIndicator = tableView?.originalFormat.showsHorizontalScrollIndicator ?? true 76 | tableView?.reloadData() 77 | 78 | // Collection option 79 | collectionView?.hideLoadingViews() 80 | collectionView?.contentLoaderDataSource = nil 81 | collectionView?.dataSource = originalCollectionDataSource 82 | collectionView?.isUserInteractionEnabled = collectionView?.originalFormat.userInteractionEnabled ?? true 83 | collectionView?.reloadData() 84 | } 85 | } 86 | 87 | // MARK: - UITableViewDataSource 88 | extension ContentLoader: UITableViewDataSource { 89 | 90 | public func numberOfSections(in tableView: UITableView) -> Int { 91 | return contentLoaderDataSource?.numSections(in:tableView) ?? 0 92 | } 93 | 94 | public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 95 | return contentLoaderDataSource?.contentLoaderView(tableView, numberOfItemsInSection:section) ?? 0 96 | } 97 | 98 | public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 99 | let cellIdentifier = contentLoaderDataSource?.contentLoaderView(tableView, cellIdentifierForItemAt: indexPath) ?? "" 100 | let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) 101 | cell.startLoading(format: format) 102 | return cell 103 | } 104 | } 105 | 106 | // MARK: - UICollectionViewDataSource 107 | extension ContentLoader: UICollectionViewDataSource { 108 | 109 | public func numberOfSections(in collectionView: UICollectionView) -> Int { 110 | return contentLoaderDataSource?.numSections(in: collectionView) ?? 0 111 | } 112 | 113 | public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 114 | return contentLoaderDataSource?.contentLoaderView(collectionView, numberOfItemsInSection: section) ?? 0 115 | } 116 | 117 | public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 118 | let cellIdentifier = contentLoaderDataSource?.contentLoaderView(collectionView, cellIdentifierForItemAt: indexPath) ?? "" 119 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) 120 | cell.startLoading(format: format) 121 | return cell 122 | } 123 | 124 | public func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 125 | let headerIdentifier = contentLoaderDataSource?.contentLoaderView(collectionView, headerIdentifierForItemAt: indexPath) ?? "" 126 | let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: headerIdentifier, for: indexPath) 127 | headerView.startLoading(format: format) 128 | return headerView 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /ContentLoader/Classes/ContentLoaderAnimation.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | public typealias ContentLoaderLayerAnimation = (CALayer) -> CAAnimation 9 | 10 | public enum ContentLoaderAnimation { 11 | 12 | case fade 13 | case gradient 14 | 15 | var layer: CALayer? { 16 | switch self { 17 | case .fade: return CALayer() 18 | case .gradient: return CAGradientLayer() 19 | } 20 | } 21 | 22 | var layerAnimation: (CALayer) -> CAAnimation { 23 | switch self { 24 | case .fade: return { $0.pulse } 25 | case .gradient: return { $0.sliding } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ContentLoader/Classes/ContentLoaderDataSource.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | public protocol ContentLoaderDataSource: class { 9 | func numSections(in contentLoaderView: UIView) -> Int 10 | func contentLoaderView(_ contentLoaderView: UIView, numberOfItemsInSection section: Int) -> Int 11 | func contentLoaderView(_ contentLoaderView: UIView, cellIdentifierForItemAt indexPath: IndexPath) -> String 12 | func contentLoaderView(_ contentLoaderView: UIView, headerIdentifierForItemAt indexPath: IndexPath) -> String 13 | } 14 | 15 | public extension ContentLoaderDataSource { 16 | 17 | func numSections(in contentLoaderView: UIView) -> Int { 18 | // Optional 19 | return 1 20 | } 21 | 22 | func contentLoaderView(_ contentLoaderView: UIView, numberOfItemsInSection section: Int) -> Int { 23 | // Optional 24 | if let tableView = contentLoaderView as? UITableView { 25 | return tableView.estimatedNumberOfRows 26 | } 27 | // if let collectionView = contentLoaderView as? UICollectionView { 28 | // return collectionView.estimatedNumberOfRows 29 | // } 30 | return 10 31 | } 32 | 33 | func contentLoaderView(_ contentLoaderView: UIView, headerIdentifierForItemAt indexPath: IndexPath) -> String { 34 | // Optional 35 | return "" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ContentLoader/Classes/ContentLoaderFormat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | public struct ContentLoaderFormat { 9 | 10 | /// Loader color 11 | public var color = "#F6F6F6".hexColor 12 | 13 | /// Corner radius 14 | public var radius: CGFloat = 5 15 | 16 | /// Animation type 17 | public var animation: ContentLoaderAnimation? = .fade 18 | 19 | public init() {} 20 | } 21 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/CALayer+Tools.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // Based on SkeletonView https://github.com/Juanpe/SkeletonView 5 | // 6 | 7 | import Foundation 8 | 9 | public let ContentLoaderAnimationKey = "contentLoaderAnimation" 10 | 11 | public extension CALayer { 12 | 13 | var pulse: CAAnimation { 14 | let pulseAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.backgroundColor)) 15 | pulseAnimation.fromValue = backgroundColor 16 | pulseAnimation.toValue = UIColor(cgColor: backgroundColor!).complementaryColor.cgColor 17 | pulseAnimation.duration = 1 18 | pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) 19 | pulseAnimation.autoreverses = true 20 | pulseAnimation.repeatCount = .infinity 21 | return pulseAnimation 22 | } 23 | 24 | var sliding: CAAnimation { 25 | let startPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.startPoint)) 26 | startPointAnim.fromValue = CGPoint(x: -1, y: 0.5) 27 | startPointAnim.toValue = CGPoint(x:1, y: 0.5) 28 | 29 | let endPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.endPoint)) 30 | endPointAnim.fromValue = CGPoint(x: 0, y: 0.5) 31 | endPointAnim.toValue = CGPoint(x:2, y: 0.5) 32 | 33 | let animGroup = CAAnimationGroup() 34 | animGroup.animations = [startPointAnim, endPointAnim] 35 | animGroup.duration = 1.5 36 | animGroup.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeIn) 37 | animGroup.repeatCount = .infinity 38 | 39 | return animGroup 40 | } 41 | 42 | func playAnimation(_ animation: ContentLoaderAnimation?) { 43 | guard let animation = animation else { return } 44 | add(animation.layerAnimation(self), forKey: ContentLoaderAnimationKey) 45 | } 46 | 47 | func stopAnimation() { 48 | removeAnimation(forKey: ContentLoaderAnimationKey) 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/String+Tools.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | public extension String { 9 | 10 | var hexColor: UIColor { 11 | 12 | let hexString = self.trimmingCharacters(in: .whitespacesAndNewlines) 13 | let scanner = Scanner(string: hexString) 14 | 15 | if hexString.hasPrefix("#") { 16 | scanner.scanLocation = 1 17 | } 18 | 19 | var color: UInt32 = 0 20 | scanner.scanHexInt32(&color) 21 | 22 | let mask = 0x000000FF 23 | let r = Int(color >> 16) & mask 24 | let g = Int(color >> 8) & mask 25 | let b = Int(color) & mask 26 | 27 | let red = CGFloat(r) / 255.0 28 | let green = CGFloat(g) / 255.0 29 | let blue = CGFloat(b) / 255.0 30 | 31 | return UIColor(red: red, green: green, blue: blue, alpha: 1) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/UICollectionView+Loader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | enum CollectionAssociatedKeys { 9 | static var collectionDataSource = "collectionDataSource" 10 | static var collectionDelegate = "collectionDelegate" 11 | static var collectionOriginalFormat = "collectionOriginalFormat" 12 | } 13 | 14 | public extension UICollectionView { 15 | 16 | var estimatedNumberOfRows: Int { 17 | guard let flowlayout = collectionViewLayout as? UICollectionViewFlowLayout else { return 0 } 18 | return Int(ceil(frame.height/flowlayout.itemSize.height)) 19 | } 20 | 21 | var contentLoaderDataSource: ContentLoader? { 22 | get { return ao_get(pkey: &CollectionAssociatedKeys.collectionDataSource) as? ContentLoader } 23 | set { 24 | ao_setOptional(newValue, pkey: &CollectionAssociatedKeys.collectionDataSource) 25 | self.dataSource = newValue 26 | } 27 | } 28 | 29 | // var contentLoaderDelegate: ContentLoaderCollection? { 30 | // get { return ao_get(pkey: &CollectionAssociatedKeys.collectionDelegate) as? ContentLoaderCollection } 31 | // set { 32 | // ao_setOptional(newValue, pkey: &CollectionAssociatedKeys.collectionDelegate) 33 | // self.delegate = newValue 34 | // } 35 | // } 36 | 37 | var originalFormat: CollectionOriginalFormat { 38 | get { return ao_get(pkey: &CollectionAssociatedKeys.collectionOriginalFormat) as! CollectionOriginalFormat } 39 | set { ao_setOptional(newValue, pkey: &CollectionAssociatedKeys.collectionOriginalFormat) } 40 | } 41 | 42 | func hideLoadingViews() { 43 | for cell in self.visibleCells { 44 | cell.hideLoading() 45 | } 46 | for header in self.visibleSupplementaryViews(ofKind: UICollectionView.elementKindSectionHeader) { 47 | header.hideLoading() 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/UIColor+Tools.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | public extension UIColor { 9 | 10 | private func isLight() -> Bool { 11 | guard let components = cgColor.components, 12 | components.count >= 3 else { return false } 13 | let brightness = ((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000 14 | return !(brightness < 0.5) 15 | } 16 | 17 | var complementaryColor: UIColor { 18 | return isLight() ? darker : lighter 19 | } 20 | 21 | var lighter: UIColor { 22 | return adjust(by: 1.35) 23 | } 24 | 25 | var darker: UIColor { 26 | return adjust(by: 0.94) 27 | } 28 | 29 | private func adjust(by percent: CGFloat) -> UIColor { 30 | var h: CGFloat = 0, s: CGFloat = 0, b: CGFloat = 0, a: CGFloat = 0 31 | getHue(&h, saturation: &s, brightness: &b, alpha: &a) 32 | return UIColor(hue: h, saturation: s, brightness: b * percent, alpha: a) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/UIImageView+Loader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | enum ImageViewAssociatedKeys { 9 | static var imageViewOriginalImage = "imageViewOriginalImage" 10 | } 11 | 12 | public extension UIImageView { 13 | 14 | var originalImage: UIImage? { 15 | get { return image != nil ? image : ao_get(pkey: &ImageViewAssociatedKeys.imageViewOriginalImage) as? UIImage } 16 | set { 17 | ao_setOptional(newValue, pkey: &ImageViewAssociatedKeys.imageViewOriginalImage) 18 | image = nil 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/UITableView+Loader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import Foundation 7 | 8 | enum TableAssociatedKeys { 9 | static var tableDataSource = "tableDataSource" 10 | static var tableOriginalFormat = "tableOriginalFormat" 11 | } 12 | 13 | public extension UITableView { 14 | 15 | var estimatedNumberOfRows: Int { 16 | return Int(ceil(frame.height/rowHeight)) 17 | } 18 | 19 | var contentLoaderDataSource: ContentLoader? { 20 | get { return ao_get(pkey: &TableAssociatedKeys.tableDataSource) as? ContentLoader } 21 | set { 22 | ao_setOptional(newValue, pkey: &TableAssociatedKeys.tableDataSource) 23 | self.dataSource = newValue 24 | } 25 | } 26 | 27 | var originalFormat: TableOriginalFormat { 28 | get { return ao_get(pkey: &TableAssociatedKeys.tableOriginalFormat) as! TableOriginalFormat } 29 | set { ao_setOptional(newValue, pkey: &TableAssociatedKeys.tableOriginalFormat) } 30 | } 31 | 32 | func hideLoadingCells() { 33 | for cell in self.visibleCells { 34 | cell.hideLoading() 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/UIView+Loader.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | enum ViewAssociatedKeys { 9 | static var loadable = "loadable" 10 | static var active = "active" 11 | static var loader = "loader" 12 | 13 | // To save values 14 | static var backgroundColor = "backgroundColor" 15 | static var cornerRadius = "cornerRadius" 16 | static var borderColor = "borderColor" 17 | static var clipToBounds = "clipToBounds" 18 | static var textColor = "textColor" 19 | static var image = "image" 20 | } 21 | 22 | public extension UIView { 23 | 24 | func startLoading(format: ContentLoaderFormat? = nil) { 25 | active = true 26 | if self is UITableView || self is UICollectionView { showContentLoader(format: format) } 27 | else { setupLoading(true, format: format) } 28 | } 29 | 30 | func hideLoading() { 31 | active = false 32 | if self is UITableView || self is UICollectionView { hideContentLoader() } 33 | else { setupLoading(false) } 34 | } 35 | 36 | private func setupLoading(_ loading: Bool, format: ContentLoaderFormat? = nil) { 37 | 38 | let loadingFormat = format ?? ContentLoaderFormat() 39 | 40 | if isLoadable { 41 | backgroundColor = loading ? loadingFormat.color : .clear 42 | cornerRadius = cornerRadius == 0 ? loadingFormat.radius : cornerRadius 43 | clipsToBounds = cornerRadius != 0 44 | 45 | if loading { 46 | layer.playAnimation(loadingFormat.animation) 47 | for view in self.getAllSubviews() { view.isHidden = true } 48 | } else { 49 | layer.stopAnimation() 50 | for view in self.getAllSubviews() { view.isHidden = false } 51 | } 52 | } 53 | 54 | // Get all UICollectionView 55 | for view in self.getAllSubviews() as [UICollectionView] { 56 | if view.isLoadable { 57 | if loading { 58 | view.startLoading(format: format) 59 | } else { 60 | view.hideLoading() 61 | } 62 | } 63 | } 64 | 65 | // Get all UIImageView 66 | for view in self.getAllSubviews() as [UIImageView] { 67 | if view.isLoadable { 68 | if loading { 69 | view.clipToBounds_ = view.clipsToBounds 70 | } 71 | view.layer.backgroundColor = loading ? loadingFormat.color.cgColor : nil 72 | view.cornerRadius = view.cornerRadius == 0 ? loadingFormat.radius : view.cornerRadius 73 | view.clipsToBounds = loading ? view.cornerRadius != 0 : view.clipToBounds_ 74 | 75 | if loading { 76 | view.originalImage = view.image 77 | view.layer.playAnimation(loadingFormat.animation) 78 | } 79 | else { 80 | view.image = view.originalImage 81 | view.layer.stopAnimation() 82 | } 83 | } 84 | } 85 | 86 | // Get all UILabel 87 | for view in self.getAllSubviews() as [UILabel] { 88 | if view.isLoadable { 89 | if loading { 90 | view.textColor_ = view.textColor 91 | view.cornerRadius_ = view.cornerRadius 92 | view.clipToBounds_ = view.clipsToBounds 93 | } 94 | view.layer.backgroundColor = loading ? loadingFormat.color.cgColor : nil 95 | view.textColor = loading ? .clear : view.textColor_ 96 | view.cornerRadius = loading ? loadingFormat.radius : view.cornerRadius_ 97 | view.clipsToBounds = loading ? view.cornerRadius != 0 : view.clipToBounds_ 98 | 99 | if loading { view.layer.playAnimation(loadingFormat.animation) } 100 | else { view.layer.stopAnimation() } 101 | } 102 | } 103 | 104 | // Get all UIButton 105 | for view in self.getAllSubviews() as [UIButton] { 106 | if view.isLoadable { 107 | if loading { 108 | view.backgroundColor_ = view.backgroundColor 109 | view.borderColor_ = view.borderColor 110 | view.image_ = view.image(for: .normal) 111 | view.textColor_ = view.titleColor(for: .normal) 112 | } 113 | view.backgroundColor = loading ? loadingFormat.color : view.backgroundColor_ 114 | view.borderColor = loading ? .clear : view.borderColor_ 115 | view.setTitleColor(loading ? .clear : view.textColor_, for: .normal) 116 | view.setImage(loading ? nil : view.image_, for: .normal) 117 | 118 | if loading { view.layer.playAnimation(loadingFormat.animation) } 119 | else { view.layer.stopAnimation() } 120 | } 121 | } 122 | } 123 | 124 | private func showContentLoader(format: ContentLoaderFormat?) { 125 | let contentLoader = ContentLoader(view: self, format: format) 126 | contentLoader.showLoading() 127 | loader = contentLoader 128 | } 129 | 130 | private func hideContentLoader() { 131 | loader?.hideLoading() 132 | loader = nil 133 | } 134 | 135 | } 136 | 137 | public extension UIView { 138 | 139 | @IBInspectable 140 | var isLoadable: Bool { 141 | get { return loadable } 142 | set { loadable = newValue } 143 | } 144 | 145 | var isActive: Bool { 146 | get { return active } 147 | } 148 | 149 | fileprivate var loadable: Bool! { 150 | get { return ao_get(pkey: &ViewAssociatedKeys.loadable) as? Bool ?? false } 151 | set { ao_set(newValue ?? false, pkey: &ViewAssociatedKeys.loadable) } 152 | } 153 | 154 | fileprivate var active: Bool! { 155 | get { return ao_get(pkey: &ViewAssociatedKeys.active) as? Bool ?? false } 156 | set { ao_set(newValue ?? false, pkey: &ViewAssociatedKeys.active) } 157 | } 158 | 159 | fileprivate var loader: ContentLoader? { 160 | get { return ao_get(pkey: &ViewAssociatedKeys.loader) as? ContentLoader } 161 | set { ao_set(newValue ?? false, pkey: &ViewAssociatedKeys.loader) } 162 | } 163 | 164 | fileprivate var backgroundColor_: UIColor? { 165 | get { return ao_get(pkey: &ViewAssociatedKeys.backgroundColor) as? UIColor } 166 | set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.backgroundColor) } 167 | } 168 | 169 | fileprivate var cornerRadius_: CGFloat! { 170 | get { return ao_get(pkey: &ViewAssociatedKeys.cornerRadius) as? CGFloat ?? 0 } 171 | set { ao_setOptional(newValue ?? 0, pkey: &ViewAssociatedKeys.cornerRadius) } 172 | } 173 | 174 | fileprivate var borderColor_: UIColor! { 175 | get { return ao_get(pkey: &ViewAssociatedKeys.borderColor) as? UIColor ?? .clear } 176 | set { ao_setOptional(newValue ?? .clear, pkey: &ViewAssociatedKeys.borderColor) } 177 | } 178 | 179 | fileprivate var clipToBounds_: Bool! { 180 | get { return ao_get(pkey: &ViewAssociatedKeys.clipToBounds) as? Bool ?? false } 181 | set { ao_setOptional(newValue ?? false, pkey: &ViewAssociatedKeys.clipToBounds) } 182 | } 183 | 184 | fileprivate var textColor_: UIColor? { 185 | get { return ao_get(pkey: &ViewAssociatedKeys.textColor) as? UIColor } 186 | set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.textColor) } 187 | } 188 | 189 | fileprivate var image_: UIImage? { 190 | get { return ao_get(pkey: &ViewAssociatedKeys.image) as? UIImage } 191 | set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.image) } 192 | } 193 | } 194 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Extensions/UIView+Tools.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | extension UIView { 9 | 10 | @IBInspectable 11 | var cornerRadius: CGFloat { 12 | get { return layer.cornerRadius } 13 | set { layer.cornerRadius = newValue } 14 | } 15 | 16 | @IBInspectable 17 | var borderColor: UIColor { 18 | get { 19 | if let color = layer.borderColor { return UIColor(cgColor: color) } 20 | else { return UIColor.black } 21 | } 22 | set { layer.borderColor = newValue.cgColor } 23 | } 24 | 25 | @IBInspectable 26 | var borderWidth: CGFloat { 27 | get { return layer.borderWidth } 28 | set { layer.borderWidth = newValue } 29 | } 30 | } 31 | 32 | public extension UIView { 33 | 34 | class func getAllSubviews(from parenView: UIView) -> [T] { 35 | return parenView.subviews.flatMap { subView -> [T] in 36 | var result = getAllSubviews(from: subView) as [T] 37 | if let view = subView as? T { result.append(view) } 38 | return result 39 | } 40 | } 41 | 42 | func getAllSubviews() -> [T] { 43 | return UIView.getAllSubviews(from: self) as [T] 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /ContentLoader/Classes/TableOriginalFormat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | public struct TableOriginalFormat { 9 | var separatorStyle: UITableViewCell.SeparatorStyle? 10 | var userInteractionEnabled: Bool? 11 | var showsVerticalScrollIndicator: Bool? 12 | var showsHorizontalScrollIndicator: Bool? 13 | } 14 | -------------------------------------------------------------------------------- /ContentLoader/Classes/Utils/AssociationPolicy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // Partially copy/pasted from https://github.com/jameslintaylor/AssociatedObjects/blob/master/AssociatedObjects/AssociatedObjects.swift 5 | // 6 | 7 | import Foundation 8 | 9 | 10 | enum AssociationPolicy: UInt { 11 | // raw values map to objc_AssociationPolicy's raw values 12 | case assign = 0 13 | case copy = 771 14 | case copyNonatomic = 3 15 | case retain = 769 16 | case retainNonatomic = 1 17 | 18 | var objc: objc_AssociationPolicy { 19 | return objc_AssociationPolicy(rawValue: rawValue)! 20 | } 21 | } 22 | 23 | protocol AssociatedObjects: class { } 24 | 25 | // transparent wrappers 26 | extension AssociatedObjects { 27 | 28 | /// wrapper around `objc_getAssociatedObject` 29 | func ao_get(pkey: UnsafeRawPointer) -> Any? { 30 | return objc_getAssociatedObject(self, pkey) 31 | } 32 | 33 | /// wrapper around `objc_setAssociatedObject` 34 | func ao_setOptional(_ value: Any?, pkey: UnsafeRawPointer, policy: AssociationPolicy = .retainNonatomic) { 35 | guard let value = value else { return } 36 | objc_setAssociatedObject(self, pkey, value, policy.objc) 37 | } 38 | 39 | /// wrapper around `objc_setAssociatedObject` 40 | func ao_set(_ value: Any, pkey: UnsafeRawPointer, policy: AssociationPolicy = .retainNonatomic) { 41 | objc_setAssociatedObject(self, pkey, value, policy.objc) 42 | } 43 | 44 | /// wrapper around 'objc_removeAssociatedObjects' 45 | func ao_removeAll() { 46 | objc_removeAssociatedObjects(self) 47 | } 48 | } 49 | 50 | extension NSObject: AssociatedObjects { } 51 | -------------------------------------------------------------------------------- /Example/ContentLoader.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 5ACB8F699703EADBF295487F /* Pods_ContentLoader_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78A9B407A589D276DF1A463B /* Pods_ContentLoader_Example.framework */; }; 11 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 12 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 13 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 14 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 15 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 16 | E30A7EDD22841FA10031DF38 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30A7EDC22841FA10031DF38 /* TableViewController.swift */; }; 17 | E30A7EDF22841FB30031DF38 /* CollectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30A7EDE22841FB30031DF38 /* CollectionViewController.swift */; }; 18 | E30A7EE122841FFF0031DF38 /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30A7EE022841FFF0031DF38 /* TableViewCell.swift */; }; 19 | E30A7EE32284982E0031DF38 /* CollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = E30A7EE22284982E0031DF38 /* CollectionViewCell.swift */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | 373A522AC7CBA0B3D00245D3 /* Pods-ContentLoader_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ContentLoader_Example.debug.xcconfig"; path = "Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.debug.xcconfig"; sourceTree = ""; }; 24 | 51977A5DAF2F8EB3F4A3EB0C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 25 | 607FACD01AFB9204008FA782 /* ContentLoader_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ContentLoader_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 27 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 28 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 29 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 30 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 31 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 32 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 33 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 34 | 6C489B5E0E150C216546A01E /* Pods-ContentLoader_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ContentLoader_Example.release.xcconfig"; path = "Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.release.xcconfig"; sourceTree = ""; }; 35 | 78A9B407A589D276DF1A463B /* Pods_ContentLoader_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ContentLoader_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 36 | 895570DD507352DA673AC729 /* Pods-ContentLoader_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ContentLoader_Tests.debug.xcconfig"; path = "Target Support Files/Pods-ContentLoader_Tests/Pods-ContentLoader_Tests.debug.xcconfig"; sourceTree = ""; }; 37 | 906948A8D479D61C8F1456C6 /* ContentLoader.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = ContentLoader.podspec; path = ../ContentLoader.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 38 | AD0F5FDB3B6C6AA9B10FE25B /* Pods_ContentLoader_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ContentLoader_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | BDC22FD64E774ECF5BF01D39 /* Pods-ContentLoader_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-ContentLoader_Tests.release.xcconfig"; path = "Target Support Files/Pods-ContentLoader_Tests/Pods-ContentLoader_Tests.release.xcconfig"; sourceTree = ""; }; 40 | C85DAB97138445621910E506 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 41 | E30A7EDC22841FA10031DF38 /* TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; }; 42 | E30A7EDE22841FB30031DF38 /* CollectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionViewController.swift; sourceTree = ""; }; 43 | E30A7EE022841FFF0031DF38 /* TableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; 44 | E30A7EE22284982E0031DF38 /* CollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionViewCell.swift; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | 5ACB8F699703EADBF295487F /* Pods_ContentLoader_Example.framework in Frameworks */, 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | /* End PBXFrameworksBuildPhase section */ 57 | 58 | /* Begin PBXGroup section */ 59 | 4F6652485BB0DFCD97ADD052 /* Pods */ = { 60 | isa = PBXGroup; 61 | children = ( 62 | 373A522AC7CBA0B3D00245D3 /* Pods-ContentLoader_Example.debug.xcconfig */, 63 | 6C489B5E0E150C216546A01E /* Pods-ContentLoader_Example.release.xcconfig */, 64 | 895570DD507352DA673AC729 /* Pods-ContentLoader_Tests.debug.xcconfig */, 65 | BDC22FD64E774ECF5BF01D39 /* Pods-ContentLoader_Tests.release.xcconfig */, 66 | ); 67 | path = Pods; 68 | sourceTree = ""; 69 | }; 70 | 607FACC71AFB9204008FA782 = { 71 | isa = PBXGroup; 72 | children = ( 73 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 74 | 607FACD21AFB9204008FA782 /* Example for ContentLoader */, 75 | 607FACE81AFB9204008FA782 /* Tests */, 76 | 607FACD11AFB9204008FA782 /* Products */, 77 | 4F6652485BB0DFCD97ADD052 /* Pods */, 78 | A4FFE30A12CCE77D2A3C780B /* Frameworks */, 79 | ); 80 | sourceTree = ""; 81 | }; 82 | 607FACD11AFB9204008FA782 /* Products */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | 607FACD01AFB9204008FA782 /* ContentLoader_Example.app */, 86 | ); 87 | name = Products; 88 | sourceTree = ""; 89 | }; 90 | 607FACD21AFB9204008FA782 /* Example for ContentLoader */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 94 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 95 | E30A7EE4228498380031DF38 /* TableView */, 96 | E30A7EE5228498440031DF38 /* CollectionView */, 97 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 98 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 99 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 100 | 607FACD31AFB9204008FA782 /* Supporting Files */, 101 | ); 102 | name = "Example for ContentLoader"; 103 | path = ContentLoader; 104 | sourceTree = ""; 105 | }; 106 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | 607FACD41AFB9204008FA782 /* Info.plist */, 110 | ); 111 | name = "Supporting Files"; 112 | sourceTree = ""; 113 | }; 114 | 607FACE81AFB9204008FA782 /* Tests */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 118 | 607FACE91AFB9204008FA782 /* Supporting Files */, 119 | ); 120 | path = Tests; 121 | sourceTree = ""; 122 | }; 123 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 124 | isa = PBXGroup; 125 | children = ( 126 | 607FACEA1AFB9204008FA782 /* Info.plist */, 127 | ); 128 | name = "Supporting Files"; 129 | sourceTree = ""; 130 | }; 131 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 132 | isa = PBXGroup; 133 | children = ( 134 | 906948A8D479D61C8F1456C6 /* ContentLoader.podspec */, 135 | 51977A5DAF2F8EB3F4A3EB0C /* README.md */, 136 | C85DAB97138445621910E506 /* LICENSE */, 137 | ); 138 | name = "Podspec Metadata"; 139 | sourceTree = ""; 140 | }; 141 | A4FFE30A12CCE77D2A3C780B /* Frameworks */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 78A9B407A589D276DF1A463B /* Pods_ContentLoader_Example.framework */, 145 | AD0F5FDB3B6C6AA9B10FE25B /* Pods_ContentLoader_Tests.framework */, 146 | ); 147 | name = Frameworks; 148 | sourceTree = ""; 149 | }; 150 | E30A7EE4228498380031DF38 /* TableView */ = { 151 | isa = PBXGroup; 152 | children = ( 153 | E30A7EDC22841FA10031DF38 /* TableViewController.swift */, 154 | E30A7EE022841FFF0031DF38 /* TableViewCell.swift */, 155 | ); 156 | name = TableView; 157 | sourceTree = ""; 158 | }; 159 | E30A7EE5228498440031DF38 /* CollectionView */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | E30A7EDE22841FB30031DF38 /* CollectionViewController.swift */, 163 | E30A7EE22284982E0031DF38 /* CollectionViewCell.swift */, 164 | ); 165 | name = CollectionView; 166 | sourceTree = ""; 167 | }; 168 | /* End PBXGroup section */ 169 | 170 | /* Begin PBXNativeTarget section */ 171 | 607FACCF1AFB9204008FA782 /* ContentLoader_Example */ = { 172 | isa = PBXNativeTarget; 173 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "ContentLoader_Example" */; 174 | buildPhases = ( 175 | 16F7AC3408E1DAE22EFBC772 /* [CP] Check Pods Manifest.lock */, 176 | 607FACCC1AFB9204008FA782 /* Sources */, 177 | 607FACCD1AFB9204008FA782 /* Frameworks */, 178 | 607FACCE1AFB9204008FA782 /* Resources */, 179 | E168E9F2DBA0BD96185867FC /* [CP] Embed Pods Frameworks */, 180 | ); 181 | buildRules = ( 182 | ); 183 | dependencies = ( 184 | ); 185 | name = ContentLoader_Example; 186 | productName = ContentLoader; 187 | productReference = 607FACD01AFB9204008FA782 /* ContentLoader_Example.app */; 188 | productType = "com.apple.product-type.application"; 189 | }; 190 | /* End PBXNativeTarget section */ 191 | 192 | /* Begin PBXProject section */ 193 | 607FACC81AFB9204008FA782 /* Project object */ = { 194 | isa = PBXProject; 195 | attributes = { 196 | LastSwiftUpdateCheck = 0830; 197 | LastUpgradeCheck = 1020; 198 | ORGANIZATIONNAME = CocoaPods; 199 | TargetAttributes = { 200 | 607FACCF1AFB9204008FA782 = { 201 | CreatedOnToolsVersion = 6.3.1; 202 | DevelopmentTeam = BV4J4GZFL4; 203 | LastSwiftMigration = 0900; 204 | }; 205 | }; 206 | }; 207 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "ContentLoader" */; 208 | compatibilityVersion = "Xcode 3.2"; 209 | developmentRegion = English; 210 | hasScannedForEncodings = 0; 211 | knownRegions = ( 212 | English, 213 | en, 214 | Base, 215 | ); 216 | mainGroup = 607FACC71AFB9204008FA782; 217 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 218 | projectDirPath = ""; 219 | projectRoot = ""; 220 | targets = ( 221 | 607FACCF1AFB9204008FA782 /* ContentLoader_Example */, 222 | ); 223 | }; 224 | /* End PBXProject section */ 225 | 226 | /* Begin PBXResourcesBuildPhase section */ 227 | 607FACCE1AFB9204008FA782 /* Resources */ = { 228 | isa = PBXResourcesBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 232 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 233 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 234 | ); 235 | runOnlyForDeploymentPostprocessing = 0; 236 | }; 237 | /* End PBXResourcesBuildPhase section */ 238 | 239 | /* Begin PBXShellScriptBuildPhase section */ 240 | 16F7AC3408E1DAE22EFBC772 /* [CP] Check Pods Manifest.lock */ = { 241 | isa = PBXShellScriptBuildPhase; 242 | buildActionMask = 2147483647; 243 | files = ( 244 | ); 245 | inputFileListPaths = ( 246 | ); 247 | inputPaths = ( 248 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 249 | "${PODS_ROOT}/Manifest.lock", 250 | ); 251 | name = "[CP] Check Pods Manifest.lock"; 252 | outputFileListPaths = ( 253 | ); 254 | outputPaths = ( 255 | "$(DERIVED_FILE_DIR)/Pods-ContentLoader_Example-checkManifestLockResult.txt", 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | shellPath = /bin/sh; 259 | 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"; 260 | showEnvVarsInLog = 0; 261 | }; 262 | E168E9F2DBA0BD96185867FC /* [CP] Embed Pods Frameworks */ = { 263 | isa = PBXShellScriptBuildPhase; 264 | buildActionMask = 2147483647; 265 | files = ( 266 | ); 267 | inputPaths = ( 268 | "${PODS_ROOT}/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-frameworks.sh", 269 | "${BUILT_PRODUCTS_DIR}/ContentLoader/ContentLoader.framework", 270 | ); 271 | name = "[CP] Embed Pods Frameworks"; 272 | outputPaths = ( 273 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ContentLoader.framework", 274 | ); 275 | runOnlyForDeploymentPostprocessing = 0; 276 | shellPath = /bin/sh; 277 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-frameworks.sh\"\n"; 278 | showEnvVarsInLog = 0; 279 | }; 280 | /* End PBXShellScriptBuildPhase section */ 281 | 282 | /* Begin PBXSourcesBuildPhase section */ 283 | 607FACCC1AFB9204008FA782 /* Sources */ = { 284 | isa = PBXSourcesBuildPhase; 285 | buildActionMask = 2147483647; 286 | files = ( 287 | E30A7EE122841FFF0031DF38 /* TableViewCell.swift in Sources */, 288 | E30A7EDF22841FB30031DF38 /* CollectionViewController.swift in Sources */, 289 | E30A7EE32284982E0031DF38 /* CollectionViewCell.swift in Sources */, 290 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 291 | E30A7EDD22841FA10031DF38 /* TableViewController.swift in Sources */, 292 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 293 | ); 294 | runOnlyForDeploymentPostprocessing = 0; 295 | }; 296 | /* End PBXSourcesBuildPhase section */ 297 | 298 | /* Begin PBXVariantGroup section */ 299 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 300 | isa = PBXVariantGroup; 301 | children = ( 302 | 607FACDA1AFB9204008FA782 /* Base */, 303 | ); 304 | name = Main.storyboard; 305 | sourceTree = ""; 306 | }; 307 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 308 | isa = PBXVariantGroup; 309 | children = ( 310 | 607FACDF1AFB9204008FA782 /* Base */, 311 | ); 312 | name = LaunchScreen.xib; 313 | sourceTree = ""; 314 | }; 315 | /* End PBXVariantGroup section */ 316 | 317 | /* Begin XCBuildConfiguration section */ 318 | 607FACED1AFB9204008FA782 /* Debug */ = { 319 | isa = XCBuildConfiguration; 320 | buildSettings = { 321 | ALWAYS_SEARCH_USER_PATHS = NO; 322 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 323 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 324 | CLANG_CXX_LIBRARY = "libc++"; 325 | CLANG_ENABLE_MODULES = YES; 326 | CLANG_ENABLE_OBJC_ARC = YES; 327 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 328 | CLANG_WARN_BOOL_CONVERSION = YES; 329 | CLANG_WARN_COMMA = YES; 330 | CLANG_WARN_CONSTANT_CONVERSION = YES; 331 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 332 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 333 | CLANG_WARN_EMPTY_BODY = YES; 334 | CLANG_WARN_ENUM_CONVERSION = YES; 335 | CLANG_WARN_INFINITE_RECURSION = YES; 336 | CLANG_WARN_INT_CONVERSION = YES; 337 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 338 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 339 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 340 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 341 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 342 | CLANG_WARN_STRICT_PROTOTYPES = YES; 343 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 344 | CLANG_WARN_UNREACHABLE_CODE = YES; 345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 346 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 347 | COPY_PHASE_STRIP = NO; 348 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 349 | ENABLE_STRICT_OBJC_MSGSEND = YES; 350 | ENABLE_TESTABILITY = YES; 351 | GCC_C_LANGUAGE_STANDARD = gnu99; 352 | GCC_DYNAMIC_NO_PIC = NO; 353 | GCC_NO_COMMON_BLOCKS = YES; 354 | GCC_OPTIMIZATION_LEVEL = 0; 355 | GCC_PREPROCESSOR_DEFINITIONS = ( 356 | "DEBUG=1", 357 | "$(inherited)", 358 | ); 359 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 360 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 361 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 362 | GCC_WARN_UNDECLARED_SELECTOR = YES; 363 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 364 | GCC_WARN_UNUSED_FUNCTION = YES; 365 | GCC_WARN_UNUSED_VARIABLE = YES; 366 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 367 | MTL_ENABLE_DEBUG_INFO = YES; 368 | ONLY_ACTIVE_ARCH = YES; 369 | SDKROOT = iphoneos; 370 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 371 | SWIFT_VERSION = 5.0; 372 | }; 373 | name = Debug; 374 | }; 375 | 607FACEE1AFB9204008FA782 /* Release */ = { 376 | isa = XCBuildConfiguration; 377 | buildSettings = { 378 | ALWAYS_SEARCH_USER_PATHS = NO; 379 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 380 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 381 | CLANG_CXX_LIBRARY = "libc++"; 382 | CLANG_ENABLE_MODULES = YES; 383 | CLANG_ENABLE_OBJC_ARC = YES; 384 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 385 | CLANG_WARN_BOOL_CONVERSION = YES; 386 | CLANG_WARN_COMMA = YES; 387 | CLANG_WARN_CONSTANT_CONVERSION = YES; 388 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 389 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 390 | CLANG_WARN_EMPTY_BODY = YES; 391 | CLANG_WARN_ENUM_CONVERSION = YES; 392 | CLANG_WARN_INFINITE_RECURSION = YES; 393 | CLANG_WARN_INT_CONVERSION = YES; 394 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 395 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 396 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 397 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 398 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 399 | CLANG_WARN_STRICT_PROTOTYPES = YES; 400 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 401 | CLANG_WARN_UNREACHABLE_CODE = YES; 402 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 403 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 404 | COPY_PHASE_STRIP = NO; 405 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 406 | ENABLE_NS_ASSERTIONS = NO; 407 | ENABLE_STRICT_OBJC_MSGSEND = YES; 408 | GCC_C_LANGUAGE_STANDARD = gnu99; 409 | GCC_NO_COMMON_BLOCKS = YES; 410 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 411 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 412 | GCC_WARN_UNDECLARED_SELECTOR = YES; 413 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 414 | GCC_WARN_UNUSED_FUNCTION = YES; 415 | GCC_WARN_UNUSED_VARIABLE = YES; 416 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 417 | MTL_ENABLE_DEBUG_INFO = NO; 418 | SDKROOT = iphoneos; 419 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 420 | SWIFT_VERSION = 5.0; 421 | VALIDATE_PRODUCT = YES; 422 | }; 423 | name = Release; 424 | }; 425 | 607FACF01AFB9204008FA782 /* Debug */ = { 426 | isa = XCBuildConfiguration; 427 | baseConfigurationReference = 373A522AC7CBA0B3D00245D3 /* Pods-ContentLoader_Example.debug.xcconfig */; 428 | buildSettings = { 429 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 430 | DEVELOPMENT_TEAM = BV4J4GZFL4; 431 | INFOPLIST_FILE = ContentLoader/Info.plist; 432 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 433 | MODULE_NAME = ExampleApp; 434 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 435 | PRODUCT_NAME = "$(TARGET_NAME)"; 436 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 437 | SWIFT_VERSION = 5.0; 438 | }; 439 | name = Debug; 440 | }; 441 | 607FACF11AFB9204008FA782 /* Release */ = { 442 | isa = XCBuildConfiguration; 443 | baseConfigurationReference = 6C489B5E0E150C216546A01E /* Pods-ContentLoader_Example.release.xcconfig */; 444 | buildSettings = { 445 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 446 | DEVELOPMENT_TEAM = BV4J4GZFL4; 447 | INFOPLIST_FILE = ContentLoader/Info.plist; 448 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 449 | MODULE_NAME = ExampleApp; 450 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 451 | PRODUCT_NAME = "$(TARGET_NAME)"; 452 | SWIFT_SWIFT3_OBJC_INFERENCE = Default; 453 | SWIFT_VERSION = 5.0; 454 | }; 455 | name = Release; 456 | }; 457 | /* End XCBuildConfiguration section */ 458 | 459 | /* Begin XCConfigurationList section */ 460 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "ContentLoader" */ = { 461 | isa = XCConfigurationList; 462 | buildConfigurations = ( 463 | 607FACED1AFB9204008FA782 /* Debug */, 464 | 607FACEE1AFB9204008FA782 /* Release */, 465 | ); 466 | defaultConfigurationIsVisible = 0; 467 | defaultConfigurationName = Release; 468 | }; 469 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "ContentLoader_Example" */ = { 470 | isa = XCConfigurationList; 471 | buildConfigurations = ( 472 | 607FACF01AFB9204008FA782 /* Debug */, 473 | 607FACF11AFB9204008FA782 /* Release */, 474 | ); 475 | defaultConfigurationIsVisible = 0; 476 | defaultConfigurationName = Release; 477 | }; 478 | /* End XCConfigurationList section */ 479 | }; 480 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 481 | } 482 | -------------------------------------------------------------------------------- /Example/ContentLoader.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/ContentLoader.xcodeproj/xcshareddata/xcschemes/ContentLoader-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Example/ContentLoader.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/ContentLoader.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/ContentLoader/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | @UIApplicationMain 9 | class AppDelegate: UIResponder, UIApplicationDelegate { 10 | 11 | var window: UIWindow? 12 | 13 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 14 | return true 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /Example/ContentLoader/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /Example/ContentLoader/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 45 | 54 | 75 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 176 | 185 | 194 | 206 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 307 | 316 | 328 | 340 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | -------------------------------------------------------------------------------- /Example/ContentLoader/CollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | class CollectionViewCell: UICollectionViewCell { 9 | 10 | @IBOutlet weak var userImageView: UIImageView! 11 | @IBOutlet weak var nameLabel: UILabel! 12 | @IBOutlet weak var data1Label: UILabel! 13 | @IBOutlet weak var data2Label: UILabel! 14 | @IBOutlet weak var pointsLabel: UILabel! 15 | 16 | struct ViewModel { 17 | let name: String 18 | let place: String 19 | let phone: String 20 | let points: Int 21 | } 22 | 23 | var viewModel: ViewModel? { 24 | didSet { 25 | guard let viewModel = viewModel else { return } 26 | userImageView.image = UIImage(named: viewModel.name) 27 | nameLabel.text = viewModel.name 28 | data1Label.text = viewModel.place 29 | data2Label.text = "Phone: " + viewModel.phone 30 | pointsLabel.text = "\(viewModel.points)" 31 | } 32 | } 33 | 34 | override func awakeFromNib() { 35 | super.awakeFromNib() 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Example/ContentLoader/CollectionViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | import ContentLoader 8 | 9 | class CollectionViewController: UICollectionViewController { 10 | 11 | struct User { 12 | let name: String 13 | let place: String 14 | let phone: String 15 | let points: Int 16 | } 17 | 18 | private let reuseIdentifier = "CollectionViewCell" 19 | private let itemsPerRow: CGFloat = 2 20 | private var items = [User]() 21 | 22 | override func viewDidLoad() { 23 | super.viewDidLoad() 24 | 25 | var format = ContentLoaderFormat() 26 | format.color = "#F6F6F6".hexColor 27 | format.radius = 5 28 | 29 | collectionView.startLoading(format: format) 30 | DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: { [weak self] in 31 | self?.loadContent() 32 | self?.collectionView.hideLoading() 33 | }) 34 | } 35 | } 36 | 37 | extension CollectionViewController { 38 | 39 | private func loadContent() { 40 | items = [ 41 | User(name: "Vincent Nichols", place: "United States", phone: "(420) 568 1625", points: 234), 42 | User(name: "Billy Allen", place: "United States", phone: "(719) 653 3370", points: 98), 43 | User(name: "Angela Davis", place: "United States", phone: "(577) 853 9234", points: 329), 44 | User(name: "Hannah Lawrence", place: "United States", phone: "(514) 319 6831", points: 478), 45 | User(name: "Debra Howard", place: "United States", phone: "(648) 927 5058", points: 732), 46 | User(name: "Howard Greene", place: "United States", phone: "(258) 662 1454", points: 35), 47 | User(name: "Jacqueline Rose", place: "United States", phone: "(224) 489 1764", points: 372), 48 | User(name: "Joshua Dunn", place: "United States", phone: "(471) 580 4605", points: 57), 49 | User(name: "Alice Arnold", place: "United States", phone: "(493) 702 1107", points: 198), 50 | User(name: "Bobby Anderson", place: "United States", phone: "(627) 412 5565", points: 24), 51 | User(name: "Paul Murray", place: "United States", phone: "(183) 293 8670", points: 57), 52 | User(name: "Kathy Hill", place: "United States", phone: "(914) 478 2336", points: 492) 53 | ] 54 | } 55 | } 56 | 57 | extension CollectionViewController: ContentLoaderDataSource { 58 | 59 | func numSections(in contentLoaderView: UIView) -> Int { 60 | return 1 61 | } 62 | 63 | func contentLoaderView(_ contentLoaderView: UIView, numberOfItemsInSection section: Int) -> Int { 64 | return 10 65 | } 66 | 67 | func contentLoaderView(_ contentLoaderView: UIView, cellIdentifierForItemAt indexPath: IndexPath) -> String { 68 | return reuseIdentifier 69 | } 70 | } 71 | 72 | extension CollectionViewController { 73 | 74 | override func numberOfSections(in collectionView: UICollectionView) -> Int { 75 | return 1 76 | } 77 | 78 | override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 79 | return items.count 80 | } 81 | 82 | override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 83 | let item = items[indexPath.item] 84 | let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CollectionViewCell 85 | cell.viewModel = CollectionViewCell.ViewModel(name: item.name, place: item.place, phone: item.phone, points: item.points) 86 | return cell 87 | } 88 | } 89 | 90 | extension CollectionViewController : UICollectionViewDelegateFlowLayout { 91 | 92 | func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 93 | return CGSize(width: (view.frame.width - 30) / itemsPerRow, height: 180) 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/21.imageset/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/21.imageset/21.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/21.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "21.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Alice Arnold.imageset/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Alice Arnold.imageset/7.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Alice Arnold.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "7.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Angela Davis.imageset/24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Angela Davis.imageset/24.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Angela Davis.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "24.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-29@2x.png", 19 | "scale" : "2x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-29@3x.png", 25 | "scale" : "3x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-40@2x.png", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-40@3x.png", 37 | "scale" : "3x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-60@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-60@3x.png", 49 | "scale" : "3x" 50 | }, 51 | { 52 | "size" : "1024x1024", 53 | "idiom" : "ios-marketing", 54 | "filename" : "iTunesArtwork@2x.png", 55 | "scale" : "1x" 56 | } 57 | ], 58 | "info" : { 59 | "version" : 1, 60 | "author" : "xcode" 61 | } 62 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-20@2x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-20@3x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/AppIcon.appiconset/iTunesArtwork@2x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Billy Allen.imageset/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Billy Allen.imageset/10.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Billy Allen.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "10.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Bobby Anderson.imageset/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Bobby Anderson.imageset/8.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Bobby Anderson.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "8.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Debra Howard.imageset/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Debra Howard.imageset/12.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Debra Howard.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "12.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Hannah Lawrence.imageset/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Hannah Lawrence.imageset/16.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Hannah Lawrence.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "16.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Howard Greene.imageset/17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Howard Greene.imageset/17.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Howard Greene.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "17.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Jacqueline Rose.imageset/2-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Jacqueline Rose.imageset/2-2.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Jacqueline Rose.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "2-2.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Joshua Dunn.imageset/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Joshua Dunn.imageset/9.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Joshua Dunn.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "9.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Kathy Hill.imageset/21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Kathy Hill.imageset/21.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Kathy Hill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "21.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Paul Murray.imageset/20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Paul Murray.imageset/20.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Paul Murray.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "20.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/User.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "user_placeholder@1x.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "user_placeholder@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "user_placeholder@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/User.imageset/user_placeholder@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/User.imageset/user_placeholder@1x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/User.imageset/user_placeholder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/User.imageset/user_placeholder@2x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/User.imageset/user_placeholder@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/User.imageset/user_placeholder@3x.png -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Vincent Nichols.imageset/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Example/ContentLoader/Images.xcassets/Vincent Nichols.imageset/2.jpg -------------------------------------------------------------------------------- /Example/ContentLoader/Images.xcassets/Vincent Nichols.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "2.jpg", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /Example/ContentLoader/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/ContentLoader/TableViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | 8 | class TableViewCell: UITableViewCell { 9 | 10 | @IBOutlet weak var userImageView: UIImageView! 11 | @IBOutlet weak var nameLabel: UILabel! 12 | @IBOutlet weak var data1Label: UILabel! 13 | @IBOutlet weak var data2Label: UILabel! 14 | @IBOutlet weak var pointsLabel: UILabel! 15 | 16 | struct ViewModel { 17 | let name: String 18 | let place: String 19 | let phone: String 20 | let points: Int 21 | } 22 | 23 | var viewModel: ViewModel? { 24 | didSet { 25 | guard let viewModel = viewModel else { return } 26 | userImageView.image = UIImage(named: viewModel.name) 27 | nameLabel.text = viewModel.name 28 | data1Label.text = viewModel.place 29 | data2Label.text = "Phone: " + viewModel.phone 30 | pointsLabel.text = "\(viewModel.points)" 31 | } 32 | } 33 | 34 | override func awakeFromNib() { 35 | super.awakeFromNib() 36 | selectionStyle = .none 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/ContentLoader/TableViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | import ContentLoader 8 | 9 | class TableViewController: UITableViewController { 10 | 11 | struct User { 12 | let name: String 13 | let place: String 14 | let phone: String 15 | let points: Int 16 | } 17 | 18 | private let reuseIdentifier = "TableViewCell" 19 | private var items = [User]() 20 | 21 | override func viewDidLoad() { 22 | super.viewDidLoad() 23 | 24 | var format = ContentLoaderFormat() 25 | format.color = "#F6F6F6".hexColor 26 | format.radius = 5 27 | 28 | tableView.startLoading(format: format) 29 | DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: { [weak self] in 30 | self?.loadContent() 31 | self?.tableView.hideLoading() 32 | }) 33 | } 34 | } 35 | 36 | extension TableViewController { 37 | 38 | private func loadContent() { 39 | items = [ 40 | User(name: "Vincent Nichols", place: "United States", phone: "(420) 568 1625", points: 234), 41 | User(name: "Billy Allen", place: "United States", phone: "(719) 653 3370", points: 98), 42 | User(name: "Angela Davis", place: "United States", phone: "(577) 853 9234", points: 329), 43 | User(name: "Hannah Lawrence", place: "United States", phone: "(514) 319 6831", points: 478), 44 | User(name: "Debra Howard", place: "United States", phone: "(648) 927 5058", points: 732), 45 | User(name: "Howard Greene", place: "United States", phone: "(258) 662 1454", points: 35), 46 | User(name: "Jacqueline Rose", place: "United States", phone: "(224) 489 1764", points: 372), 47 | User(name: "Joshua Dunn", place: "United States", phone: "(471) 580 4605", points: 57), 48 | User(name: "Alice Arnold", place: "United States", phone: "(493) 702 1107", points: 198), 49 | User(name: "Bobby Anderson", place: "United States", phone: "(627) 412 5565", points: 24), 50 | User(name: "Paul Murray", place: "United States", phone: "(183) 293 8670", points: 57), 51 | User(name: "Kathy Hill", place: "United States", phone: "(914) 478 2336", points: 492) 52 | ] 53 | } 54 | } 55 | 56 | extension TableViewController: ContentLoaderDataSource { 57 | 58 | func numSections(in contentLoaderView: UIView) -> Int { 59 | return 1 60 | } 61 | 62 | func contentLoaderView(_ contentLoaderView: UIView, numberOfItemsInSection section: Int) -> Int { 63 | return 10 64 | } 65 | 66 | func contentLoaderView(_ contentLoaderView: UIView, cellIdentifierForItemAt indexPath: IndexPath) -> String { 67 | return reuseIdentifier 68 | } 69 | } 70 | 71 | extension TableViewController { 72 | 73 | override func numberOfSections(in tableView: UITableView) -> Int { 74 | return 1 75 | } 76 | 77 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 78 | return items.count 79 | } 80 | 81 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 82 | let item = items[indexPath.row] 83 | let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! TableViewCell 84 | cell.viewModel = TableViewCell.ViewModel(name: item.name, place: item.place, phone: item.phone, points: item.points) 85 | return cell 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Example/ContentLoader/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentLoader 3 | // Copyright (c) 2019 alberdev. All rights reserved. 4 | // 5 | 6 | import UIKit 7 | import ContentLoader 8 | 9 | class ViewController: UIViewController { 10 | 11 | @IBOutlet weak var imageView: UIImageView! 12 | @IBOutlet weak var titleLabel: UILabel! 13 | @IBOutlet weak var descriptionLabel: UILabel! 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | title = "ContentLoader" 18 | setupNavigation() 19 | reloadData() 20 | } 21 | 22 | @objc func reloadData() { 23 | var format = ContentLoaderFormat() 24 | format.color = "#F6F6F6".hexColor 25 | format.radius = 5 26 | format.animation = .fade 27 | 28 | view.startLoading(format: format) 29 | DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: { [weak self] in 30 | self?.loadContent() 31 | self?.view.hideLoading() 32 | }) 33 | } 34 | } 35 | 36 | extension ViewController { 37 | 38 | private func setupNavigation() { 39 | navigationController?.navigationBar.isTranslucent = false 40 | navigationController?.navigationBar.backgroundColor = .white 41 | navigationController?.navigationBar.tintColor = .darkGray 42 | navigationController?.navigationBar.titleTextAttributes = [ 43 | NSAttributedString.Key.foregroundColor: UIColor.darkGray, 44 | NSAttributedString.Key.font: UIFont(name: "AvenirNext-DemiBold", size: 16)!] 45 | 46 | let button = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) 47 | navigationItem.backBarButtonItem = button 48 | 49 | let rightButton = UIBarButtonItem(title: "Reload", style: .plain, target: self, action: #selector(reloadData)) 50 | navigationItem.rightBarButtonItem = rightButton 51 | } 52 | 53 | private func loadContent() { 54 | imageView.image = UIImage(named: "User") 55 | titleLabel.text = "ContentLoader" 56 | descriptionLabel.text = "Transform your content views in placeholders" 57 | } 58 | } 59 | 60 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'ContentLoader_Example' do 4 | pod 'ContentLoader', :path => '../' 5 | 6 | 7 | end 8 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - ContentLoader (1.1.1) 3 | 4 | DEPENDENCIES: 5 | - ContentLoader (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | ContentLoader: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | ContentLoader: b14db4449065be0fd2b8c77b65ff5e4a0a8c7f86 13 | 14 | PODFILE CHECKSUM: 8db673c64e49f01886800eeaf57b2dec91391acd 15 | 16 | COCOAPODS: 1.8.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/ContentLoader.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ContentLoader", 3 | "platforms": { 4 | "ios": "10.0" 5 | }, 6 | "summary": "Create an animated placeholder loading to your content like Slack, Instagram, or even Facebook.", 7 | "description": "Use ContentLoader to display awesome animated placeholder loading to your content. Use your custom views to generate low-contrast blocks, with the same shapes, positions. Make beautiful animations using your own format as Slack, Instagram, or Facebook does.", 8 | "version": "1.1.1", 9 | "license": { 10 | "type": "MIT", 11 | "file": "LICENSE" 12 | }, 13 | "authors": { 14 | "Alberto Aznar": "info@alberdev.com" 15 | }, 16 | "homepage": "https://github.com/alberdev/ContentLoader", 17 | "social_media_url": "https://twitter.com/alberdev", 18 | "source": { 19 | "git": "https://github.com/alberdev/ContentLoader.git", 20 | "tag": "1.1.1" 21 | }, 22 | "frameworks": "UIKit", 23 | "source_files": "ContentLoader/**/*", 24 | "swift_versions": "5.0", 25 | "swift_version": "5.0" 26 | } 27 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - ContentLoader (1.1.1) 3 | 4 | DEPENDENCIES: 5 | - ContentLoader (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | ContentLoader: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | ContentLoader: b14db4449065be0fd2b8c77b65ff5e4a0a8c7f86 13 | 14 | PODFILE CHECKSUM: 8db673c64e49f01886800eeaf57b2dec91391acd 15 | 16 | COCOAPODS: 1.8.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 03DDF9CE66D3F7B614CFBD24A79149E4 /* Pods-ContentLoader_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 116AA213F3527163CA82C13FD668A36F /* Pods-ContentLoader_Example-dummy.m */; }; 11 | 0D200075CDEE7BAC0ABC2646B8525BF2 /* ContentLoader-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 80F935F214C7E1D4207A07B86240E5D8 /* ContentLoader-dummy.m */; }; 12 | 0EA04AF46E69F052708E9C603AD5715C /* AssociationPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29F16AA2012DD011B7C611153EB5EA9 /* AssociationPolicy.swift */; }; 13 | 148B04B0F787D6C7AA21CB401EFF4496 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; 14 | 1739A68865B64D9B4D7EB1CC07A68005 /* ContentLoader-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EEE387EB1220A9282BA2CE3462BCBA58 /* ContentLoader-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 21C7316365FF6AD4A4EFF48950B22911 /* Pods-ContentLoader_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 96F35EFA7A947B8F5BABF993B14492E3 /* Pods-ContentLoader_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | 2F9774F2E659FDF61923718BFAB281A2 /* UIView+Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E25B17E5183E6E0338B91A45A23D795 /* UIView+Loader.swift */; }; 17 | 365C7379C84326C679A2234ED07F6646 /* UITableView+Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAB5847B89A1F17961816264DA01F7C6 /* UITableView+Loader.swift */; }; 18 | 3D488D2D42F980AE5D0597470FA81C51 /* UICollectionView+Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FABD13F357041D48A600721CEE2158A9 /* UICollectionView+Loader.swift */; }; 19 | 404FCA3DD13EA525839F0BCD684F2FF9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */; }; 20 | 4A849A340F9B4C2165BAC40E663ABD65 /* UIImageView+Loader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F53AD625A4590C8692585060BC21753 /* UIImageView+Loader.swift */; }; 21 | 6445A7E8F2C0DB0201D4A28D411D4787 /* ContentLoaderFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91E14D4855E4C83207DD5AE33DD150CE /* ContentLoaderFormat.swift */; }; 22 | 6FE592B9CE7A8A3AE9A80C13E8ECC979 /* String+Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF3CAA79C72B6776A9A5FB19406F2275 /* String+Tools.swift */; }; 23 | 8618E3F59EBF27C2E825AC8A593A03B9 /* CollectionOriginalFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = A89969ACDFF375A862CEB2DE957FAA88 /* CollectionOriginalFormat.swift */; }; 24 | 8E4932A9AD6E19C25A66FBEBBE4AC180 /* UIView+Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214DD888369722C8FA42C64B8913707B /* UIView+Tools.swift */; }; 25 | 983BF79F187EFBE8EFC7A266560D3900 /* ContentLoaderAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE40D7E9BA694044529938B42B2ECEAB /* ContentLoaderAnimation.swift */; }; 26 | A2D120D5B4ECACC429161FF6CA3EC06E /* UIColor+Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4820146CE8F4177C3E6546AB25F20460 /* UIColor+Tools.swift */; }; 27 | BCF10107A9FB1D6C79F759A779FDBE45 /* ContentLoaderDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06D56CA3FC04705CD5194F4098267977 /* ContentLoaderDataSource.swift */; }; 28 | BD2678D871703A27AE6C1D2736777542 /* TableOriginalFormat.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8C88093E5964F5F5D1B57994B7BB829 /* TableOriginalFormat.swift */; }; 29 | BFCF3E0FBDCFF9824B1518B1B3073243 /* CALayer+Tools.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87540F61D67F874023A46FBB884045FC /* CALayer+Tools.swift */; }; 30 | CFE88DA6C9A1D55ECD913977B104D73E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */; }; 31 | E611D581EB4D9626392B467B97AD29B0 /* ContentLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = FEF2B3B118645A7FF5AEED6D87C89BC1 /* ContentLoader.swift */; }; 32 | /* End PBXBuildFile section */ 33 | 34 | /* Begin PBXContainerItemProxy section */ 35 | EC7D56BAD5D0C7E200A9B0124BDEDA27 /* PBXContainerItemProxy */ = { 36 | isa = PBXContainerItemProxy; 37 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 38 | proxyType = 1; 39 | remoteGlobalIDString = DE2CB2DC4C3164417DFEC8826FD675AE; 40 | remoteInfo = ContentLoader; 41 | }; 42 | /* End PBXContainerItemProxy section */ 43 | 44 | /* Begin PBXFileReference section */ 45 | 06D56CA3FC04705CD5194F4098267977 /* ContentLoaderDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContentLoaderDataSource.swift; path = ContentLoader/Classes/ContentLoaderDataSource.swift; sourceTree = ""; }; 46 | 0F53AD625A4590C8692585060BC21753 /* UIImageView+Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIImageView+Loader.swift"; sourceTree = ""; }; 47 | 116AA213F3527163CA82C13FD668A36F /* Pods-ContentLoader_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-ContentLoader_Example-dummy.m"; sourceTree = ""; }; 48 | 1B5E1F6D51E2917723839F1ED7606894 /* Pods_ContentLoader_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_ContentLoader_Example.framework; path = "Pods-ContentLoader_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 1E25B17E5183E6E0338B91A45A23D795 /* UIView+Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+Loader.swift"; sourceTree = ""; }; 50 | 214DD888369722C8FA42C64B8913707B /* UIView+Tools.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIView+Tools.swift"; sourceTree = ""; }; 51 | 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 52 | 32ACC218921847D2D4C845A409634D98 /* Pods-ContentLoader_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-ContentLoader_Example-acknowledgements.markdown"; sourceTree = ""; }; 53 | 3BEEE466204874DD720C3D54124EF1A4 /* ContentLoader-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ContentLoader-prefix.pch"; sourceTree = ""; }; 54 | 4044C0CC393FE3561508B898A0F2552E /* ContentLoader.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ContentLoader.framework; path = ContentLoader.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 56 | 4820146CE8F4177C3E6546AB25F20460 /* UIColor+Tools.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UIColor+Tools.swift"; sourceTree = ""; }; 57 | 5E3D0379ECBCBFC75F776CFADD038D80 /* Pods-ContentLoader_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ContentLoader_Example.release.xcconfig"; sourceTree = ""; }; 58 | 73E6DED89928C8F809186B28D43C651A /* Pods-ContentLoader_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-ContentLoader_Example.debug.xcconfig"; sourceTree = ""; }; 59 | 80F935F214C7E1D4207A07B86240E5D8 /* ContentLoader-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ContentLoader-dummy.m"; sourceTree = ""; }; 60 | 87540F61D67F874023A46FBB884045FC /* CALayer+Tools.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CALayer+Tools.swift"; sourceTree = ""; }; 61 | 8CBE5EE4AC00ECE639EEFEAB2F98653A /* ContentLoader.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = ContentLoader.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 62 | 91E14D4855E4C83207DD5AE33DD150CE /* ContentLoaderFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContentLoaderFormat.swift; path = ContentLoader/Classes/ContentLoaderFormat.swift; sourceTree = ""; }; 63 | 91F006AA0638C15DD601170CF4EF9DEE /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; 64 | 96F35EFA7A947B8F5BABF993B14492E3 /* Pods-ContentLoader_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-ContentLoader_Example-umbrella.h"; sourceTree = ""; }; 65 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 66 | A1083AD96DCDA001FB9D44083647AC7D /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; 67 | A29F16AA2012DD011B7C611153EB5EA9 /* AssociationPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AssociationPolicy.swift; sourceTree = ""; }; 68 | A89969ACDFF375A862CEB2DE957FAA88 /* CollectionOriginalFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionOriginalFormat.swift; path = ContentLoader/Classes/CollectionOriginalFormat.swift; sourceTree = ""; }; 69 | B8C88093E5964F5F5D1B57994B7BB829 /* TableOriginalFormat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TableOriginalFormat.swift; path = ContentLoader/Classes/TableOriginalFormat.swift; sourceTree = ""; }; 70 | BB8B2FFCE719F68B95AEAD03099435A6 /* Pods-ContentLoader_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ContentLoader_Example-acknowledgements.plist"; sourceTree = ""; }; 71 | BE40D7E9BA694044529938B42B2ECEAB /* ContentLoaderAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContentLoaderAnimation.swift; path = ContentLoader/Classes/ContentLoaderAnimation.swift; sourceTree = ""; }; 72 | C6DC9418DC31C3845D18E1518B36D6E7 /* Pods-ContentLoader_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-ContentLoader_Example-Info.plist"; sourceTree = ""; }; 73 | CAB5847B89A1F17961816264DA01F7C6 /* UITableView+Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UITableView+Loader.swift"; sourceTree = ""; }; 74 | CF3CAA79C72B6776A9A5FB19406F2275 /* String+Tools.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "String+Tools.swift"; sourceTree = ""; }; 75 | DB21798263A7B19C8660A73F3496658C /* Pods-ContentLoader_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-ContentLoader_Example-frameworks.sh"; sourceTree = ""; }; 76 | DB23C7AD3A3F7AED26BB23157E5486C0 /* Pods-ContentLoader_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-ContentLoader_Example.modulemap"; sourceTree = ""; }; 77 | E5DC6B84BD00026361F9F8712D1B31E9 /* ContentLoader-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ContentLoader-Info.plist"; sourceTree = ""; }; 78 | EEE387EB1220A9282BA2CE3462BCBA58 /* ContentLoader-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ContentLoader-umbrella.h"; sourceTree = ""; }; 79 | F75BE18A73DEA16DA453956F4B0FE0FC /* ContentLoader.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ContentLoader.modulemap; sourceTree = ""; }; 80 | F8499E619CACA0ECE4F12BD11DA84F86 /* ContentLoader.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ContentLoader.xcconfig; sourceTree = ""; }; 81 | FABD13F357041D48A600721CEE2158A9 /* UICollectionView+Loader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UICollectionView+Loader.swift"; sourceTree = ""; }; 82 | FEF2B3B118645A7FF5AEED6D87C89BC1 /* ContentLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ContentLoader.swift; path = ContentLoader/Classes/ContentLoader.swift; sourceTree = ""; }; 83 | /* End PBXFileReference section */ 84 | 85 | /* Begin PBXFrameworksBuildPhase section */ 86 | 39E96B0B3CDD95FFF6F3EFF6047AF696 /* Frameworks */ = { 87 | isa = PBXFrameworksBuildPhase; 88 | buildActionMask = 2147483647; 89 | files = ( 90 | 148B04B0F787D6C7AA21CB401EFF4496 /* Foundation.framework in Frameworks */, 91 | ); 92 | runOnlyForDeploymentPostprocessing = 0; 93 | }; 94 | E2508BA96D7993615BA52AC788A498BF /* Frameworks */ = { 95 | isa = PBXFrameworksBuildPhase; 96 | buildActionMask = 2147483647; 97 | files = ( 98 | CFE88DA6C9A1D55ECD913977B104D73E /* Foundation.framework in Frameworks */, 99 | 404FCA3DD13EA525839F0BCD684F2FF9 /* UIKit.framework in Frameworks */, 100 | ); 101 | runOnlyForDeploymentPostprocessing = 0; 102 | }; 103 | /* End PBXFrameworksBuildPhase section */ 104 | 105 | /* Begin PBXGroup section */ 106 | 077DE90646FD0C08202939553D018A97 /* Development Pods */ = { 107 | isa = PBXGroup; 108 | children = ( 109 | D7295407669F2BA47F86910E2AF54C04 /* ContentLoader */, 110 | ); 111 | name = "Development Pods"; 112 | sourceTree = ""; 113 | }; 114 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */ = { 115 | isa = PBXGroup; 116 | children = ( 117 | E2983683FD097A93297E2F5D4E382B36 /* iOS */, 118 | ); 119 | name = Frameworks; 120 | sourceTree = ""; 121 | }; 122 | 47B54367121314394BC5410F50B963C1 /* Pods-ContentLoader_Example */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | DB23C7AD3A3F7AED26BB23157E5486C0 /* Pods-ContentLoader_Example.modulemap */, 126 | 32ACC218921847D2D4C845A409634D98 /* Pods-ContentLoader_Example-acknowledgements.markdown */, 127 | BB8B2FFCE719F68B95AEAD03099435A6 /* Pods-ContentLoader_Example-acknowledgements.plist */, 128 | 116AA213F3527163CA82C13FD668A36F /* Pods-ContentLoader_Example-dummy.m */, 129 | DB21798263A7B19C8660A73F3496658C /* Pods-ContentLoader_Example-frameworks.sh */, 130 | C6DC9418DC31C3845D18E1518B36D6E7 /* Pods-ContentLoader_Example-Info.plist */, 131 | 96F35EFA7A947B8F5BABF993B14492E3 /* Pods-ContentLoader_Example-umbrella.h */, 132 | 73E6DED89928C8F809186B28D43C651A /* Pods-ContentLoader_Example.debug.xcconfig */, 133 | 5E3D0379ECBCBFC75F776CFADD038D80 /* Pods-ContentLoader_Example.release.xcconfig */, 134 | ); 135 | name = "Pods-ContentLoader_Example"; 136 | path = "Target Support Files/Pods-ContentLoader_Example"; 137 | sourceTree = ""; 138 | }; 139 | 6A1C872108BAD11CA67929F9F6C8FB06 /* Products */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 4044C0CC393FE3561508B898A0F2552E /* ContentLoader.framework */, 143 | 1B5E1F6D51E2917723839F1ED7606894 /* Pods_ContentLoader_Example.framework */, 144 | ); 145 | name = Products; 146 | sourceTree = ""; 147 | }; 148 | 750D7AAC95FBD9A61DFC498D19674DCD /* Targets Support Files */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 47B54367121314394BC5410F50B963C1 /* Pods-ContentLoader_Example */, 152 | ); 153 | name = "Targets Support Files"; 154 | sourceTree = ""; 155 | }; 156 | 8DDC7B1E0B52A533979401FB8FBC41D4 /* Utils */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | A29F16AA2012DD011B7C611153EB5EA9 /* AssociationPolicy.swift */, 160 | ); 161 | name = Utils; 162 | path = ContentLoader/Classes/Utils; 163 | sourceTree = ""; 164 | }; 165 | A0C751438156DA68F673DE00147BDFFD /* Pod */ = { 166 | isa = PBXGroup; 167 | children = ( 168 | 8CBE5EE4AC00ECE639EEFEAB2F98653A /* ContentLoader.podspec */, 169 | 91F006AA0638C15DD601170CF4EF9DEE /* LICENSE */, 170 | A1083AD96DCDA001FB9D44083647AC7D /* README.md */, 171 | ); 172 | name = Pod; 173 | sourceTree = ""; 174 | }; 175 | CB14D110BF28EB343CF60B71F6518896 /* Support Files */ = { 176 | isa = PBXGroup; 177 | children = ( 178 | F75BE18A73DEA16DA453956F4B0FE0FC /* ContentLoader.modulemap */, 179 | F8499E619CACA0ECE4F12BD11DA84F86 /* ContentLoader.xcconfig */, 180 | 80F935F214C7E1D4207A07B86240E5D8 /* ContentLoader-dummy.m */, 181 | E5DC6B84BD00026361F9F8712D1B31E9 /* ContentLoader-Info.plist */, 182 | 3BEEE466204874DD720C3D54124EF1A4 /* ContentLoader-prefix.pch */, 183 | EEE387EB1220A9282BA2CE3462BCBA58 /* ContentLoader-umbrella.h */, 184 | ); 185 | name = "Support Files"; 186 | path = "Example/Pods/Target Support Files/ContentLoader"; 187 | sourceTree = ""; 188 | }; 189 | CF1408CF629C7361332E53B88F7BD30C = { 190 | isa = PBXGroup; 191 | children = ( 192 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 193 | 077DE90646FD0C08202939553D018A97 /* Development Pods */, 194 | 1628BF05B4CAFDCC3549A101F5A10A17 /* Frameworks */, 195 | 6A1C872108BAD11CA67929F9F6C8FB06 /* Products */, 196 | 750D7AAC95FBD9A61DFC498D19674DCD /* Targets Support Files */, 197 | ); 198 | sourceTree = ""; 199 | }; 200 | D7295407669F2BA47F86910E2AF54C04 /* ContentLoader */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | A89969ACDFF375A862CEB2DE957FAA88 /* CollectionOriginalFormat.swift */, 204 | FEF2B3B118645A7FF5AEED6D87C89BC1 /* ContentLoader.swift */, 205 | BE40D7E9BA694044529938B42B2ECEAB /* ContentLoaderAnimation.swift */, 206 | 06D56CA3FC04705CD5194F4098267977 /* ContentLoaderDataSource.swift */, 207 | 91E14D4855E4C83207DD5AE33DD150CE /* ContentLoaderFormat.swift */, 208 | B8C88093E5964F5F5D1B57994B7BB829 /* TableOriginalFormat.swift */, 209 | F4261E086DCB540AF374BD13138B0D43 /* Extensions */, 210 | A0C751438156DA68F673DE00147BDFFD /* Pod */, 211 | CB14D110BF28EB343CF60B71F6518896 /* Support Files */, 212 | 8DDC7B1E0B52A533979401FB8FBC41D4 /* Utils */, 213 | ); 214 | name = ContentLoader; 215 | path = ../..; 216 | sourceTree = ""; 217 | }; 218 | E2983683FD097A93297E2F5D4E382B36 /* iOS */ = { 219 | isa = PBXGroup; 220 | children = ( 221 | 436BAA54A31999B53B3CC7115C55FE50 /* Foundation.framework */, 222 | 312B988EF117AE4DE76A268D970131FE /* UIKit.framework */, 223 | ); 224 | name = iOS; 225 | sourceTree = ""; 226 | }; 227 | F4261E086DCB540AF374BD13138B0D43 /* Extensions */ = { 228 | isa = PBXGroup; 229 | children = ( 230 | 87540F61D67F874023A46FBB884045FC /* CALayer+Tools.swift */, 231 | CF3CAA79C72B6776A9A5FB19406F2275 /* String+Tools.swift */, 232 | FABD13F357041D48A600721CEE2158A9 /* UICollectionView+Loader.swift */, 233 | 4820146CE8F4177C3E6546AB25F20460 /* UIColor+Tools.swift */, 234 | 0F53AD625A4590C8692585060BC21753 /* UIImageView+Loader.swift */, 235 | CAB5847B89A1F17961816264DA01F7C6 /* UITableView+Loader.swift */, 236 | 1E25B17E5183E6E0338B91A45A23D795 /* UIView+Loader.swift */, 237 | 214DD888369722C8FA42C64B8913707B /* UIView+Tools.swift */, 238 | ); 239 | name = Extensions; 240 | path = ContentLoader/Classes/Extensions; 241 | sourceTree = ""; 242 | }; 243 | /* End PBXGroup section */ 244 | 245 | /* Begin PBXHeadersBuildPhase section */ 246 | 375A4FCBA32DE2D0737E922E1EFB97FE /* Headers */ = { 247 | isa = PBXHeadersBuildPhase; 248 | buildActionMask = 2147483647; 249 | files = ( 250 | 21C7316365FF6AD4A4EFF48950B22911 /* Pods-ContentLoader_Example-umbrella.h in Headers */, 251 | ); 252 | runOnlyForDeploymentPostprocessing = 0; 253 | }; 254 | 78C233F4D53E759437DB585135D41F77 /* Headers */ = { 255 | isa = PBXHeadersBuildPhase; 256 | buildActionMask = 2147483647; 257 | files = ( 258 | 1739A68865B64D9B4D7EB1CC07A68005 /* ContentLoader-umbrella.h in Headers */, 259 | ); 260 | runOnlyForDeploymentPostprocessing = 0; 261 | }; 262 | /* End PBXHeadersBuildPhase section */ 263 | 264 | /* Begin PBXNativeTarget section */ 265 | 13EC0C7305ADCDC98206AAA63E5BB04A /* Pods-ContentLoader_Example */ = { 266 | isa = PBXNativeTarget; 267 | buildConfigurationList = 29F7EF22A02253FF2B3EE7ECDC542170 /* Build configuration list for PBXNativeTarget "Pods-ContentLoader_Example" */; 268 | buildPhases = ( 269 | 375A4FCBA32DE2D0737E922E1EFB97FE /* Headers */, 270 | 6C4A21E08F3B9BCF313F55041BF0FA7E /* Sources */, 271 | 39E96B0B3CDD95FFF6F3EFF6047AF696 /* Frameworks */, 272 | C6907AFBD4B4664F2B3969EC111F17FA /* Resources */, 273 | ); 274 | buildRules = ( 275 | ); 276 | dependencies = ( 277 | 92606F3647929BEEA09DF41846703E91 /* PBXTargetDependency */, 278 | ); 279 | name = "Pods-ContentLoader_Example"; 280 | productName = "Pods-ContentLoader_Example"; 281 | productReference = 1B5E1F6D51E2917723839F1ED7606894 /* Pods_ContentLoader_Example.framework */; 282 | productType = "com.apple.product-type.framework"; 283 | }; 284 | DE2CB2DC4C3164417DFEC8826FD675AE /* ContentLoader */ = { 285 | isa = PBXNativeTarget; 286 | buildConfigurationList = 29BE0409F6DA36B61323705A49E4752C /* Build configuration list for PBXNativeTarget "ContentLoader" */; 287 | buildPhases = ( 288 | 78C233F4D53E759437DB585135D41F77 /* Headers */, 289 | 6D4BAD0316D49AFED93442032701ADEF /* Sources */, 290 | E2508BA96D7993615BA52AC788A498BF /* Frameworks */, 291 | 61063B81DD3ABB6180BA02A66BC60A59 /* Resources */, 292 | ); 293 | buildRules = ( 294 | ); 295 | dependencies = ( 296 | ); 297 | name = ContentLoader; 298 | productName = ContentLoader; 299 | productReference = 4044C0CC393FE3561508B898A0F2552E /* ContentLoader.framework */; 300 | productType = "com.apple.product-type.framework"; 301 | }; 302 | /* End PBXNativeTarget section */ 303 | 304 | /* Begin PBXProject section */ 305 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 306 | isa = PBXProject; 307 | attributes = { 308 | LastSwiftUpdateCheck = 1100; 309 | LastUpgradeCheck = 1100; 310 | }; 311 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 312 | compatibilityVersion = "Xcode 3.2"; 313 | developmentRegion = en; 314 | hasScannedForEncodings = 0; 315 | knownRegions = ( 316 | en, 317 | ); 318 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 319 | productRefGroup = 6A1C872108BAD11CA67929F9F6C8FB06 /* Products */; 320 | projectDirPath = ""; 321 | projectRoot = ""; 322 | targets = ( 323 | DE2CB2DC4C3164417DFEC8826FD675AE /* ContentLoader */, 324 | 13EC0C7305ADCDC98206AAA63E5BB04A /* Pods-ContentLoader_Example */, 325 | ); 326 | }; 327 | /* End PBXProject section */ 328 | 329 | /* Begin PBXResourcesBuildPhase section */ 330 | 61063B81DD3ABB6180BA02A66BC60A59 /* Resources */ = { 331 | isa = PBXResourcesBuildPhase; 332 | buildActionMask = 2147483647; 333 | files = ( 334 | ); 335 | runOnlyForDeploymentPostprocessing = 0; 336 | }; 337 | C6907AFBD4B4664F2B3969EC111F17FA /* Resources */ = { 338 | isa = PBXResourcesBuildPhase; 339 | buildActionMask = 2147483647; 340 | files = ( 341 | ); 342 | runOnlyForDeploymentPostprocessing = 0; 343 | }; 344 | /* End PBXResourcesBuildPhase section */ 345 | 346 | /* Begin PBXSourcesBuildPhase section */ 347 | 6C4A21E08F3B9BCF313F55041BF0FA7E /* Sources */ = { 348 | isa = PBXSourcesBuildPhase; 349 | buildActionMask = 2147483647; 350 | files = ( 351 | 03DDF9CE66D3F7B614CFBD24A79149E4 /* Pods-ContentLoader_Example-dummy.m in Sources */, 352 | ); 353 | runOnlyForDeploymentPostprocessing = 0; 354 | }; 355 | 6D4BAD0316D49AFED93442032701ADEF /* Sources */ = { 356 | isa = PBXSourcesBuildPhase; 357 | buildActionMask = 2147483647; 358 | files = ( 359 | 0EA04AF46E69F052708E9C603AD5715C /* AssociationPolicy.swift in Sources */, 360 | BFCF3E0FBDCFF9824B1518B1B3073243 /* CALayer+Tools.swift in Sources */, 361 | 8618E3F59EBF27C2E825AC8A593A03B9 /* CollectionOriginalFormat.swift in Sources */, 362 | 0D200075CDEE7BAC0ABC2646B8525BF2 /* ContentLoader-dummy.m in Sources */, 363 | E611D581EB4D9626392B467B97AD29B0 /* ContentLoader.swift in Sources */, 364 | 983BF79F187EFBE8EFC7A266560D3900 /* ContentLoaderAnimation.swift in Sources */, 365 | BCF10107A9FB1D6C79F759A779FDBE45 /* ContentLoaderDataSource.swift in Sources */, 366 | 6445A7E8F2C0DB0201D4A28D411D4787 /* ContentLoaderFormat.swift in Sources */, 367 | 6FE592B9CE7A8A3AE9A80C13E8ECC979 /* String+Tools.swift in Sources */, 368 | BD2678D871703A27AE6C1D2736777542 /* TableOriginalFormat.swift in Sources */, 369 | 3D488D2D42F980AE5D0597470FA81C51 /* UICollectionView+Loader.swift in Sources */, 370 | A2D120D5B4ECACC429161FF6CA3EC06E /* UIColor+Tools.swift in Sources */, 371 | 4A849A340F9B4C2165BAC40E663ABD65 /* UIImageView+Loader.swift in Sources */, 372 | 365C7379C84326C679A2234ED07F6646 /* UITableView+Loader.swift in Sources */, 373 | 2F9774F2E659FDF61923718BFAB281A2 /* UIView+Loader.swift in Sources */, 374 | 8E4932A9AD6E19C25A66FBEBBE4AC180 /* UIView+Tools.swift in Sources */, 375 | ); 376 | runOnlyForDeploymentPostprocessing = 0; 377 | }; 378 | /* End PBXSourcesBuildPhase section */ 379 | 380 | /* Begin PBXTargetDependency section */ 381 | 92606F3647929BEEA09DF41846703E91 /* PBXTargetDependency */ = { 382 | isa = PBXTargetDependency; 383 | name = ContentLoader; 384 | target = DE2CB2DC4C3164417DFEC8826FD675AE /* ContentLoader */; 385 | targetProxy = EC7D56BAD5D0C7E200A9B0124BDEDA27 /* PBXContainerItemProxy */; 386 | }; 387 | /* End PBXTargetDependency section */ 388 | 389 | /* Begin XCBuildConfiguration section */ 390 | 16BFDF1225AE67B8B84AE95984090338 /* Release */ = { 391 | isa = XCBuildConfiguration; 392 | baseConfigurationReference = F8499E619CACA0ECE4F12BD11DA84F86 /* ContentLoader.xcconfig */; 393 | buildSettings = { 394 | CLANG_ENABLE_OBJC_WEAK = NO; 395 | CODE_SIGN_IDENTITY = ""; 396 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 397 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 398 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 399 | CURRENT_PROJECT_VERSION = 1; 400 | DEFINES_MODULE = YES; 401 | DYLIB_COMPATIBILITY_VERSION = 1; 402 | DYLIB_CURRENT_VERSION = 1; 403 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 404 | GCC_PREFIX_HEADER = "Target Support Files/ContentLoader/ContentLoader-prefix.pch"; 405 | INFOPLIST_FILE = "Target Support Files/ContentLoader/ContentLoader-Info.plist"; 406 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 407 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 408 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 409 | MODULEMAP_FILE = "Target Support Files/ContentLoader/ContentLoader.modulemap"; 410 | PRODUCT_MODULE_NAME = ContentLoader; 411 | PRODUCT_NAME = ContentLoader; 412 | SDKROOT = iphoneos; 413 | SKIP_INSTALL = YES; 414 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 415 | SWIFT_VERSION = 5.0; 416 | TARGETED_DEVICE_FAMILY = "1,2"; 417 | VALIDATE_PRODUCT = YES; 418 | VERSIONING_SYSTEM = "apple-generic"; 419 | VERSION_INFO_PREFIX = ""; 420 | }; 421 | name = Release; 422 | }; 423 | 196DFA3E4A09A28224918543529A1885 /* Debug */ = { 424 | isa = XCBuildConfiguration; 425 | buildSettings = { 426 | ALWAYS_SEARCH_USER_PATHS = NO; 427 | CLANG_ANALYZER_NONNULL = YES; 428 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 429 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 430 | CLANG_CXX_LIBRARY = "libc++"; 431 | CLANG_ENABLE_MODULES = YES; 432 | CLANG_ENABLE_OBJC_ARC = YES; 433 | CLANG_ENABLE_OBJC_WEAK = YES; 434 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 435 | CLANG_WARN_BOOL_CONVERSION = YES; 436 | CLANG_WARN_COMMA = YES; 437 | CLANG_WARN_CONSTANT_CONVERSION = YES; 438 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 439 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 440 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 441 | CLANG_WARN_EMPTY_BODY = YES; 442 | CLANG_WARN_ENUM_CONVERSION = YES; 443 | CLANG_WARN_INFINITE_RECURSION = YES; 444 | CLANG_WARN_INT_CONVERSION = YES; 445 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 446 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 447 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 448 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 449 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 450 | CLANG_WARN_STRICT_PROTOTYPES = YES; 451 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 452 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 453 | CLANG_WARN_UNREACHABLE_CODE = YES; 454 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 455 | COPY_PHASE_STRIP = NO; 456 | DEBUG_INFORMATION_FORMAT = dwarf; 457 | ENABLE_STRICT_OBJC_MSGSEND = YES; 458 | ENABLE_TESTABILITY = YES; 459 | GCC_C_LANGUAGE_STANDARD = gnu11; 460 | GCC_DYNAMIC_NO_PIC = NO; 461 | GCC_NO_COMMON_BLOCKS = YES; 462 | GCC_OPTIMIZATION_LEVEL = 0; 463 | GCC_PREPROCESSOR_DEFINITIONS = ( 464 | "POD_CONFIGURATION_DEBUG=1", 465 | "DEBUG=1", 466 | "$(inherited)", 467 | ); 468 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 469 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 470 | GCC_WARN_UNDECLARED_SELECTOR = YES; 471 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 472 | GCC_WARN_UNUSED_FUNCTION = YES; 473 | GCC_WARN_UNUSED_VARIABLE = YES; 474 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 475 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 476 | MTL_FAST_MATH = YES; 477 | ONLY_ACTIVE_ARCH = YES; 478 | PRODUCT_NAME = "$(TARGET_NAME)"; 479 | STRIP_INSTALLED_PRODUCT = NO; 480 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 481 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 482 | SWIFT_VERSION = 5.0; 483 | SYMROOT = "${SRCROOT}/../build"; 484 | }; 485 | name = Debug; 486 | }; 487 | 437FA8054DF91B862938B650ACD2B6E6 /* Release */ = { 488 | isa = XCBuildConfiguration; 489 | baseConfigurationReference = 5E3D0379ECBCBFC75F776CFADD038D80 /* Pods-ContentLoader_Example.release.xcconfig */; 490 | buildSettings = { 491 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 492 | CLANG_ENABLE_OBJC_WEAK = NO; 493 | CODE_SIGN_IDENTITY = ""; 494 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 495 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 496 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 497 | CURRENT_PROJECT_VERSION = 1; 498 | DEFINES_MODULE = YES; 499 | DYLIB_COMPATIBILITY_VERSION = 1; 500 | DYLIB_CURRENT_VERSION = 1; 501 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 502 | INFOPLIST_FILE = "Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-Info.plist"; 503 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 504 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 505 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 506 | MACH_O_TYPE = staticlib; 507 | MODULEMAP_FILE = "Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.modulemap"; 508 | OTHER_LDFLAGS = ""; 509 | OTHER_LIBTOOLFLAGS = ""; 510 | PODS_ROOT = "$(SRCROOT)"; 511 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 512 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 513 | SDKROOT = iphoneos; 514 | SKIP_INSTALL = YES; 515 | TARGETED_DEVICE_FAMILY = "1,2"; 516 | VALIDATE_PRODUCT = YES; 517 | VERSIONING_SYSTEM = "apple-generic"; 518 | VERSION_INFO_PREFIX = ""; 519 | }; 520 | name = Release; 521 | }; 522 | 5FAC916D82983B2A87FF2BBE082946CD /* Debug */ = { 523 | isa = XCBuildConfiguration; 524 | baseConfigurationReference = F8499E619CACA0ECE4F12BD11DA84F86 /* ContentLoader.xcconfig */; 525 | buildSettings = { 526 | CLANG_ENABLE_OBJC_WEAK = NO; 527 | CODE_SIGN_IDENTITY = ""; 528 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 529 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 530 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 531 | CURRENT_PROJECT_VERSION = 1; 532 | DEFINES_MODULE = YES; 533 | DYLIB_COMPATIBILITY_VERSION = 1; 534 | DYLIB_CURRENT_VERSION = 1; 535 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 536 | GCC_PREFIX_HEADER = "Target Support Files/ContentLoader/ContentLoader-prefix.pch"; 537 | INFOPLIST_FILE = "Target Support Files/ContentLoader/ContentLoader-Info.plist"; 538 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 539 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 540 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 541 | MODULEMAP_FILE = "Target Support Files/ContentLoader/ContentLoader.modulemap"; 542 | PRODUCT_MODULE_NAME = ContentLoader; 543 | PRODUCT_NAME = ContentLoader; 544 | SDKROOT = iphoneos; 545 | SKIP_INSTALL = YES; 546 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 547 | SWIFT_VERSION = 5.0; 548 | TARGETED_DEVICE_FAMILY = "1,2"; 549 | VERSIONING_SYSTEM = "apple-generic"; 550 | VERSION_INFO_PREFIX = ""; 551 | }; 552 | name = Debug; 553 | }; 554 | B01D14FDC83DCF9D4BE53066BEA96D05 /* Release */ = { 555 | isa = XCBuildConfiguration; 556 | buildSettings = { 557 | ALWAYS_SEARCH_USER_PATHS = NO; 558 | CLANG_ANALYZER_NONNULL = YES; 559 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 560 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 561 | CLANG_CXX_LIBRARY = "libc++"; 562 | CLANG_ENABLE_MODULES = YES; 563 | CLANG_ENABLE_OBJC_ARC = YES; 564 | CLANG_ENABLE_OBJC_WEAK = YES; 565 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 566 | CLANG_WARN_BOOL_CONVERSION = YES; 567 | CLANG_WARN_COMMA = YES; 568 | CLANG_WARN_CONSTANT_CONVERSION = YES; 569 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 570 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 571 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 572 | CLANG_WARN_EMPTY_BODY = YES; 573 | CLANG_WARN_ENUM_CONVERSION = YES; 574 | CLANG_WARN_INFINITE_RECURSION = YES; 575 | CLANG_WARN_INT_CONVERSION = YES; 576 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 577 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 578 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 579 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 580 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 581 | CLANG_WARN_STRICT_PROTOTYPES = YES; 582 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 583 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 584 | CLANG_WARN_UNREACHABLE_CODE = YES; 585 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 586 | COPY_PHASE_STRIP = NO; 587 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 588 | ENABLE_NS_ASSERTIONS = NO; 589 | ENABLE_STRICT_OBJC_MSGSEND = YES; 590 | GCC_C_LANGUAGE_STANDARD = gnu11; 591 | GCC_NO_COMMON_BLOCKS = YES; 592 | GCC_PREPROCESSOR_DEFINITIONS = ( 593 | "POD_CONFIGURATION_RELEASE=1", 594 | "$(inherited)", 595 | ); 596 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 597 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 598 | GCC_WARN_UNDECLARED_SELECTOR = YES; 599 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 600 | GCC_WARN_UNUSED_FUNCTION = YES; 601 | GCC_WARN_UNUSED_VARIABLE = YES; 602 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 603 | MTL_ENABLE_DEBUG_INFO = NO; 604 | MTL_FAST_MATH = YES; 605 | PRODUCT_NAME = "$(TARGET_NAME)"; 606 | STRIP_INSTALLED_PRODUCT = NO; 607 | SWIFT_COMPILATION_MODE = wholemodule; 608 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 609 | SWIFT_VERSION = 5.0; 610 | SYMROOT = "${SRCROOT}/../build"; 611 | }; 612 | name = Release; 613 | }; 614 | D86B47D29EC8A89C2DFB2A5E4062D600 /* Debug */ = { 615 | isa = XCBuildConfiguration; 616 | baseConfigurationReference = 73E6DED89928C8F809186B28D43C651A /* Pods-ContentLoader_Example.debug.xcconfig */; 617 | buildSettings = { 618 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 619 | CLANG_ENABLE_OBJC_WEAK = NO; 620 | CODE_SIGN_IDENTITY = ""; 621 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 622 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 623 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 624 | CURRENT_PROJECT_VERSION = 1; 625 | DEFINES_MODULE = YES; 626 | DYLIB_COMPATIBILITY_VERSION = 1; 627 | DYLIB_CURRENT_VERSION = 1; 628 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 629 | INFOPLIST_FILE = "Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-Info.plist"; 630 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 631 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 632 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 633 | MACH_O_TYPE = staticlib; 634 | MODULEMAP_FILE = "Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.modulemap"; 635 | OTHER_LDFLAGS = ""; 636 | OTHER_LIBTOOLFLAGS = ""; 637 | PODS_ROOT = "$(SRCROOT)"; 638 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 639 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 640 | SDKROOT = iphoneos; 641 | SKIP_INSTALL = YES; 642 | TARGETED_DEVICE_FAMILY = "1,2"; 643 | VERSIONING_SYSTEM = "apple-generic"; 644 | VERSION_INFO_PREFIX = ""; 645 | }; 646 | name = Debug; 647 | }; 648 | /* End XCBuildConfiguration section */ 649 | 650 | /* Begin XCConfigurationList section */ 651 | 29BE0409F6DA36B61323705A49E4752C /* Build configuration list for PBXNativeTarget "ContentLoader" */ = { 652 | isa = XCConfigurationList; 653 | buildConfigurations = ( 654 | 5FAC916D82983B2A87FF2BBE082946CD /* Debug */, 655 | 16BFDF1225AE67B8B84AE95984090338 /* Release */, 656 | ); 657 | defaultConfigurationIsVisible = 0; 658 | defaultConfigurationName = Release; 659 | }; 660 | 29F7EF22A02253FF2B3EE7ECDC542170 /* Build configuration list for PBXNativeTarget "Pods-ContentLoader_Example" */ = { 661 | isa = XCConfigurationList; 662 | buildConfigurations = ( 663 | D86B47D29EC8A89C2DFB2A5E4062D600 /* Debug */, 664 | 437FA8054DF91B862938B650ACD2B6E6 /* Release */, 665 | ); 666 | defaultConfigurationIsVisible = 0; 667 | defaultConfigurationName = Release; 668 | }; 669 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 670 | isa = XCConfigurationList; 671 | buildConfigurations = ( 672 | 196DFA3E4A09A28224918543529A1885 /* Debug */, 673 | B01D14FDC83DCF9D4BE53066BEA96D05 /* Release */, 674 | ); 675 | defaultConfigurationIsVisible = 0; 676 | defaultConfigurationName = Release; 677 | }; 678 | /* End XCConfigurationList section */ 679 | }; 680 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 681 | } 682 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/ContentLoader/ContentLoader-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.1.1 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/ContentLoader/ContentLoader-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_ContentLoader : NSObject 3 | @end 4 | @implementation PodsDummy_ContentLoader 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/ContentLoader/ContentLoader-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/ContentLoader/ContentLoader-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double ContentLoaderVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char ContentLoaderVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/ContentLoader/ContentLoader.modulemap: -------------------------------------------------------------------------------- 1 | framework module ContentLoader { 2 | umbrella header "ContentLoader-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/ContentLoader/ContentLoader.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ContentLoader 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_LDFLAGS = $(inherited) -framework "UIKit" 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## ContentLoader 5 | 6 | Copyright (c) 2019 alberdev 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2019 alberdev <albertokr@gmail.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | ContentLoader 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_ContentLoader_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_ContentLoader_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/ContentLoader/ContentLoader.framework" 165 | fi 166 | if [[ "$CONFIGURATION" == "Release" ]]; then 167 | install_framework "${BUILT_PRODUCTS_DIR}/ContentLoader/ContentLoader.framework" 168 | fi 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | wait 171 | fi 172 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ContentLoader_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ContentLoader_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ContentLoader" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ContentLoader/ContentLoader.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "ContentLoader" -framework "UIKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_ContentLoader_Example { 2 | umbrella header "Pods-ContentLoader_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-ContentLoader_Example/Pods-ContentLoader_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ContentLoader" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ContentLoader/ContentLoader.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "ContentLoader" -framework "UIKit" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import ContentLoader 3 | 4 | class Tests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | // Put setup code here. This method is called before the invocation of each test method in the class. 9 | } 10 | 11 | override func tearDown() { 12 | // Put teardown code here. This method is called after the invocation of each test method in the class. 13 | super.tearDown() 14 | } 15 | 16 | func testExample() { 17 | // This is an example of a functional test case. 18 | XCTAssert(true, "Pass") 19 | } 20 | 21 | func testPerformanceExample() { 22 | // This is an example of a performance test case. 23 | self.measure() { 24 | // Put the code you want to measure the time of here. 25 | } 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /Images/Apps/fashtime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Apps/fashtime.png -------------------------------------------------------------------------------- /Images/Pods/AnimatedField.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/AnimatedField.png -------------------------------------------------------------------------------- /Images/Pods/CiaoTransitions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/CiaoTransitions.png -------------------------------------------------------------------------------- /Images/Pods/ContentLoader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/ContentLoader.png -------------------------------------------------------------------------------- /Images/Pods/DateScrollPicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/DateScrollPicker.png -------------------------------------------------------------------------------- /Images/Pods/EmptyStateKit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/EmptyStateKit.png -------------------------------------------------------------------------------- /Images/Pods/GridTimerView.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/GridTimerView.png -------------------------------------------------------------------------------- /Images/Pods/PaintCodeKit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/Pods/PaintCodeKit.png -------------------------------------------------------------------------------- /Images/header_ContentLoader.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/header_ContentLoader.png -------------------------------------------------------------------------------- /Images/screenshot_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/screenshot_1.png -------------------------------------------------------------------------------- /Images/video.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alberdev/ContentLoader/c2dd06b8fe90a24c37676bc25cd45ee5d026fca7/Images/video.gif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 alberdev 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 |

3 | ContentLoader  Logo 4 |

5 | 6 |

7 | 8 | Version 9 | 10 | 15 | 16 | License 17 | 18 | 19 | Swift 5.0 20 | 21 | 22 | Platform 23 | 24 | 29 | 30 | Twitter 31 | 32 | 33 |

34 | 35 |
36 | 37 |

38 | Display awesome animated placeholder loading to your content. Use your custom views to generate low-contrast blocks, with the same shapes, positions. Make beautiful animations using your own format as Slack, Instagram, or Facebook does. ContentLoader is written in Swift 5 with iOS customizable and easy to use. 39 |

40 | 41 |
42 | 43 |

44 | ContentLoader 45 |

46 | 47 | # ContentLoader 48 | 49 | - [x] Awesome animations on loading 50 | - [x] Totally customizable 51 | - [x] Use it also in your own tables and collection views 52 | - [x] Easy usage 53 | - [x] Supports iOS, developed in Swift 5 54 | 55 | ## Table of Contents 56 | 57 | - [Description](#description) 58 | - [Example](#example) 59 | - [Installation](#installation) 60 | - [Usage](#usage) 61 | - [ContentLoader in your View](#contentloaderinyourview) 62 | - [Using Table or Collection views?](#usingtableorcollectionviews) 63 | - [Format](#format) 64 | - [Start and Stop Loading](#startandstoploading) 65 | - [Animation Types](#animationtypes) 66 | - [Fade](#fade) 67 | - [Gradient](#gradient) 68 | - [Apps using ContentLoader](#apps-using-contentloader) 69 | - [Author](#author) 70 | - [Contributing](#contributing) 71 | - [License](#license) 72 | 73 | 74 | ## Installation 75 | 76 | ContentLoader is available through [CocoaPods](https://cocoapods.org). To install 77 | it, simply add the following line to your Podfile and run `pod install`: 78 | 79 | ```ruby 80 | pod 'ContentLoader' 81 | ``` 82 | 83 | Then you can import it when you need 84 | 85 | ```swift 86 | import ContentLoader 87 | ``` 88 | 89 | ## Usage 90 | 91 | In the example you will see some custom content loaders that can be used in your project. Once you've installed the pod, follow next steps. It's really simple: 92 | 93 | ### ContentLoader in your View 94 | 95 | Select one of your custom view controllers. Choose the views inside this viewcontroller where would like to make `Loadable` and set `isLoadable` view property to `true`. Those views will convert to loadable objects when ContentLoader is loading. If you are using xibs / storyboards, you can see new editable `Is Loadable` property. 96 | 97 | 98 | Screenshot 1 99 | 100 | ### Using Table or Collection views? 101 | 102 | If you are using Table or Collection views, you can make the same with your cells. Make `Loadable` the views you want. Then, you must implement `ContentLoaderDataSource` to complete some data ContentLoader needs to draw loader objects. It's really simple: 103 | 104 | ```swift 105 | extension TableViewController: ContentLoaderDataSource { 106 | 107 | /// Number of sections you would like to show in loader 108 | func numSections(in contentLoaderView: UIView) -> Int { 109 | return 1 110 | } 111 | 112 | /// Number of rows you would like to show in loader 113 | func contentLoaderView(_ contentLoaderView: UIView, numberOfItemsInSection section: Int) -> Int { 114 | return 10 115 | } 116 | 117 | /// Cell reuse identifier you would like to use (ContenLoader will search loadable objects here!) 118 | func contentLoaderView(_ contentLoaderView: UIView, cellIdentifierForItemAt indexPath: IndexPath) -> String { 119 | return "MyCellReuseIdentifier" 120 | } 121 | } 122 | ``` 123 | 124 | 125 | ### Format 126 | 127 | You can format `ContentLoader` with your own parameters. See default values: 128 | 129 | ```swift 130 | var format = ContentLoaderFormat() 131 | 132 | /// Loader objects color 133 | format.color = UIColor.lightGray 134 | 135 | /// Loader objects corner radius 136 | format.radius = 5 137 | 138 | /// Loader animation type 139 | format.animation = .fade 140 | ``` 141 | 142 | 143 | ### Start and Stop Loading 144 | 145 | Simple ;) 146 | 147 | ```swift 148 | view.startLoading() 149 | // or 150 | view.startLoading(format: format) 151 | ``` 152 | 153 | ```swift 154 | view.hideLoading() 155 | ``` 156 | 157 | In case of table or collection views 158 | 159 | ```swift 160 | tableView.startLoading() 161 | // or 162 | tableView.startLoading(format: format) 163 | ``` 164 | 165 | ```swift 166 | tableView.hideLoading() 167 | ``` 168 | 169 | 170 | ## Animation Types 171 | 172 | ### Fade 173 | 174 | This type will make fade animation when content is loading 175 | 176 | ```swift 177 | ContentLoaderAnimation.fade 178 | ``` 179 | 180 | ### Gradient 181 | 182 | This type will make gradient animation when content is loading (coming soon) 183 | 184 | ```swift 185 | ContentLoaderAnimation.gradient(UIColor, UIColor) 186 | ``` 187 | 188 | >(Start color, End color) 189 | 190 | 191 | ## Apps using ContentLoader 192 | 193 | If you use `ContentLoader` I'd love to hear about it and feature your app here! 194 | 195 | [FashTime](https://itunes.apple.com/app/fashtime-the-new-way/id1126538070?mt=8) 196 | 197 | ## Author 198 | 199 | Alberto Aznar, info@alberdev.com 200 | Based on [Skeleton View](https://github.com/Juanpe/SkeletonView) by Juanpe Catalán. 201 | 202 | ## Contributing 203 | 204 | Feel free to collaborate with ideas 💭, issues ⁉️ and/or pull requests 🔃. 205 | 206 | 1. Fork it! 207 | 2. Create your feature branch: `git checkout -b my-new-feature` 208 | 3. Commit your changes: `git commit -am 'Add some feature'` 209 | 4. Push to the branch: `git push origin my-new-feature` 210 | 5. Submit a pull request :D 211 | 212 | ## License 213 | 214 | ContentLoader is available under the MIT license. See the LICENSE file for more info. 215 | 216 | ## Libraries by @alberdev 217 | 218 | AnimatedField  Logo 219 | ContentLoader  Logo 220 | CiaoTransitions  Logo 221 | DateScrollPicker  Logo 222 | EmptyStateKit  Logo 223 | GridTimerView  Logo 224 | PaintCodeKit  Logo 225 | --------------------------------------------------------------------------------