Compare commits

..

No commits in common. "master" and "0.6.0" have entirely different histories.

11 changed files with 159 additions and 173 deletions

10
Classes/RMRPullToRefresh.swift Normal file → Executable file
View File

@ -10,7 +10,7 @@ import UIKit
open class RMRPullToRefresh: NSObject { open class RMRPullToRefresh: NSObject {
private var сontroller: RMRPullToRefreshController? fileprivate var сontroller: RMRPullToRefreshController?
open var height : CGFloat = RMRPullToRefreshConstants.DefaultHeight { open var height : CGFloat = RMRPullToRefreshConstants.DefaultHeight {
didSet { didSet {
@ -46,6 +46,14 @@ open class RMRPullToRefresh: NSObject {
self.сontroller = controller self.сontroller = controller
} }
/// Метод нужно вызывать в deinit экрана, в котором используется pull-to-refresh.
///
/// Это временное решение для избежания краша из-за KVO-наблюдателей на scroll view
/// (при уничтожении скролла и экрана, в котором он лежит).
open func unsubscribeFromBindings() {
сontroller?.unsubscribeFromScrollViewEvents()
}
open func configureView(_ view :RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) { open func configureView(_ view :RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
сontroller?.configureView(view, state: state, result: result) сontroller?.configureView(view, state: state, result: result)
} }

View File

@ -27,6 +27,14 @@ public enum RMRPullToRefreshResultType: Int {
public struct RMRPullToRefreshConstants { public struct RMRPullToRefreshConstants {
struct KeyPaths {
static let ContentOffset = "contentOffset"
static let ContentSize = "contentSize"
static let ContentInset = "contentInset"
static let PanState = "pan.state"
static let Frame = "frame"
}
static let DefaultHeight = CGFloat(90.0) static let DefaultHeight = CGFloat(90.0)
static let DefaultBackgroundColor = UIColor.white static let DefaultBackgroundColor = UIColor.white
} }

121
Classes/RMRPullToRefreshController.swift Normal file → Executable file
View File

@ -7,6 +7,26 @@
// //
import UIKit import UIKit
fileprivate func < <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l < r
case (nil, _?):
return true
default:
return false
}
}
fileprivate func > <T : Comparable>(lhs: T?, rhs: T?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return l > r
default:
return rhs < lhs
}
}
open class RMRPullToRefreshController { open class RMRPullToRefreshController {
@ -21,6 +41,7 @@ open class RMRPullToRefreshController {
var backgroundViewTopConstraint: NSLayoutConstraint? var backgroundViewTopConstraint: NSLayoutConstraint?
var stopped = true var stopped = true
var subscribing = false
var actionHandler: (() -> Void)! var actionHandler: (() -> Void)!
@ -39,12 +60,6 @@ open class RMRPullToRefreshController {
open var hideWhenError: Bool = true open var hideWhenError: Bool = true
// MARK: - Observation
private var contentOffsetObservation: NSKeyValueObservation?
private var contentSizeObservation: NSKeyValueObservation?
private var panStateObservation: NSKeyValueObservation?
// MARK: - Init // MARK: - Init
init(scrollView: UIScrollView, position:RMRPullToRefreshPosition, actionHandler: @escaping () -> Void) { init(scrollView: UIScrollView, position:RMRPullToRefreshPosition, actionHandler: @escaping () -> Void) {
@ -61,36 +76,30 @@ open class RMRPullToRefreshController {
self.subscribeOnScrollViewEvents() self.subscribeOnScrollViewEvents()
} }
private func configureBackgroundView(_ backgroundView: UIView) { fileprivate func configureBackgroundView(_ backgroundView: UIView) {
backgroundView.translatesAutoresizingMaskIntoConstraints = false backgroundView.translatesAutoresizingMaskIntoConstraints = false
scrollView?.addSubview(backgroundView) scrollView?.addSubview(backgroundView)
addBackgroundViewConstraints(backgroundView) addBackgroundViewConstraints(backgroundView)
} }
private func addBackgroundViewConstraints(_ backgroundView: UIView) { fileprivate func addBackgroundViewConstraints(_ backgroundView: UIView) {
guard let scrollView = scrollView, let position = position else { // Constraints
return self.backgroundViewHeightConstraint = NSLayoutConstraint(item: backgroundView, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: 0)
} backgroundView.addConstraint(self.backgroundViewHeightConstraint!)
let backgroundViewHeightConstraint = backgroundView.heightAnchor.constraint(equalToConstant: 0)
backgroundViewHeightConstraint.isActive = true
self.backgroundViewHeightConstraint = backgroundViewHeightConstraint
backgroundView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true scrollView?.addConstraint(NSLayoutConstraint(item: backgroundView, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: scrollView, attribute: NSLayoutConstraint.Attribute.width, multiplier: 1, constant: 0))
switch position { if position == .top {
case .top: scrollView?.addConstraint(NSLayoutConstraint(item: backgroundView, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: scrollView, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0))
backgroundView.bottomAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true } else if position == .bottom, let scrollView = self.scrollView {
case .bottom:
let constant = max(scrollView.contentSize.height, scrollView.bounds.height) let constant = max(scrollView.contentSize.height, scrollView.bounds.height)
let backgroundViewTopConstraint = backgroundView.topAnchor.constraint( self.backgroundViewTopConstraint = NSLayoutConstraint(item: backgroundView, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: scrollView, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: constant)
equalTo: scrollView.bottomAnchor, constant: constant) scrollView.addConstraint(self.backgroundViewTopConstraint!)
backgroundViewTopConstraint.isActive = true
self.backgroundViewTopConstraint = backgroundViewTopConstraint
} }
} }
private func configureHeight() { fileprivate func configureHeight() {
if let scrollView = self.scrollView { if let scrollView = self.scrollView {
self.originalTopInset = scrollView.contentInset.top self.originalTopInset = scrollView.contentInset.top
self.originalBottomInset = scrollView.contentInset.bottom self.originalBottomInset = scrollView.contentInset.bottom
@ -218,23 +227,23 @@ open class RMRPullToRefreshController {
containerView.startLoadingAnimation(startProgress) containerView.startLoadingAnimation(startProgress)
} }
@objc private func stopAllAnimations() { @objc fileprivate func stopAllAnimations() {
if shouldHideWhenStopLoading() { if shouldHideWhenStopLoading() {
stopped = true stopped = true
} }
containerView.stopAllAnimations(shouldHideWhenStopLoading()) containerView.stopAllAnimations(shouldHideWhenStopLoading())
} }
@objc private func forceStopAllAnimations() { @objc fileprivate func forceStopAllAnimations() {
stopped = true stopped = true
containerView.stopAllAnimations(true) containerView.stopAllAnimations(true)
} }
@objc private func resetBackgroundViewHeightConstraint() { @objc fileprivate func resetBackgroundViewHeightConstraint() {
backgroundViewHeightConstraint?.constant = 0 backgroundViewHeightConstraint?.constant = 0
} }
private func scrollViewDidChangePanState(_ scrollView: UIScrollView, panState: UIGestureRecognizer.State) { fileprivate func scrollViewDidChangePanState(_ scrollView: UIScrollView, panState: UIGestureRecognizer.State) {
if panState == .ended || panState == .cancelled || panState == .failed { if panState == .ended || panState == .cancelled || panState == .failed {
if state == .loading || (shouldHideWhenStopLoading() && !stopped) { if state == .loading || (shouldHideWhenStopLoading() && !stopped) {
@ -265,7 +274,7 @@ open class RMRPullToRefreshController {
} }
} }
private func scrollViewDidChangeContentSize(_ scrollView: UIScrollView, contentSize: CGSize) { fileprivate func scrollViewDidChangeContentSize(_ scrollView: UIScrollView, contentSize: CGSize) {
updateContainerFrame() updateContainerFrame()
if position == .bottom { if position == .bottom {
self.backgroundViewTopConstraint?.constant = max(scrollView.contentSize.height, scrollView.bounds.height) self.backgroundViewTopConstraint?.constant = max(scrollView.contentSize.height, scrollView.bounds.height)
@ -275,7 +284,7 @@ open class RMRPullToRefreshController {
} }
} }
private func scrollViewDidScroll(_ scrollView: UIScrollView, contentOffset: CGPoint) { fileprivate func scrollViewDidScroll(_ scrollView: UIScrollView, contentOffset: CGPoint) {
if state == .loading { if state == .loading {
if scrollView.contentOffset.y >= 0 { if scrollView.contentOffset.y >= 0 {
@ -307,17 +316,15 @@ open class RMRPullToRefreshController {
} }
} }
private func configureBackgroundHeightConstraint(_ contentOffsetY: CGFloat, contentInset: UIEdgeInsets) { fileprivate func configureBackgroundHeightConstraint(_ contentOffsetY: CGFloat, contentInset: UIEdgeInsets) {
var constant = CGFloat(-1.0) var constant = CGFloat(-1.0)
if position == .top { if position == .top {
constant = contentOffsetY + contentInset.top constant = contentOffsetY + contentInset.top
} else { } else {
constant = contentOffsetY + contentInset.bottom constant = contentOffsetY + contentInset.bottom
} }
if let backgroundViewHeightConstraint = backgroundViewHeightConstraint, if constant > 0 && constant > backgroundViewHeightConstraint?.constant {
constant > 0, backgroundViewHeightConstraint?.constant = constant
constant > backgroundViewHeightConstraint.constant {
backgroundViewHeightConstraint.constant = constant
} }
} }
@ -386,36 +393,34 @@ open class RMRPullToRefreshController {
} }
// MARK: - KVO // MARK: - KVO
var contentOffsetObservation: NSKeyValueObservation?
var contentSizeObservation: NSKeyValueObservation?
open func subscribeOnScrollViewEvents() { open func subscribeOnScrollViewEvents() {
guard let scrollView = scrollView else { guard let scrollView = self.scrollView else { return }
return
contentOffsetObservation = scrollView.observe(\.contentOffset, options: .new) { [weak self] scrollView, changes in
guard let newContentOffset = changes.newValue else { return }
self?.scrollViewDidScroll(scrollView, contentOffset: newContentOffset)
} }
self.contentOffsetObservation = scrollView.observe( contentSizeObservation = scrollView.observe(\.contentSize, options: .new) { [weak self] scrollView, changes in
\.contentOffset, guard let newContentSize = changes.newValue else { return }
options: [.new]) { [weak self] (scrollView, change) in self?.scrollViewDidChangeContentSize(scrollView, contentSize: newContentSize)
guard let newContentOffset = change.newValue else { return }
self?.scrollViewDidScroll(scrollView, contentOffset: newContentOffset)
} }
self.contentSizeObservation = scrollView.observe( self.scrollView?.panGestureRecognizer.addTarget(self, action: #selector(onPanGesture))
\.contentSize, }
options: [.new]) { [weak self] (scrollView, change) in
guard let newContentSize = change.newValue else { return } @objc func onPanGesture(gesture: UIPanGestureRecognizer) {
self?.scrollViewDidChangeContentSize(scrollView, contentSize: newContentSize) guard let scrollView = self.scrollView else { return }
} scrollViewDidChangePanState(scrollView, panState: gesture.state)
self.panStateObservation = scrollView.panGestureRecognizer.observe(
\.state,
options: [.new]) { [weak self] panGestureRecognizer, _ in
self?.scrollViewDidChangePanState(scrollView, panState: panGestureRecognizer.state)
}
} }
open func unsubscribeFromScrollViewEvents() { open func unsubscribeFromScrollViewEvents() {
contentOffsetObservation?.invalidate() contentOffsetObservation = nil
contentSizeObservation?.invalidate() contentSizeObservation = nil
panStateObservation?.invalidate()
} }
} }

View File

@ -1,11 +1,8 @@
source 'https://github.com/CocoaPods/Specs.git' source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks! use_frameworks!
project 'RMRPullToRefreshExample.xcodeproj' target 'RMRPullToRefreshExample' do
workspace 'RMRPullToRefreshExample.xcworkspace' project 'RMRPullToRefreshExample.xcodeproj'
pod 'RMRPullToRefresh, :path => "../"
target :RMRPullToRefreshExample do
pod 'RMRPullToRefresh', :path => "../"
end end

View File

@ -1,16 +0,0 @@
PODS:
- RMRPullToRefresh (0.5.0)
DEPENDENCIES:
- RMRPullToRefresh (from `../`)
EXTERNAL SOURCES:
RMRPullToRefresh:
:path: ../
SPEC CHECKSUMS:
RMRPullToRefresh: 6c25f48af80d0e5d72b89ef5d6ea0dfcc21e5444
PODFILE CHECKSUM: 6bf08c33e827c034420f4dcfc61024a8ba7eab2f
COCOAPODS: 1.3.1

View File

@ -1,15 +1,5 @@
{ {
"images" : [ "images" : [
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "2x"
},
{
"idiom" : "iphone",
"size" : "20x20",
"scale" : "3x"
},
{ {
"idiom" : "iphone", "idiom" : "iphone",
"size" : "29x29", "size" : "29x29",
@ -39,11 +29,6 @@
"idiom" : "iphone", "idiom" : "iphone",
"size" : "60x60", "size" : "60x60",
"scale" : "3x" "scale" : "3x"
},
{
"idiom" : "ios-marketing",
"size" : "1024x1024",
"scale" : "1x"
} }
], ],
"info" : { "info" : {

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="9wl-A7-LQ4"> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="9wl-A7-LQ4">
<device id="retina4_7" orientation="portrait"> <device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/> <adaptation id="fullscreen"/>
</device> </device>
<dependencies> <dependencies>
<deployment identifier="iOS"/> <deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14283.14"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<scenes> <scenes>
@ -24,7 +24,7 @@
</navigationController> </navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="jEm-VL-aI5" userLabel="First Responder" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="jEm-VL-aI5" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="-503" y="323"/> <point key="canvasLocation" x="-654" y="323"/>
</scene> </scene>
<!--Table View Controller--> <!--Table View Controller-->
<scene sceneID="xmD-iM-370"> <scene sceneID="xmD-iM-370">
@ -315,7 +315,7 @@
</viewController> </viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects> </objects>
<point key="canvasLocation" x="1111" y="323"/> <point key="canvasLocation" x="1011" y="324"/>
</scene> </scene>
</scenes> </scenes>
<resources> <resources>

View File

@ -8,8 +8,9 @@
import UIKit import UIKit
final class TableViewController: UITableViewController { class TableViewController: UITableViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
super.prepare(for: segue, sender: sender) super.prepare(for: segue, sender: sender)

View File

@ -18,48 +18,20 @@ public enum ExampleType: Int {
case redmadrobotBottom case redmadrobotBottom
} }
final class ViewController: UIViewController { class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIActionSheetDelegate {
// MARK: - Public properties @IBOutlet weak var tableView: UITableView!
var exampleType: ExampleType = .beelineBottom var exampleType: ExampleType = .beelineBottom
// MARK: - Private properites var pullToRefresh: RMRPullToRefresh?
private var pullToRefresh: RMRPullToRefresh? let formatter = DateFormatter()
private let formatter = DateFormatter()
private var items: [String] = []
private var count = 2
private var result = RMRPullToRefreshResultType.success
// MARK: - IBOutlets var items: [String] = []
var count = 2
@IBOutlet weak var tableView: UITableView! var result = RMRPullToRefreshResultType.success
// MARK: - IBActions
@IBAction func settings(_ sender: AnyObject) {
let alertController = UIAlertController(title: "Result type", message: nil, preferredStyle: .actionSheet)
let successAction = UIAlertAction(title: "Success", style: .default) { _ in
self.result = .noUpdates
}
alertController.addAction(successAction)
let noUpdatesAction = UIAlertAction(title: "No updates", style: .default) { _ in
self.result = .noUpdates
}
alertController.addAction(noUpdatesAction)
let errorAction = UIAlertAction(title: "Error", style: .default) { _ in
self.result = .error
}
alertController.addAction(errorAction)
present(alertController, animated: true, completion: nil)
}
// MARK: - UIViewController
override func viewDidLoad() { override func viewDidLoad() {
super.viewDidLoad() super.viewDidLoad()
@ -72,47 +44,51 @@ final class ViewController: UIViewController {
// MARK: - Pull to Refresh // MARK: - Pull to Refresh
private func configurePullToRefresh() { func configurePullToRefresh() {
pullToRefresh = RMRPullToRefresh(scrollView: tableView, position: position()) { [weak self] in
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5, execute: { pullToRefresh = RMRPullToRefresh(
if self?.result == .success { scrollView: tableView,
self?.loadMore() position: position()) { [weak self] in
} DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(5.0 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {
if let result = self?.result { if self?.result == .success {
self?.pullToRefresh?.stopLoading(result) self?.loadMore()
} }
}) if let result = self?.result {
self?.pullToRefresh?.stopLoading(result)
}
})
} }
switch exampleType { if exampleType == .perekrestokTop || exampleType == .perekrestokBottom {
case .perekrestokTop, .perekrestokBottom:
perekrestok() perekrestok()
case .beelineTop, .beelineBottom: } else if exampleType == .beelineTop || exampleType == .beelineBottom {
beeline() beeline()
case .redmadrobotTop, .redmadrobotBottom: } else if exampleType == .redmadrobotTop || exampleType == .redmadrobotBottom {
redmadrobot() redmadrobot()
} }
//pullToRefresh?.setHideDelay(5.0, result: .success) pullToRefresh?.setHideDelay(5.0, result: .success)
//pullToRefresh?.hideWhenError = false
pullToRefresh?.hideWhenError = false
} }
// MARK: - Build example values // MARK: - Build example values
private func perekrestok() { func perekrestok() {
if let pullToRefreshView = PerekrestokView.XIB_VIEW() { if let pullToRefreshView = PerekrestokView.XIB_VIEW() {
pullToRefresh?.configureView(pullToRefreshView, state: .dragging, result: .success) pullToRefresh?.configureView(pullToRefreshView, state: .dragging, result: .success)
pullToRefresh?.configureView(pullToRefreshView, state: .loading, result: .success) pullToRefresh?.configureView(pullToRefreshView, state: .loading, result: .success)
} }
pullToRefresh?.height = 90.0 pullToRefresh?.height = 90.0
pullToRefresh?.backgroundColor = UIColor( pullToRefresh?.backgroundColor = UIColor(red: 16.0/255.0,
red: 16.0/255.0, green: 192.0/255.0,
green: 192.0/255.0, blue: 119.0/255.0,
blue: 119.0/255.0, alpha: 1.0)
alpha: 1.0)
} }
private func beeline() { func beeline() {
if let pullToRefreshView = BeelineView.XIB_VIEW() { if let pullToRefreshView = BeelineView.XIB_VIEW() {
pullToRefresh?.configureView(pullToRefreshView, state: .dragging, result: .success) pullToRefresh?.configureView(pullToRefreshView, state: .dragging, result: .success)
pullToRefresh?.configureView(pullToRefreshView, state: .loading, result: .success) pullToRefresh?.configureView(pullToRefreshView, state: .loading, result: .success)
@ -121,11 +97,11 @@ final class ViewController: UIViewController {
pullToRefresh?.backgroundColor = UIColor.white pullToRefresh?.backgroundColor = UIColor.white
} }
private func redmadrobot() { func redmadrobot() {
pullToRefresh?.setupDefaultSettings() pullToRefresh?.setupDefaultSettings()
} }
private func position() -> RMRPullToRefreshPosition { func position() -> RMRPullToRefreshPosition {
if exampleType == .perekrestokTop || exampleType == .beelineTop || exampleType == .redmadrobotTop { if exampleType == .perekrestokTop || exampleType == .beelineTop || exampleType == .redmadrobotTop {
return .top return .top
} }
@ -134,29 +110,49 @@ final class ViewController: UIViewController {
// MARK: - Configure // MARK: - Configure
private func someConfiguring() { func someConfiguring() {
formatter.dateStyle = DateFormatter.Style.long formatter.dateStyle = DateFormatter.Style.long
formatter.timeStyle = .medium formatter.timeStyle = .medium
} }
// MARK: - Action
@IBAction func settings(_ sender: AnyObject) {
UIActionSheet(title: "Result type", delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil, otherButtonTitles: ".Success", ".NoUpdates", ".Error").show(in: self.view)
}
// MARK: - UIActionSheetDelegate
func actionSheet(_ actionSheet: UIActionSheet, clickedButtonAt buttonIndex: Int) {
switch buttonIndex {
case 0:
self.result = .success
case 1:
self.result = .noUpdates
case 2:
self.result = .error
default:
break;
}
}
// MARK: - Test data // MARK: - Test data
private func loadData() { func loadData() {
for _ in 0...count { for _ in 0...count {
items.append(formatter.string(from: Date())) items.append(formatter.string(from: Date()))
} }
} }
private func loadMore() { func loadMore() {
for _ in 0...20 { for _ in 0...20 {
self.items.append(formatter.string(from: Date(timeIntervalSinceNow: 20))) self.items.append(formatter.string(from: Date(timeIntervalSinceNow: 20)))
} }
self.tableView.reloadData() self.tableView.reloadData()
} }
}
// MARK: - TableView
// MARK: - UITableViewDataSource
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
@ -172,3 +168,4 @@ extension ViewController: UITableViewDataSource {
return 1; return 1;
} }
} }

View File

@ -148,13 +148,14 @@
89CB122C1C9DA07B00048E46 /* Project object */ = { 89CB122C1C9DA07B00048E46 /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0720; LastSwiftUpdateCheck = 1000;
LastUpgradeCheck = 1000; LastUpgradeCheck = 1000;
ORGANIZATIONNAME = "Merkulov Ilya"; ORGANIZATIONNAME = "Merkulov Ilya";
TargetAttributes = { TargetAttributes = {
89CB12331C9DA07B00048E46 = { 89CB12331C9DA07B00048E46 = {
CreatedOnToolsVersion = 7.2.1; CreatedOnToolsVersion = 7.2.1;
LastSwiftMigration = 0920; DevelopmentTeam = GMD7EK7S94;
LastSwiftMigration = 0800;
}; };
}; };
}; };
@ -362,7 +363,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 9.0; IPHONEOS_DEPLOYMENT_TARGET = 9.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_COMPILATION_MODE = wholemodule;
VALIDATE_PRODUCT = YES; VALIDATE_PRODUCT = YES;
}; };
name = Release; name = Release;

View File

@ -1,6 +1,6 @@
Pod::Spec.new do |spec| Pod::Spec.new do |spec|
spec.name = "RMRPullToRefresh" spec.name = "RMRPullToRefresh"
spec.version = "0.8.0" spec.version = "0.6.0"
spec.platform = :ios, "9.0" spec.platform = :ios, "9.0"
spec.license = { :type => "MIT", :file => "LICENSE" } spec.license = { :type => "MIT", :file => "LICENSE" }
spec.summary = "A pull to refresh control for UIScrollView (UITableView and UICollectionView)" spec.summary = "A pull to refresh control for UIScrollView (UITableView and UICollectionView)"
@ -8,5 +8,5 @@ Pod::Spec.new do |spec|
spec.author = "Ilya Merkulov" spec.author = "Ilya Merkulov"
spec.source = { :git => "https://git.redmadrobot.com/helper-ios/RMRPullToRefresh.git", :tag => spec.version } spec.source = { :git => "https://git.redmadrobot.com/helper-ios/RMRPullToRefresh.git", :tag => spec.version }
spec.source_files = "Classes/*.{swift}", "Classes/Default/*.{swift}" spec.source_files = "Classes/*.{swift}", "Classes/Default/*.{swift}"
spec.resources = ['Images/*.png'] spec.resources = ['Images/*.png']
end end