Compare commits
No commits in common. "master" and "v0.1" have entirely different histories.
|
|
@ -1,177 +0,0 @@
|
||||||
#########################
|
|
||||||
# .gitignore file for Xcode4 and Xcode5 Source projects
|
|
||||||
#
|
|
||||||
# Apple bugs, waiting for Apple to fix/respond:
|
|
||||||
#
|
|
||||||
# 15564624 - what does the xccheckout file in Xcode5 do? Where's the documentation?
|
|
||||||
#
|
|
||||||
# Version 2.1
|
|
||||||
# For latest version, see: http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects
|
|
||||||
#
|
|
||||||
# 2013 updates:
|
|
||||||
# - fixed the broken "save personal Schemes"
|
|
||||||
# - added line-by-line explanations for EVERYTHING (some were missing)
|
|
||||||
#
|
|
||||||
# NB: if you are storing "built" products, this WILL NOT WORK,
|
|
||||||
# and you should use a different .gitignore (or none at all)
|
|
||||||
# This file is for SOURCE projects, where there are many extra
|
|
||||||
# files that we want to exclude
|
|
||||||
#
|
|
||||||
#########################
|
|
||||||
|
|
||||||
#####
|
|
||||||
# OS X temporary files that should never be committed
|
|
||||||
#
|
|
||||||
# c.f. http://www.westwind.com/reference/os-x/invisibles.html
|
|
||||||
|
|
||||||
.DS_Store
|
|
||||||
|
|
||||||
# c.f. http://www.westwind.com/reference/os-x/invisibles.html
|
|
||||||
|
|
||||||
.Trashes
|
|
||||||
|
|
||||||
# c.f. http://www.westwind.com/reference/os-x/invisibles.html
|
|
||||||
|
|
||||||
*.swp
|
|
||||||
|
|
||||||
# *.lock - this is used and abused by many editors for many different things.
|
|
||||||
# For the main ones I use (e.g. Eclipse), it should be excluded
|
|
||||||
# from source-control, but YMMV
|
|
||||||
|
|
||||||
*.lock
|
|
||||||
|
|
||||||
#
|
|
||||||
# profile - REMOVED temporarily (on double-checking, this seems incorrect; I can't find it in OS X docs?)
|
|
||||||
#profile
|
|
||||||
|
|
||||||
|
|
||||||
####
|
|
||||||
# Xcode temporary files that should never be committed
|
|
||||||
#
|
|
||||||
# NB: NIB/XIB files still exist even on Storyboard projects, so we want this...
|
|
||||||
|
|
||||||
*~.nib
|
|
||||||
|
|
||||||
|
|
||||||
####
|
|
||||||
# Xcode build files -
|
|
||||||
#
|
|
||||||
# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "DerivedData"
|
|
||||||
|
|
||||||
DerivedData/
|
|
||||||
|
|
||||||
# NB: slash on the end, so we only remove the FOLDER, not any files that were badly named "build"
|
|
||||||
|
|
||||||
build/
|
|
||||||
|
|
||||||
|
|
||||||
#####
|
|
||||||
# Xcode private settings (window sizes, bookmarks, breakpoints, custom executables, smart groups)
|
|
||||||
#
|
|
||||||
# This is complicated:
|
|
||||||
#
|
|
||||||
# SOMETIMES you need to put this file in version control.
|
|
||||||
# Apple designed it poorly - if you use "custom executables", they are
|
|
||||||
# saved in this file.
|
|
||||||
# 99% of projects do NOT use those, so they do NOT want to version control this file.
|
|
||||||
# ..but if you're in the 1%, comment out the line "*.pbxuser"
|
|
||||||
|
|
||||||
# .pbxuser: http://lists.apple.com/archives/xcode-users/2004/Jan/msg00193.html
|
|
||||||
|
|
||||||
*.pbxuser
|
|
||||||
|
|
||||||
# .mode1v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html
|
|
||||||
|
|
||||||
*.mode1v3
|
|
||||||
|
|
||||||
# .mode2v3: http://lists.apple.com/archives/xcode-users/2007/Oct/msg00465.html
|
|
||||||
|
|
||||||
*.mode2v3
|
|
||||||
|
|
||||||
# .perspectivev3: http://stackoverflow.com/questions/5223297/xcode-projects-what-is-a-perspectivev3-file
|
|
||||||
|
|
||||||
*.perspectivev3
|
|
||||||
|
|
||||||
# NB: also, whitelist the default ones, some projects need to use these
|
|
||||||
!default.pbxuser
|
|
||||||
!default.mode1v3
|
|
||||||
!default.mode2v3
|
|
||||||
!default.perspectivev3
|
|
||||||
|
|
||||||
|
|
||||||
####
|
|
||||||
# Xcode 4 - semi-personal settings
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# OPTION 1: ---------------------------------
|
|
||||||
# throw away ALL personal settings (including custom schemes!
|
|
||||||
# - unless they are "shared")
|
|
||||||
#
|
|
||||||
# NB: this is exclusive with OPTION 2 below
|
|
||||||
xcuserdata
|
|
||||||
|
|
||||||
# OPTION 2: ---------------------------------
|
|
||||||
# get rid of ALL personal settings, but KEEP SOME OF THEM
|
|
||||||
# - NB: you must manually uncomment the bits you want to keep
|
|
||||||
#
|
|
||||||
# NB: this *requires* git v1.8.2 or above; you may need to upgrade to latest OS X,
|
|
||||||
# or manually install git over the top of the OS X version
|
|
||||||
# NB: this is exclusive with OPTION 1 above
|
|
||||||
#
|
|
||||||
#xcuserdata/**/*
|
|
||||||
|
|
||||||
# (requires option 2 above): Personal Schemes
|
|
||||||
#
|
|
||||||
#!xcuserdata/**/xcschemes/*
|
|
||||||
|
|
||||||
####
|
|
||||||
# XCode 4 workspaces - more detailed
|
|
||||||
#
|
|
||||||
# Workspaces are important! They are a core feature of Xcode - don't exclude them :)
|
|
||||||
#
|
|
||||||
# Workspace layout is quite spammy. For reference:
|
|
||||||
#
|
|
||||||
# /(root)/
|
|
||||||
# /(project-name).xcodeproj/
|
|
||||||
# project.pbxproj
|
|
||||||
# /project.xcworkspace/
|
|
||||||
# contents.xcworkspacedata
|
|
||||||
# /xcuserdata/
|
|
||||||
# /(your name)/xcuserdatad/
|
|
||||||
# UserInterfaceState.xcuserstate
|
|
||||||
# /xcsshareddata/
|
|
||||||
# /xcschemes/
|
|
||||||
# (shared scheme name).xcscheme
|
|
||||||
# /xcuserdata/
|
|
||||||
# /(your name)/xcuserdatad/
|
|
||||||
# (private scheme).xcscheme
|
|
||||||
# xcschememanagement.plist
|
|
||||||
#
|
|
||||||
#
|
|
||||||
|
|
||||||
####
|
|
||||||
# Xcode 4 - Deprecated classes
|
|
||||||
#
|
|
||||||
# Allegedly, if you manually "deprecate" your classes, they get moved here.
|
|
||||||
#
|
|
||||||
# We're using source-control, so this is a "feature" that we do not want!
|
|
||||||
|
|
||||||
*.moved-aside
|
|
||||||
|
|
||||||
####
|
|
||||||
# UNKNOWN: recommended by others, but I can't discover what these files are
|
|
||||||
#
|
|
||||||
# ...none. Everything is now explained.
|
|
||||||
|
|
||||||
####
|
|
||||||
# Pods ignoring:
|
|
||||||
Pods
|
|
||||||
!Podfile.lock
|
|
||||||
|
|
||||||
# xccheckout ignoring
|
|
||||||
# ref. http://stackoverflow.com/questions/18340453/should-xccheckout-files-in-xcode5-be-ignored-under-vcs
|
|
||||||
*.xccheckout
|
|
||||||
|
|
||||||
# AppCode configuration ignoring
|
|
||||||
.idea/
|
|
||||||
|
|
||||||
|
|
@ -33,16 +33,16 @@ class RMRPullToRefreshBaseMessageView: RMRPullToRefreshBaseView {
|
||||||
|
|
||||||
func configureLabel() {
|
func configureLabel() {
|
||||||
let label = UILabel(frame: self.messageView.bounds)
|
let label = UILabel(frame: self.messageView.bounds)
|
||||||
label.textColor = UIColor.white
|
label.textColor = UIColor.whiteColor()
|
||||||
label.textAlignment = .center
|
label.textAlignment = .Center
|
||||||
label.text = messageText()
|
label.text = messageText()
|
||||||
messageView.addSubview(label)
|
messageView.addSubview(label)
|
||||||
label.translatesAutoresizingMaskIntoConstraints = false
|
label.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
for attribute in [NSLayoutConstraint.Attribute.top, NSLayoutConstraint.Attribute.right, NSLayoutConstraint.Attribute.left, NSLayoutConstraint.Attribute.bottom] {
|
for attribute in [NSLayoutAttribute.Top, NSLayoutAttribute.Right, NSLayoutAttribute.Left, NSLayoutAttribute.Bottom] {
|
||||||
messageView.addConstraint(NSLayoutConstraint(item: label,
|
messageView.addConstraint(NSLayoutConstraint(item: label,
|
||||||
attribute: attribute,
|
attribute: attribute,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: messageView,
|
toItem: messageView,
|
||||||
attribute: attribute,
|
attribute: attribute,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
|
|
@ -58,36 +58,36 @@ class RMRPullToRefreshBaseMessageView: RMRPullToRefreshBaseView {
|
||||||
messageView.translatesAutoresizingMaskIntoConstraints = false
|
messageView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
|
||||||
let heightConstraint = NSLayoutConstraint(item: messageView,
|
let heightConstraint = NSLayoutConstraint(item: messageView,
|
||||||
attribute: NSLayoutConstraint.Attribute.height,
|
attribute: NSLayoutAttribute.Height,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: nil,
|
toItem: nil,
|
||||||
attribute: NSLayoutConstraint.Attribute.notAnAttribute,
|
attribute: NSLayoutAttribute.NotAnAttribute,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 30)
|
constant: 30)
|
||||||
|
|
||||||
let widthConstraint = NSLayoutConstraint(item: messageView,
|
let widthConstraint = NSLayoutConstraint(item: messageView,
|
||||||
attribute: NSLayoutConstraint.Attribute.width,
|
attribute: NSLayoutAttribute.Width,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: nil,
|
toItem: nil,
|
||||||
attribute: NSLayoutConstraint.Attribute.notAnAttribute,
|
attribute: NSLayoutAttribute.NotAnAttribute,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 150)
|
constant: 150)
|
||||||
|
|
||||||
messageView.addConstraints([heightConstraint, widthConstraint])
|
messageView.addConstraints([heightConstraint, widthConstraint])
|
||||||
|
|
||||||
let verticalConstraint = NSLayoutConstraint(item: messageView,
|
let verticalConstraint = NSLayoutConstraint(item: messageView,
|
||||||
attribute: .centerY,
|
attribute: .CenterY,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: self,
|
toItem: self,
|
||||||
attribute: .centerY,
|
attribute: .CenterY,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 0)
|
constant: 0)
|
||||||
|
|
||||||
let leftConstraint = NSLayoutConstraint(item: messageView,
|
let leftConstraint = NSLayoutConstraint(item: messageView,
|
||||||
attribute: .left,
|
attribute: .Left,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: self,
|
toItem: self,
|
||||||
attribute: .right,
|
attribute: .Right,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 0)
|
constant: 0)
|
||||||
|
|
||||||
|
|
@ -97,7 +97,7 @@ class RMRPullToRefreshBaseMessageView: RMRPullToRefreshBaseView {
|
||||||
}
|
}
|
||||||
|
|
||||||
func messageBackgroundColor() -> UIColor {
|
func messageBackgroundColor() -> UIColor {
|
||||||
return UIColor.white
|
return UIColor.whiteColor()
|
||||||
}
|
}
|
||||||
|
|
||||||
func messageText() -> String? {
|
func messageText() -> String? {
|
||||||
|
|
@ -114,20 +114,20 @@ class RMRPullToRefreshBaseMessageView: RMRPullToRefreshBaseView {
|
||||||
if self.messageViewLeftConstaint?.constant != 0.0 {
|
if self.messageViewLeftConstaint?.constant != 0.0 {
|
||||||
self.messageViewLeftConstaint?.constant = 0.0
|
self.messageViewLeftConstaint?.constant = 0.0
|
||||||
}
|
}
|
||||||
UIView.animate(withDuration: 0.4, animations: {[weak self] in
|
UIView.animateWithDuration(0.4) {[weak self] in
|
||||||
self?.layoutIfNeeded()
|
self?.layoutIfNeeded()
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func willEndLoadingAnimation() {
|
override func willEndLoadingAnimation() {
|
||||||
self.logoHorizontalConstraint?.constant = -self.bounds.width/2.0 + self.logoImageView.bounds.width
|
self.logoHorizontalConstraint?.constant = -CGRectGetWidth(self.bounds)/2.0 + CGRectGetWidth(self.logoImageView.bounds)
|
||||||
self.messageViewLeftConstaint?.constant = -messageView.bounds.width - 10.0
|
self.messageViewLeftConstaint?.constant = -CGRectGetWidth(messageView.bounds) - 10.0
|
||||||
UIView.animate(withDuration: 0.4, animations: {[weak self] in
|
UIView.animateWithDuration(0.4) {[weak self] in
|
||||||
self?.layoutIfNeeded()
|
self?.layoutIfNeeded()
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func didEndLoadingAnimation(_ hidden: Bool) {
|
override func didEndLoadingAnimation(hidden: Bool) {
|
||||||
super.didEndLoadingAnimation(hidden)
|
super.didEndLoadingAnimation(hidden)
|
||||||
if hidden {
|
if hidden {
|
||||||
self.logoHorizontalConstraint?.constant = 0.0
|
self.logoHorizontalConstraint?.constant = 0.0
|
||||||
|
|
|
||||||
|
|
@ -45,36 +45,36 @@ class RMRPullToRefreshBaseView: RMRPullToRefreshView {
|
||||||
func configureConstraints() {
|
func configureConstraints() {
|
||||||
logoImageView.translatesAutoresizingMaskIntoConstraints = false
|
logoImageView.translatesAutoresizingMaskIntoConstraints = false
|
||||||
let heightConstraint = NSLayoutConstraint(item: logoImageView,
|
let heightConstraint = NSLayoutConstraint(item: logoImageView,
|
||||||
attribute: NSLayoutConstraint.Attribute.height,
|
attribute: NSLayoutAttribute.Height,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: nil,
|
toItem: nil,
|
||||||
attribute: NSLayoutConstraint.Attribute.notAnAttribute,
|
attribute: NSLayoutAttribute.NotAnAttribute,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 50)
|
constant: 50)
|
||||||
|
|
||||||
let widthConstraint = NSLayoutConstraint(item: logoImageView,
|
let widthConstraint = NSLayoutConstraint(item: logoImageView,
|
||||||
attribute: NSLayoutConstraint.Attribute.width,
|
attribute: NSLayoutAttribute.Width,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: nil,
|
toItem: nil,
|
||||||
attribute: NSLayoutConstraint.Attribute.notAnAttribute,
|
attribute: NSLayoutAttribute.NotAnAttribute,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 50)
|
constant: 50)
|
||||||
|
|
||||||
logoImageView.addConstraints([heightConstraint, widthConstraint])
|
logoImageView.addConstraints([heightConstraint, widthConstraint])
|
||||||
|
|
||||||
let verticalConstraint = NSLayoutConstraint(item: logoImageView,
|
let verticalConstraint = NSLayoutConstraint(item: logoImageView,
|
||||||
attribute: .centerY,
|
attribute: .CenterY,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: self,
|
toItem: self,
|
||||||
attribute: .centerY,
|
attribute: .CenterY,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 0)
|
constant: 0)
|
||||||
|
|
||||||
let horizontalConstraint = NSLayoutConstraint(item: logoImageView,
|
let horizontalConstraint = NSLayoutConstraint(item: logoImageView,
|
||||||
attribute: .centerX,
|
attribute: .CenterX,
|
||||||
relatedBy: NSLayoutConstraint.Relation.equal,
|
relatedBy: NSLayoutRelation.Equal,
|
||||||
toItem: self,
|
toItem: self,
|
||||||
attribute: .centerX,
|
attribute: .CenterX,
|
||||||
multiplier: 1,
|
multiplier: 1,
|
||||||
constant: 0)
|
constant: 0)
|
||||||
|
|
||||||
|
|
@ -85,18 +85,18 @@ class RMRPullToRefreshBaseView: RMRPullToRefreshView {
|
||||||
|
|
||||||
func resetTransformIfNecessary() {
|
func resetTransformIfNecessary() {
|
||||||
if !isConfigured {
|
if !isConfigured {
|
||||||
logoImageView.transform = CGAffineTransform(rotationAngle: .pi)
|
logoImageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
|
||||||
didRotateToBottom = true
|
didRotateToBottom = true
|
||||||
isConfigured = true
|
isConfigured = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeIncreasePulling(_ animated: Bool) {
|
func makeIncreasePulling(animated: Bool) {
|
||||||
didRotateToTop = true
|
didRotateToTop = true
|
||||||
didRotateToBottom = false
|
didRotateToBottom = false
|
||||||
let rotateTransform = logoImageView.transform.rotated(by: .pi);
|
let rotateTransform = CGAffineTransformRotate(logoImageView.transform, CGFloat(M_PI));
|
||||||
if animated {
|
if animated {
|
||||||
UIView .animate(withDuration: 0.4, animations: { [weak self] in
|
UIView .animateWithDuration(0.4, animations: { [weak self] in
|
||||||
self?.logoImageView.transform = rotateTransform
|
self?.logoImageView.transform = rotateTransform
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -104,12 +104,12 @@ class RMRPullToRefreshBaseView: RMRPullToRefreshView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func makeDecreasePulling(_ animated: Bool) {
|
func makeDecreasePulling(animated: Bool) {
|
||||||
didRotateToBottom = true
|
didRotateToBottom = true
|
||||||
didRotateToTop = false
|
didRotateToTop = false
|
||||||
let rotateTransform = logoImageView.transform.rotated(by: -.pi);
|
let rotateTransform = CGAffineTransformRotate(logoImageView.transform, -CGFloat(M_PI));
|
||||||
if animated {
|
if animated {
|
||||||
UIView .animate(withDuration: 0.4, animations: { [weak self] in
|
UIView .animateWithDuration(0.4, animations: { [weak self] in
|
||||||
self?.logoImageView.transform = rotateTransform
|
self?.logoImageView.transform = rotateTransform
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -119,7 +119,7 @@ class RMRPullToRefreshBaseView: RMRPullToRefreshView {
|
||||||
|
|
||||||
// MARK: - RMRPullToRefreshViewProtocol
|
// MARK: - RMRPullToRefreshViewProtocol
|
||||||
|
|
||||||
override func didChangeDraggingProgress(_ progress: CGFloat) {
|
override func didChangeDraggingProgress(progress: CGFloat) {
|
||||||
|
|
||||||
resetTransformIfNecessary()
|
resetTransformIfNecessary()
|
||||||
|
|
||||||
|
|
@ -133,7 +133,7 @@ class RMRPullToRefreshBaseView: RMRPullToRefreshView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override func prepareForLoadingAnimation(_ startProgress: CGFloat) {
|
override func prepareForLoadingAnimation(startProgress: CGFloat) {
|
||||||
if logoImageView.animationImages == nil {
|
if logoImageView.animationImages == nil {
|
||||||
logoImageView.animationImages = images
|
logoImageView.animationImages = images
|
||||||
logoImageView.animationDuration = 0.8
|
logoImageView.animationDuration = 0.8
|
||||||
|
|
@ -145,7 +145,7 @@ class RMRPullToRefreshBaseView: RMRPullToRefreshView {
|
||||||
logoImageView.startAnimating()
|
logoImageView.startAnimating()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func didEndLoadingAnimation(_ hidden: Bool) {
|
override func didEndLoadingAnimation(hidden: Bool) {
|
||||||
logoImageView.stopAnimating()
|
logoImageView.stopAnimating()
|
||||||
logoImageView.layer.removeAllAnimations()
|
logoImageView.layer.removeAllAnimations()
|
||||||
didRotateToTop = false
|
didRotateToTop = false
|
||||||
|
|
|
||||||
|
|
@ -8,15 +8,15 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
open class RMRPullToRefreshViewFactory: NSObject {
|
public class RMRPullToRefreshViewFactory: NSObject {
|
||||||
|
|
||||||
class func create(_ result: RMRPullToRefreshResultType) -> RMRPullToRefreshView? {
|
class func create(result: RMRPullToRefreshResultType) -> RMRPullToRefreshView? {
|
||||||
switch result {
|
switch result {
|
||||||
case .success:
|
case .Success:
|
||||||
return RMRPullToRefreshSuccessView(result: result)
|
return RMRPullToRefreshSuccessView(result: result)
|
||||||
case .noUpdates:
|
case .NoUpdates:
|
||||||
return RMRPullToRefreshNoUpdatesView(result: result)
|
return RMRPullToRefreshNoUpdatesView(result: result)
|
||||||
case .error:
|
case .Error:
|
||||||
return RMRPullToRefreshErrorView(result: result)
|
return RMRPullToRefreshErrorView(result: result)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,73 +8,64 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
open class RMRPullToRefresh: NSObject {
|
public class RMRPullToRefresh: NSObject {
|
||||||
|
|
||||||
private var сontroller: RMRPullToRefreshController?
|
private var сontroller: RMRPullToRefreshController?
|
||||||
|
|
||||||
open var height : CGFloat = RMRPullToRefreshConstants.DefaultHeight {
|
public var height : CGFloat = RMRPullToRefreshConstants.DefaultHeight {
|
||||||
didSet {
|
didSet {
|
||||||
сontroller?.configureHeight(height)
|
сontroller?.configureHeight(height)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open var backgroundColor : UIColor = RMRPullToRefreshConstants.DefaultBackgroundColor {
|
public var backgroundColor : UIColor = RMRPullToRefreshConstants.DefaultBackgroundColor {
|
||||||
didSet {
|
didSet {
|
||||||
сontroller?.configureBackgroundColor(backgroundColor)
|
сontroller?.configureBackgroundColor(backgroundColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open var hideWhenError: Bool = true {
|
public var hideWhenError: Bool = true {
|
||||||
didSet {
|
didSet {
|
||||||
сontroller?.hideWhenError = hideWhenError
|
сontroller?.hideWhenError = hideWhenError
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(
|
public init(scrollView: UIScrollView, position:RMRPullToRefreshPosition, actionHandler: () -> Void) {
|
||||||
scrollView: UIScrollView,
|
|
||||||
position:RMRPullToRefreshPosition,
|
|
||||||
actionHandler: @escaping () -> Void)
|
|
||||||
{
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
let controller = RMRPullToRefreshController(
|
let controller = RMRPullToRefreshController(scrollView: scrollView,
|
||||||
scrollView: scrollView,
|
position: position,
|
||||||
position: position,
|
actionHandler: actionHandler)
|
||||||
actionHandler: actionHandler)
|
|
||||||
|
|
||||||
scrollView.addSubview(controller.containerView)
|
scrollView.addSubview(controller.containerView)
|
||||||
self.сontroller = controller
|
self.сontroller = controller
|
||||||
}
|
}
|
||||||
|
|
||||||
open func configureView(_ view :RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
|
public func configureView(view :RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
|
||||||
сontroller?.configureView(view, state: state, result: result)
|
сontroller?.configureView(view, state: state, result: result)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func configureView(_ view :RMRPullToRefreshView, result:RMRPullToRefreshResultType) {
|
public func configureView(view :RMRPullToRefreshView, result:RMRPullToRefreshResultType) {
|
||||||
сontroller?.configureView(view, result: result)
|
сontroller?.configureView(view, result: result)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func setupDefaultSettings() {
|
public func setupDefaultSettings() {
|
||||||
сontroller?.setupDefaultSettings()
|
сontroller?.setupDefaultSettings()
|
||||||
}
|
}
|
||||||
|
|
||||||
open func startLoading() {
|
public func startLoading() {
|
||||||
сontroller?.startLoading()
|
сontroller?.startLoading()
|
||||||
}
|
}
|
||||||
|
|
||||||
open func stopLoading() {
|
public func stopLoading() {
|
||||||
stopLoading(.success)
|
stopLoading(.Success)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func stopLoading(_ result:RMRPullToRefreshResultType) {
|
public func stopLoading(result:RMRPullToRefreshResultType) {
|
||||||
сontroller?.stopLoading(result)
|
сontroller?.stopLoading(result)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func setHideDelay(_ delay: TimeInterval, result: RMRPullToRefreshResultType) {
|
public func setHideDelay(delay: NSTimeInterval, result: RMRPullToRefreshResultType) {
|
||||||
сontroller?.setHideDelay(delay, result: result)
|
сontroller?.setHideDelay(delay, result: result)
|
||||||
}
|
}
|
||||||
|
|
||||||
open var state: RMRPullToRefreshState {
|
|
||||||
return сontroller?.state ?? .stopped
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,24 +9,32 @@
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
public enum RMRPullToRefreshPosition: Int {
|
public enum RMRPullToRefreshPosition: Int {
|
||||||
case top
|
case Top
|
||||||
case bottom
|
case Bottom
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum RMRPullToRefreshState: Int {
|
public enum RMRPullToRefreshState: Int {
|
||||||
case stopped
|
case Stopped
|
||||||
case dragging
|
case Dragging
|
||||||
case loading
|
case Loading
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum RMRPullToRefreshResultType: Int {
|
public enum RMRPullToRefreshResultType: Int {
|
||||||
case success = 0
|
case Success = 0
|
||||||
case noUpdates
|
case NoUpdates
|
||||||
case error
|
case Error
|
||||||
}
|
}
|
||||||
|
|
||||||
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.whiteColor()
|
||||||
}
|
}
|
||||||
|
|
@ -8,39 +8,39 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
open class RMRPullToRefreshContainerView: UIView {
|
public class RMRPullToRefreshContainerView: UIView {
|
||||||
|
|
||||||
var currentView: RMRPullToRefreshView?
|
var currentView: RMRPullToRefreshView?
|
||||||
|
|
||||||
var storage = [String: RMRPullToRefreshView]()
|
var storage = [String: RMRPullToRefreshView]()
|
||||||
|
|
||||||
open func configureView(_ view:RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
|
public func configureView(view:RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
|
||||||
let key = storageKey(state, result:result)
|
let key = storageKey(state, result:result)
|
||||||
self.storage[key] = view
|
self.storage[key] = view
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateView(_ state: RMRPullToRefreshState, result: RMRPullToRefreshResultType) {
|
func updateView(state: RMRPullToRefreshState, result: RMRPullToRefreshResultType) {
|
||||||
|
|
||||||
clear()
|
clear()
|
||||||
if let view = obtainView(state, result: result) {
|
if let view = obtainView(state, result: result) {
|
||||||
view.translatesAutoresizingMaskIntoConstraints = false
|
view.translatesAutoresizingMaskIntoConstraints = false
|
||||||
addSubview(view)
|
addSubview(view)
|
||||||
addConstraint(constraint(self, subview: view, attribute: NSLayoutConstraint.Attribute.left))
|
addConstraint(constraint(self, subview: view, attribute: NSLayoutAttribute.Left))
|
||||||
addConstraint(constraint(self, subview: view, attribute: NSLayoutConstraint.Attribute.top))
|
addConstraint(constraint(self, subview: view, attribute: NSLayoutAttribute.Top))
|
||||||
addConstraint(constraint(self, subview: view, attribute: NSLayoutConstraint.Attribute.right))
|
addConstraint(constraint(self, subview: view, attribute: NSLayoutAttribute.Right))
|
||||||
addConstraint(constraint(self, subview: view, attribute: NSLayoutConstraint.Attribute.bottom))
|
addConstraint(constraint(self, subview: view, attribute: NSLayoutAttribute.Bottom))
|
||||||
view.layoutIfNeeded()
|
view.layoutIfNeeded()
|
||||||
self.currentView = view
|
self.currentView = view
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func dragging(_ progress: CGFloat) {
|
func dragging(progress: CGFloat) {
|
||||||
if let view = self.currentView {
|
if let view = self.currentView {
|
||||||
view.didChangeDraggingProgress(progress)
|
view.didChangeDraggingProgress(progress)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func startLoadingAnimation(_ startProgress: CGFloat) {
|
func startLoadingAnimation(startProgress: CGFloat) {
|
||||||
if let view = self.currentView {
|
if let view = self.currentView {
|
||||||
if !view.pullToRefreshIsLoading {
|
if !view.pullToRefreshIsLoading {
|
||||||
view.prepareForLoadingAnimation(startProgress)
|
view.prepareForLoadingAnimation(startProgress)
|
||||||
|
|
@ -56,7 +56,7 @@ open class RMRPullToRefreshContainerView: UIView {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func stopAllAnimations(_ hidden: Bool) {
|
func stopAllAnimations(hidden: Bool) {
|
||||||
for view in storage.values {
|
for view in storage.values {
|
||||||
view.didEndLoadingAnimation(hidden)
|
view.didEndLoadingAnimation(hidden)
|
||||||
view.pullToRefreshIsLoading = false
|
view.pullToRefreshIsLoading = false
|
||||||
|
|
@ -72,19 +72,19 @@ open class RMRPullToRefreshContainerView: UIView {
|
||||||
self.currentView = nil
|
self.currentView = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func obtainView(_ state: RMRPullToRefreshState, result: RMRPullToRefreshResultType) -> RMRPullToRefreshView? {
|
func obtainView(state: RMRPullToRefreshState, result: RMRPullToRefreshResultType) -> RMRPullToRefreshView? {
|
||||||
let key = storageKey(state, result:result)
|
let key = storageKey(state, result:result)
|
||||||
return self.storage[key]
|
return self.storage[key]
|
||||||
}
|
}
|
||||||
|
|
||||||
func storageKey(_ state: RMRPullToRefreshState, result: RMRPullToRefreshResultType) -> String {
|
func storageKey(state: RMRPullToRefreshState, result: RMRPullToRefreshResultType) -> String {
|
||||||
return String(state.rawValue) + "_" + String(result.rawValue)
|
return String(state.rawValue) + "_" + String(result.rawValue)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// MARK: - Constraint
|
// MARK: - Constraint
|
||||||
|
|
||||||
func constraint(_ superview: UIView, subview: UIView, attribute: NSLayoutConstraint.Attribute) -> NSLayoutConstraint {
|
func constraint(superview: UIView, subview: UIView, attribute: NSLayoutAttribute) -> NSLayoutConstraint {
|
||||||
return NSLayoutConstraint(item: subview, attribute: attribute, relatedBy: NSLayoutConstraint.Relation.equal, toItem: superview, attribute: attribute, multiplier: 1, constant: 0)
|
return NSLayoutConstraint(item: subview, attribute: attribute, relatedBy: NSLayoutRelation.Equal, toItem: superview, attribute: attribute, multiplier: 1, constant: 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
open class RMRPullToRefreshController {
|
public class RMRPullToRefreshController: NSObject {
|
||||||
|
|
||||||
// MARK: - Vars
|
// MARK: - Vars
|
||||||
|
|
||||||
|
|
@ -16,11 +16,12 @@ open class RMRPullToRefreshController {
|
||||||
|
|
||||||
let containerView = RMRPullToRefreshContainerView()
|
let containerView = RMRPullToRefreshContainerView()
|
||||||
|
|
||||||
let backgroundView = UIView(frame: CGRect.zero)
|
let backgroundView = UIView(frame: CGRectZero)
|
||||||
var backgroundViewHeightConstraint: NSLayoutConstraint?
|
var backgroundViewHeightConstraint: NSLayoutConstraint?
|
||||||
var backgroundViewTopConstraint: NSLayoutConstraint?
|
var backgroundViewTopConstraint: NSLayoutConstraint?
|
||||||
|
|
||||||
var stopped = true
|
var stopped = true
|
||||||
|
var subscribing = false
|
||||||
|
|
||||||
var actionHandler: (() -> Void)!
|
var actionHandler: (() -> Void)!
|
||||||
|
|
||||||
|
|
@ -28,27 +29,22 @@ open class RMRPullToRefreshController {
|
||||||
var originalTopInset = CGFloat(0.0)
|
var originalTopInset = CGFloat(0.0)
|
||||||
var originalBottomInset = CGFloat(0.0)
|
var originalBottomInset = CGFloat(0.0)
|
||||||
|
|
||||||
var state = RMRPullToRefreshState.stopped
|
var state = RMRPullToRefreshState.Stopped
|
||||||
var result = RMRPullToRefreshResultType.success
|
var result = RMRPullToRefreshResultType.Success
|
||||||
var position: RMRPullToRefreshPosition?
|
var position: RMRPullToRefreshPosition?
|
||||||
|
|
||||||
var changingContentInset = false
|
var changingContentInset = false
|
||||||
var contentSizeWhenStartLoading: CGSize?
|
var contentSizeWhenStartLoading: CGSize?
|
||||||
|
|
||||||
var hideDelayValues = [RMRPullToRefreshResultType: TimeInterval]()
|
var hideDelayValues = [RMRPullToRefreshResultType: NSTimeInterval]()
|
||||||
|
|
||||||
open var hideWhenError: Bool = true
|
public 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: () -> Void) {
|
||||||
|
|
||||||
|
super.init()
|
||||||
self.scrollView = scrollView
|
self.scrollView = scrollView
|
||||||
self.actionHandler = actionHandler
|
self.actionHandler = actionHandler
|
||||||
self.position = position
|
self.position = position
|
||||||
|
|
@ -56,41 +52,39 @@ open class RMRPullToRefreshController {
|
||||||
self.configureBackgroundView(self.backgroundView)
|
self.configureBackgroundView(self.backgroundView)
|
||||||
self.configureHeight()
|
self.configureHeight()
|
||||||
|
|
||||||
self.containerView.backgroundColor = UIColor.clear
|
self.containerView.backgroundColor = UIColor.clearColor()
|
||||||
|
|
||||||
self.subscribeOnScrollViewEvents()
|
self.subscribeOnScrollViewEvents()
|
||||||
}
|
}
|
||||||
|
|
||||||
private func configureBackgroundView(_ backgroundView: UIView) {
|
deinit {
|
||||||
|
self.unsubscribeFromScrollViewEvents()
|
||||||
|
}
|
||||||
|
|
||||||
|
private 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) {
|
private func addBackgroundViewConstraints(backgroundView: UIView) {
|
||||||
guard let scrollView = scrollView, let position = position else {
|
// Constraints
|
||||||
return
|
self.backgroundViewHeightConstraint = NSLayoutConstraint(item: backgroundView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 0)
|
||||||
}
|
backgroundView.addConstraint(self.backgroundViewHeightConstraint!)
|
||||||
|
|
||||||
let backgroundViewHeightConstraint = backgroundView.heightAnchor.constraint(equalToConstant: 0)
|
scrollView?.addConstraint(NSLayoutConstraint(item: backgroundView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0))
|
||||||
backgroundViewHeightConstraint.isActive = true
|
|
||||||
self.backgroundViewHeightConstraint = backgroundViewHeightConstraint
|
|
||||||
|
|
||||||
backgroundView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
|
if position == .Top {
|
||||||
|
scrollView?.addConstraint(NSLayoutConstraint(item: backgroundView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0))
|
||||||
switch position {
|
} else if position == .Bottom, let scrollView = self.scrollView {
|
||||||
case .top:
|
let constant = max(scrollView.contentSize.height, CGRectGetHeight(scrollView.bounds))
|
||||||
backgroundView.bottomAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
|
self.backgroundViewTopConstraint = NSLayoutConstraint(item: backgroundView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: scrollView, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: constant)
|
||||||
case .bottom:
|
scrollView.addConstraint(self.backgroundViewTopConstraint!)
|
||||||
let constant = max(scrollView.contentSize.height, scrollView.bounds.height)
|
|
||||||
let backgroundViewTopConstraint = backgroundView.topAnchor.constraint(
|
|
||||||
equalTo: scrollView.bottomAnchor, constant: constant)
|
|
||||||
backgroundViewTopConstraint.isActive = true
|
|
||||||
self.backgroundViewTopConstraint = backgroundViewTopConstraint
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func configureHeight() {
|
private 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
|
||||||
|
|
@ -100,101 +94,96 @@ open class RMRPullToRefreshController {
|
||||||
|
|
||||||
// MARK: - Public
|
// MARK: - Public
|
||||||
|
|
||||||
open func configureView(_ view:RMRPullToRefreshView, result:RMRPullToRefreshResultType) {
|
public func configureView(view:RMRPullToRefreshView, result:RMRPullToRefreshResultType) {
|
||||||
configureView(view, state: .loading, result: result)
|
configureView(view, state: .Loading, result: result)
|
||||||
configureView(view, state: .dragging, result: result)
|
configureView(view, state: .Dragging, result: result)
|
||||||
configureView(view, state: .stopped, result: result)
|
configureView(view, state: .Stopped, result: result)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func configureView(_ view:RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
|
public func configureView(view:RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType) {
|
||||||
containerView.configureView(view, state: state, result: result)
|
containerView.configureView(view, state: state, result: result)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func configureHeight(_ height: CGFloat) {
|
public func configureHeight(height: CGFloat) {
|
||||||
self.height = height
|
self.height = height
|
||||||
updateContainerFrame()
|
updateContainerFrame()
|
||||||
}
|
}
|
||||||
|
|
||||||
open func configureBackgroundColor(_ color: UIColor) {
|
public func configureBackgroundColor(color: UIColor) {
|
||||||
self.backgroundView.backgroundColor = color
|
self.backgroundView.backgroundColor = color
|
||||||
}
|
}
|
||||||
|
|
||||||
open func setupDefaultSettings() {
|
public func setupDefaultSettings() {
|
||||||
setupDefaultSettings(.success, hideDelay: 0.0)
|
setupDefaultSettings(.Success, hideDelay: 0.0)
|
||||||
setupDefaultSettings(.noUpdates, hideDelay: 2.0)
|
setupDefaultSettings(.NoUpdates, hideDelay: 2.0)
|
||||||
setupDefaultSettings(.error, hideDelay: 2.0)
|
setupDefaultSettings(.Error, hideDelay: 2.0)
|
||||||
configureBackgroundColor(UIColor.white)
|
configureBackgroundColor(UIColor.whiteColor())
|
||||||
updateContainerView(self.state)
|
updateContainerView(self.state)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func startLoading() {
|
public func startLoading() {
|
||||||
startLoading(0.0)
|
startLoading(0.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
open func stopLoading(_ result:RMRPullToRefreshResultType) {
|
public func stopLoading(result:RMRPullToRefreshResultType) {
|
||||||
|
|
||||||
self.result = result
|
self.result = result
|
||||||
self.state = .stopped
|
self.state = .Stopped
|
||||||
updateContainerView(self.state)
|
updateContainerView(self.state)
|
||||||
containerView.prepareForStopAnimations()
|
containerView.prepareForStopAnimations()
|
||||||
|
|
||||||
var delay = hideDelay(result)
|
var delay = hideDelay(result)
|
||||||
let afterDelay = 0.4
|
var afterDelay = 0.4
|
||||||
|
|
||||||
if result == .error && !hideWhenError {
|
if result == .Error && !hideWhenError {
|
||||||
delay = 0.0
|
delay = 0.0
|
||||||
}
|
}
|
||||||
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: { [weak self] in
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), { [weak self] in
|
||||||
if self?.shouldHideWhenStopLoading() == true {
|
if self?.shouldHideWhenStopLoading() == true {
|
||||||
self?.resetContentInset()
|
self?.resetContentInset()
|
||||||
if let position = self?.position {
|
if let position = self?.position {
|
||||||
switch (position) {
|
switch (position) {
|
||||||
case .top:
|
case .Top:
|
||||||
self?.scrollToTop(true)
|
self?.scrollToTop(true)
|
||||||
case .bottom:
|
case .Bottom:
|
||||||
self?.scrollToBottom(true)
|
self?.scrollToBottom(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self?.contentSizeWhenStartLoading = nil
|
self?.contentSizeWhenStartLoading = nil
|
||||||
|
self?.performSelector(#selector(self?.resetBackgroundViewHeightConstraint), withObject: nil, afterDelay: afterDelay)
|
||||||
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + afterDelay) {
|
|
||||||
self?.resetBackgroundViewHeightConstraint()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + afterDelay) {
|
|
||||||
self?.stopAllAnimations()
|
|
||||||
}
|
}
|
||||||
|
self?.performSelector(#selector(self?.stopAllAnimations), withObject: nil, afterDelay: afterDelay)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
open func setHideDelay(_ delay: TimeInterval, result: RMRPullToRefreshResultType) {
|
public func setHideDelay(delay: NSTimeInterval, result: RMRPullToRefreshResultType) {
|
||||||
self.hideDelayValues[result] = delay
|
self.hideDelayValues[result] = delay
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
func setupDefaultSettings(_ result:RMRPullToRefreshResultType, hideDelay: TimeInterval) {
|
func setupDefaultSettings(result:RMRPullToRefreshResultType, hideDelay: NSTimeInterval) {
|
||||||
if let view = RMRPullToRefreshViewFactory.create(result) {
|
if let view = RMRPullToRefreshViewFactory.create(result) {
|
||||||
configureView(view, result: result)
|
configureView(view, result: result)
|
||||||
setHideDelay(hideDelay, result: result)
|
setHideDelay(hideDelay, result: result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func scrollToTop(_ animated: Bool) {
|
func scrollToTop(animated: Bool) {
|
||||||
if let scrollView = self.scrollView {
|
if let scrollView = self.scrollView {
|
||||||
if scrollView.contentOffset.y < -originalTopInset {
|
if scrollView.contentOffset.y < -originalTopInset {
|
||||||
let offset = CGPoint(x: scrollView.contentOffset.x, y: -self.originalTopInset)
|
let offset = CGPointMake(scrollView.contentOffset.x, -self.originalTopInset)
|
||||||
scrollView.setContentOffset(offset, animated: true)
|
scrollView.setContentOffset(offset, animated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func scrollToBottom(_ animated: Bool) {
|
func scrollToBottom(animated: Bool) {
|
||||||
if let scrollView = self.scrollView {
|
if let scrollView = self.scrollView {
|
||||||
var offset = scrollView.contentOffset
|
var offset = scrollView.contentOffset
|
||||||
if let contentSize = self.contentSizeWhenStartLoading {
|
if let contentSize = self.contentSizeWhenStartLoading {
|
||||||
offset.y = contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom
|
offset.y = contentSize.height - CGRectGetHeight(scrollView.bounds) + scrollView.contentInset.bottom
|
||||||
if state == .stopped {
|
if state == .Stopped {
|
||||||
if scrollView.contentOffset.y < offset.y {
|
if scrollView.contentOffset.y < offset.y {
|
||||||
return
|
return
|
||||||
} else if scrollView.contentOffset.y > offset.y {
|
} else if scrollView.contentOffset.y > offset.y {
|
||||||
|
|
@ -202,16 +191,16 @@ open class RMRPullToRefreshController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
offset.y = scrollView.contentSize.height - scrollView.bounds.height + scrollView.contentInset.bottom
|
offset.y = scrollView.contentSize.height - CGRectGetHeight(scrollView.bounds) + scrollView.contentInset.bottom
|
||||||
}
|
}
|
||||||
scrollView.setContentOffset(offset, animated: animated)
|
scrollView.setContentOffset(offset, animated: animated)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func startLoading(_ startProgress: CGFloat) {
|
func startLoading(startProgress: CGFloat) {
|
||||||
stopped = false
|
stopped = false
|
||||||
contentSizeWhenStartLoading = scrollView?.contentSize
|
contentSizeWhenStartLoading = scrollView?.contentSize
|
||||||
state = .loading
|
state = .Loading
|
||||||
updateContainerView(state)
|
updateContainerView(state)
|
||||||
actionHandler()
|
actionHandler()
|
||||||
|
|
||||||
|
|
@ -234,106 +223,95 @@ open class RMRPullToRefreshController {
|
||||||
backgroundViewHeightConstraint?.constant = 0
|
backgroundViewHeightConstraint?.constant = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
private func scrollViewDidChangePanState(_ scrollView: UIScrollView, panState: UIGestureRecognizer.State) {
|
private func scrollViewDidChangePanState(scrollView: UIScrollView, panState: UIGestureRecognizerState) {
|
||||||
if panState == .ended || panState == .cancelled || panState == .failed {
|
if panState == .Ended || panState == .Cancelled || panState == .Failed {
|
||||||
|
|
||||||
if state == .loading || (shouldHideWhenStopLoading() && !stopped) {
|
if state == .Loading || (shouldHideWhenStopLoading() && !stopped) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var y: CGFloat = 0.0
|
var y: CGFloat = 0.0
|
||||||
if position == .top {
|
if position == .Top {
|
||||||
y = -scrollView.contentOffset.y
|
y = -scrollView.contentOffset.y
|
||||||
} else if position == .bottom {
|
} else if position == .Bottom {
|
||||||
y = -(scrollView.contentSize.height - (scrollView.contentOffset.y + scrollView.bounds.height + originalBottomInset));
|
y = -(scrollView.contentSize.height - (scrollView.contentOffset.y + CGRectGetHeight(scrollView.bounds) + originalBottomInset));
|
||||||
}
|
}
|
||||||
|
|
||||||
if y >= height {
|
if y >= height {
|
||||||
startLoading(y/height)
|
startLoading(y/height)
|
||||||
// inset
|
// inset
|
||||||
var inset = scrollView.contentInset
|
var inset = scrollView.contentInset
|
||||||
if position == .top {
|
if position == .Top {
|
||||||
inset.top = originalTopInset+height
|
inset.top = originalTopInset+height
|
||||||
} else if position == .bottom {
|
} else if position == .Bottom {
|
||||||
inset.bottom = originalBottomInset+height
|
inset.bottom = originalBottomInset+height
|
||||||
}
|
}
|
||||||
setContentInset(inset, animated: true)
|
setContentInset(inset, animated: true)
|
||||||
} else {
|
} else {
|
||||||
state = .stopped
|
state = .Stopped
|
||||||
updateContainerView(state)
|
updateContainerView(state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func scrollViewDidChangeContentSize(_ scrollView: UIScrollView, contentSize: CGSize) {
|
private 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, CGRectGetHeight(scrollView.bounds))
|
||||||
if changingContentInset {
|
if changingContentInset {
|
||||||
scrollToBottom(true)
|
scrollToBottom(true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func scrollViewDidScroll(_ scrollView: UIScrollView, contentOffset: CGPoint) {
|
private func scrollViewDidScroll(scrollView: UIScrollView, contentOffset: CGPoint) {
|
||||||
|
|
||||||
if state == .loading {
|
|
||||||
if scrollView.contentOffset.y >= 0 {
|
|
||||||
scrollView.contentInset = UIEdgeInsets.zero
|
|
||||||
} else {
|
|
||||||
scrollView.contentInset = UIEdgeInsets.init(top: min(-scrollView.contentOffset.y, originalTopInset+height),left: 0,bottom: 0,right: 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !stopped {
|
if !stopped {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if scrollView.isDragging && state == .stopped {
|
if scrollView.dragging && state == .Stopped {
|
||||||
state = .dragging
|
state = .Dragging
|
||||||
updateContainerView(state)
|
updateContainerView(state)
|
||||||
}
|
}
|
||||||
var y: CGFloat = 0.0
|
var y: CGFloat = 0.0
|
||||||
|
|
||||||
if position == .top {
|
if position == .Top {
|
||||||
y = -(contentOffset.y)
|
y = -(contentOffset.y)
|
||||||
} else if position == .bottom {
|
} else if position == .Bottom {
|
||||||
y = -(scrollView.contentSize.height - (contentOffset.y + scrollView.bounds.height + originalBottomInset))
|
y = -(scrollView.contentSize.height - (contentOffset.y + CGRectGetHeight(scrollView.bounds) + originalBottomInset))
|
||||||
}
|
}
|
||||||
if y > 0 {
|
if y > 0 {
|
||||||
if state == .dragging {
|
if state == .Dragging {
|
||||||
containerView.dragging(y/height)
|
containerView.dragging(y/height)
|
||||||
}
|
}
|
||||||
configureBackgroundHeightConstraint(y, contentInset: scrollView.contentInset)
|
configureBackgroundHeightConstraint(y, contentInset: scrollView.contentInset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func configureBackgroundHeightConstraint(_ contentOffsetY: CGFloat, contentInset: UIEdgeInsets) {
|
private 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateContainerView(_ state: RMRPullToRefreshState) {
|
func updateContainerView(state: RMRPullToRefreshState) {
|
||||||
containerView.updateView(state, result: self.result)
|
containerView.updateView(state, result: self.result)
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateContainerFrame() {
|
func updateContainerFrame() {
|
||||||
if let scrollView = self.scrollView, let position = self.position {
|
if let scrollView = self.scrollView, let position = self.position {
|
||||||
var frame = CGRect.zero
|
var frame = CGRectZero
|
||||||
switch (position) {
|
switch (position) {
|
||||||
case .top:
|
case .Top:
|
||||||
frame = CGRect(x: 0, y: -height, width: scrollView.bounds.width, height: height)
|
frame = CGRectMake(0, -height, CGRectGetWidth(scrollView.bounds), height)
|
||||||
case .bottom:
|
case .Bottom:
|
||||||
let y = max(scrollView.contentSize.height, scrollView.bounds.height)
|
let y = max(scrollView.contentSize.height, CGRectGetHeight(scrollView.bounds))
|
||||||
frame = CGRect(x: 0, y: y, width: scrollView.bounds.width, height: height)
|
frame = CGRectMake(0, y, CGRectGetWidth(scrollView.bounds), height)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.containerView.frame = frame
|
self.containerView.frame = frame
|
||||||
|
|
@ -344,20 +322,20 @@ open class RMRPullToRefreshController {
|
||||||
if let scrollView = scrollView, let position = self.position {
|
if let scrollView = scrollView, let position = self.position {
|
||||||
var inset = scrollView.contentInset
|
var inset = scrollView.contentInset
|
||||||
switch (position) {
|
switch (position) {
|
||||||
case .top:
|
case .Top:
|
||||||
inset.top = originalTopInset
|
inset.top = originalTopInset
|
||||||
case .bottom:
|
case .Bottom:
|
||||||
inset.bottom = originalBottomInset
|
inset.bottom = originalBottomInset
|
||||||
}
|
}
|
||||||
setContentInset(inset, animated: true)
|
setContentInset(inset, animated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func setContentInset(_ contentInset: UIEdgeInsets, animated: Bool) {
|
func setContentInset(contentInset: UIEdgeInsets, animated: Bool) {
|
||||||
changingContentInset = true
|
changingContentInset = true
|
||||||
UIView.animate(withDuration: 0.3,
|
UIView.animateWithDuration(0.3,
|
||||||
delay: 0.0,
|
delay: 0.0,
|
||||||
options: UIView.AnimationOptions.beginFromCurrentState,
|
options: UIViewAnimationOptions.BeginFromCurrentState,
|
||||||
animations: { [weak self]() -> Void in
|
animations: { [weak self]() -> Void in
|
||||||
self?.scrollView?.contentInset = contentInset
|
self?.scrollView?.contentInset = contentInset
|
||||||
}, completion: { [weak self](finished) -> Void in
|
}, completion: { [weak self](finished) -> Void in
|
||||||
|
|
@ -365,20 +343,20 @@ open class RMRPullToRefreshController {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkContentSize(_ scrollView: UIScrollView) -> Bool{
|
func checkContentSize(scrollView: UIScrollView) -> Bool{
|
||||||
let height = scrollView.bounds.height
|
let height = CGRectGetHeight(scrollView.bounds)
|
||||||
if scrollView.contentSize.height < height {
|
if scrollView.contentSize.height < height {
|
||||||
scrollView.contentSize = CGSize(width: scrollView.contentSize.width, height: height)
|
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, height)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func shouldHideWhenStopLoading() -> Bool{
|
func shouldHideWhenStopLoading() -> Bool{
|
||||||
return (result != .error) || (result == .error && hideWhenError)
|
return (result != .Error) || (result == .Error && hideWhenError)
|
||||||
}
|
}
|
||||||
|
|
||||||
func hideDelay(_ result: RMRPullToRefreshResultType) -> TimeInterval {
|
func hideDelay(result: RMRPullToRefreshResultType) -> NSTimeInterval {
|
||||||
if let delay = hideDelayValues[result] {
|
if let delay = hideDelayValues[result] {
|
||||||
return delay
|
return delay
|
||||||
}
|
}
|
||||||
|
|
@ -387,35 +365,42 @@ open class RMRPullToRefreshController {
|
||||||
|
|
||||||
// MARK: - KVO
|
// MARK: - KVO
|
||||||
|
|
||||||
open func subscribeOnScrollViewEvents() {
|
public func subscribeOnScrollViewEvents() {
|
||||||
guard let scrollView = scrollView else {
|
if !subscribing, let scrollView = self.scrollView {
|
||||||
return
|
scrollView.addObserver(self, forKeyPath: RMRPullToRefreshConstants.KeyPaths.ContentOffset, options: .New, context: nil)
|
||||||
}
|
scrollView.addObserver(self, forKeyPath: RMRPullToRefreshConstants.KeyPaths.ContentSize, options: .New, context: nil)
|
||||||
|
scrollView.addObserver(self, forKeyPath: RMRPullToRefreshConstants.KeyPaths.PanState, options: .New, context: nil)
|
||||||
self.contentOffsetObservation = scrollView.observe(
|
subscribing = true
|
||||||
\.contentOffset,
|
|
||||||
options: [.new]) { [weak self] (scrollView, change) in
|
|
||||||
guard let newContentOffset = change.newValue else { return }
|
|
||||||
self?.scrollViewDidScroll(scrollView, contentOffset: newContentOffset)
|
|
||||||
}
|
|
||||||
|
|
||||||
self.contentSizeObservation = scrollView.observe(
|
|
||||||
\.contentSize,
|
|
||||||
options: [.new]) { [weak self] (scrollView, change) in
|
|
||||||
guard let newContentSize = change.newValue else { return }
|
|
||||||
self?.scrollViewDidChangeContentSize(scrollView, contentSize: newContentSize)
|
|
||||||
}
|
|
||||||
|
|
||||||
self.panStateObservation = scrollView.panGestureRecognizer.observe(
|
|
||||||
\.state,
|
|
||||||
options: [.new]) { [weak self] panGestureRecognizer, _ in
|
|
||||||
self?.scrollViewDidChangePanState(scrollView, panState: panGestureRecognizer.state)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open func unsubscribeFromScrollViewEvents() {
|
public func unsubscribeFromScrollViewEvents() {
|
||||||
contentOffsetObservation?.invalidate()
|
if subscribing, let scrollView = self.containerView.superview {
|
||||||
contentSizeObservation?.invalidate()
|
scrollView.removeObserver(self, forKeyPath: RMRPullToRefreshConstants.KeyPaths.ContentOffset)
|
||||||
panStateObservation?.invalidate()
|
scrollView.removeObserver(self, forKeyPath: RMRPullToRefreshConstants.KeyPaths.ContentSize)
|
||||||
|
scrollView.removeObserver(self, forKeyPath: RMRPullToRefreshConstants.KeyPaths.PanState)
|
||||||
|
subscribing = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override public func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
|
||||||
|
if keyPath == RMRPullToRefreshConstants.KeyPaths.ContentOffset {
|
||||||
|
if let newContentOffset = change?[NSKeyValueChangeNewKey]?.CGPointValue, scrollView = self.scrollView {
|
||||||
|
scrollViewDidScroll(scrollView, contentOffset:newContentOffset)
|
||||||
|
}
|
||||||
|
} else if keyPath == RMRPullToRefreshConstants.KeyPaths.ContentSize {
|
||||||
|
if let newContentSize = change?[NSKeyValueChangeNewKey]?.CGSizeValue(), scrollView = self.scrollView {
|
||||||
|
if checkContentSize(scrollView) {
|
||||||
|
scrollViewDidChangeContentSize(scrollView, contentSize: newContentSize)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if keyPath == RMRPullToRefreshConstants.KeyPaths.PanState {
|
||||||
|
if let rawValue = change?[NSKeyValueChangeNewKey] as? Int {
|
||||||
|
if let state = UIGestureRecognizerState(rawValue: rawValue), scrollView = self.scrollView {
|
||||||
|
scrollViewDidChangePanState(scrollView, panState: state)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -8,18 +8,18 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
open class RMRPullToRefreshView: UIView, RMRPullToRefreshViewProtocol {
|
public class RMRPullToRefreshView: UIView, RMRPullToRefreshViewProtocol {
|
||||||
|
|
||||||
var pullToRefreshIsLoading = false
|
var pullToRefreshIsLoading = false
|
||||||
|
|
||||||
// Begin Loading
|
// Begin Loading
|
||||||
open func prepareForLoadingAnimation(_ startProgress: CGFloat) {}
|
public func prepareForLoadingAnimation(startProgress: CGFloat) {}
|
||||||
open func beginLoadingAnimation() {}
|
public func beginLoadingAnimation() {}
|
||||||
|
|
||||||
// End Loading
|
// End Loading
|
||||||
open func willEndLoadingAnimation() {}
|
public func willEndLoadingAnimation() {}
|
||||||
open func didEndLoadingAnimation(_ hidden: Bool) {}
|
public func didEndLoadingAnimation(hidden: Bool) {}
|
||||||
|
|
||||||
// Dragging
|
// Dragging
|
||||||
open func didChangeDraggingProgress(_ progress: CGFloat) {}
|
public func didChangeDraggingProgress(progress: CGFloat) {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,13 +11,13 @@ import UIKit
|
||||||
public protocol RMRPullToRefreshViewProtocol {
|
public protocol RMRPullToRefreshViewProtocol {
|
||||||
|
|
||||||
// Begin Loading
|
// Begin Loading
|
||||||
func prepareForLoadingAnimation(_ startProgress: CGFloat)
|
func prepareForLoadingAnimation(startProgress: CGFloat)
|
||||||
func beginLoadingAnimation()
|
func beginLoadingAnimation()
|
||||||
|
|
||||||
// End Loading
|
// End Loading
|
||||||
func willEndLoadingAnimation()
|
func willEndLoadingAnimation()
|
||||||
func didEndLoadingAnimation(_ hidden: Bool)
|
func didEndLoadingAnimation(hidden: Bool)
|
||||||
|
|
||||||
// Dragging
|
// Dragging
|
||||||
func didChangeDraggingProgress(_ progress: CGFloat)
|
func didChangeDraggingProgress(progress: CGFloat)
|
||||||
}
|
}
|
||||||
|
|
@ -1,11 +1,5 @@
|
||||||
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'
|
pod 'RMRPullToRefresh', :git => "git@git.redmadrobot.com:im/RMRPullToRefresh.git"
|
||||||
workspace 'RMRPullToRefreshExample.xcworkspace'
|
|
||||||
|
|
||||||
target :RMRPullToRefreshExample do
|
|
||||||
pod 'RMRPullToRefresh', :path => "../"
|
|
||||||
end
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -14,30 +14,30 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||||
var window: UIWindow?
|
var window: UIWindow?
|
||||||
|
|
||||||
|
|
||||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
|
||||||
// Override point for customization after application launch.
|
// Override point for customization after application launch.
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationWillResignActive(_ application: UIApplication) {
|
func applicationWillResignActive(application: UIApplication) {
|
||||||
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
// Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
|
||||||
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
// Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationDidEnterBackground(_ application: UIApplication) {
|
func applicationDidEnterBackground(application: UIApplication) {
|
||||||
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
|
// Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
|
||||||
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
|
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationWillEnterForeground(_ application: UIApplication) {
|
func applicationWillEnterForeground(application: UIApplication) {
|
||||||
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
|
// Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationDidBecomeActive(_ application: UIApplication) {
|
func applicationDidBecomeActive(application: UIApplication) {
|
||||||
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationWillTerminate(_ application: UIApplication) {
|
func applicationWillTerminate(application: UIApplication) {
|
||||||
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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" : {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<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="10116" systemVersion="15E65" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="9wl-A7-LQ4">
|
||||||
<device id="retina4_7" orientation="portrait">
|
|
||||||
<adaptation id="fullscreen"/>
|
|
||||||
</device>
|
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="iOS"/>
|
<deployment identifier="iOS"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13772"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<scenes>
|
<scenes>
|
||||||
<!--Navigation Controller-->
|
<!--Navigation Controller-->
|
||||||
|
|
@ -14,9 +10,9 @@
|
||||||
<objects>
|
<objects>
|
||||||
<navigationController id="9wl-A7-LQ4" sceneMemberID="viewController">
|
<navigationController id="9wl-A7-LQ4" sceneMemberID="viewController">
|
||||||
<navigationBar key="navigationBar" contentMode="scaleToFill" id="yyl-ZQ-eby">
|
<navigationBar key="navigationBar" contentMode="scaleToFill" id="yyl-ZQ-eby">
|
||||||
<rect key="frame" x="0.0" y="20" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<color key="tintColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="tintColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
</navigationBar>
|
</navigationBar>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="oE2-vv-go7" kind="relationship" relationship="rootViewController" id="7GL-Am-OfG"/>
|
<segue destination="oE2-vv-go7" kind="relationship" relationship="rootViewController" id="7GL-Am-OfG"/>
|
||||||
|
|
@ -24,79 +20,79 @@
|
||||||
</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="-363" y="324"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Table View Controller-->
|
<!--Table View Controller-->
|
||||||
<scene sceneID="xmD-iM-370">
|
<scene sceneID="xmD-iM-370">
|
||||||
<objects>
|
<objects>
|
||||||
<tableViewController id="oE2-vv-go7" customClass="TableViewController" customModule="RMRPullToRefreshExample" customModuleProvider="target" sceneMemberID="viewController">
|
<tableViewController id="oE2-vv-go7" customClass="TableViewController" customModule="RMRPullToRefreshExample" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="C22-ld-kpl">
|
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="static" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="C22-ld-kpl">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="0.93725490199999995" green="0.93725490199999995" blue="0.95686274510000002" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<sections>
|
<sections>
|
||||||
<tableViewSection headerTitle="Perekrestok" id="OAd-tH-sE5">
|
<tableViewSection headerTitle="Perekrestok" id="OAd-tH-sE5">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Qw1-Fc-VoV" detailTextLabel="nOn-mL-Lrw" imageView="6OD-og-tgv" style="IBUITableViewCellStyleValue1" id="Ig2-F0-5fB">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Qw1-Fc-VoV" detailTextLabel="nOn-mL-Lrw" imageView="6OD-og-tgv" style="IBUITableViewCellStyleValue1" id="Ig2-F0-5fB">
|
||||||
<rect key="frame" x="0.0" y="55.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="113.5" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Ig2-F0-5fB" id="f8z-M3-Z4V">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Ig2-F0-5fB" id="f8z-M3-Z4V">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Perekrestok" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Qw1-Fc-VoV">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Perekrestok" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Qw1-Fc-VoV">
|
||||||
<rect key="frame" x="75" y="12" width="86.5" height="19.5"/>
|
<rect key="frame" x="74" y="12" width="86.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Top" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="nOn-mL-Lrw">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Top" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="nOn-mL-Lrw">
|
||||||
<rect key="frame" x="313" y="12" width="27" height="19.5"/>
|
<rect key="frame" x="537.5" y="12" width="27.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="perekrestok" id="6OD-og-tgv">
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="perekrestok" id="6OD-og-tgv">
|
||||||
<rect key="frame" x="16" y="0.0" width="44" height="43.5"/>
|
<rect key="frame" x="15" y="0.0" width="44" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="BYZ-38-t0r" kind="show" identifier="perekrestok_top" id="TFF-yS-c1s"/>
|
<segue destination="BYZ-38-t0r" kind="show" identifier="perekrestok_top" id="TFF-yS-c1s"/>
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="3b8-Kd-0Uw" detailTextLabel="U1K-Un-yBw" imageView="a26-Gq-xeL" style="IBUITableViewCellStyleValue1" id="EN2-bQ-yTK">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="3b8-Kd-0Uw" detailTextLabel="U1K-Un-yBw" imageView="a26-Gq-xeL" style="IBUITableViewCellStyleValue1" id="EN2-bQ-yTK">
|
||||||
<rect key="frame" x="0.0" y="99.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="157.5" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EN2-bQ-yTK" id="YBm-bQ-aP7">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="EN2-bQ-yTK" id="YBm-bQ-aP7">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Perekrestok" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="3b8-Kd-0Uw">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Perekrestok" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="3b8-Kd-0Uw">
|
||||||
<rect key="frame" x="75" y="12" width="86.5" height="19.5"/>
|
<rect key="frame" x="74" y="12" width="86.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Bottom" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="U1K-Un-yBw">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Bottom" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="U1K-Un-yBw">
|
||||||
<rect key="frame" x="287" y="12" width="53" height="19.5"/>
|
<rect key="frame" x="512" y="12" width="53" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="perekrestok" id="a26-Gq-xeL">
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="perekrestok" id="a26-Gq-xeL">
|
||||||
<rect key="frame" x="16" y="0.0" width="44" height="43.5"/>
|
<rect key="frame" x="15" y="0.0" width="44" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
</tableViewCellContentView>
|
</tableViewCellContentView>
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<connections>
|
<connections>
|
||||||
<segue destination="BYZ-38-t0r" kind="show" identifier="perekrestok_bottom" id="RNW-CJ-jxH"/>
|
<segue destination="BYZ-38-t0r" kind="show" identifier="perekrestok_bottom" id="RNW-CJ-jxH"/>
|
||||||
</connections>
|
</connections>
|
||||||
|
|
@ -106,28 +102,28 @@
|
||||||
<tableViewSection headerTitle="Beeline" id="Bp3-dz-9Zb">
|
<tableViewSection headerTitle="Beeline" id="Bp3-dz-9Zb">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="HlT-ZI-pLV" detailTextLabel="Sne-Dt-pmd" imageView="IEL-Td-m6Q" style="IBUITableViewCellStyleValue1" id="t3C-cF-xlh">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="HlT-ZI-pLV" detailTextLabel="Sne-Dt-pmd" imageView="IEL-Td-m6Q" style="IBUITableViewCellStyleValue1" id="t3C-cF-xlh">
|
||||||
<rect key="frame" x="0.0" y="199.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="251.5" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="t3C-cF-xlh" id="5E2-Ik-tgT">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="t3C-cF-xlh" id="5E2-Ik-tgT">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Beeline" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="HlT-ZI-pLV">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Beeline" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="HlT-ZI-pLV">
|
||||||
<rect key="frame" x="75" y="12" width="53.5" height="19.5"/>
|
<rect key="frame" x="74" y="12" width="53.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Top" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Sne-Dt-pmd">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Top" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Sne-Dt-pmd">
|
||||||
<rect key="frame" x="313" y="12" width="27" height="19.5"/>
|
<rect key="frame" x="537.5" y="12" width="27.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="beeline" id="IEL-Td-m6Q">
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="beeline" id="IEL-Td-m6Q">
|
||||||
<rect key="frame" x="16" y="0.0" width="44" height="43.5"/>
|
<rect key="frame" x="15" y="0.0" width="44" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
|
@ -137,28 +133,28 @@
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="uHd-tI-cbh" detailTextLabel="Nfu-Qc-1Gp" imageView="NLI-8k-jWy" style="IBUITableViewCellStyleValue1" id="Qxr-CU-ozv">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="uHd-tI-cbh" detailTextLabel="Nfu-Qc-1Gp" imageView="NLI-8k-jWy" style="IBUITableViewCellStyleValue1" id="Qxr-CU-ozv">
|
||||||
<rect key="frame" x="0.0" y="243.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="295.5" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Qxr-CU-ozv" id="LDM-NR-x0D">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Qxr-CU-ozv" id="LDM-NR-x0D">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Beeline" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="uHd-tI-cbh">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Beeline" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="uHd-tI-cbh">
|
||||||
<rect key="frame" x="75" y="12" width="53.5" height="19.5"/>
|
<rect key="frame" x="74" y="12" width="53.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Bottom" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Nfu-Qc-1Gp">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Bottom" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Nfu-Qc-1Gp">
|
||||||
<rect key="frame" x="287" y="12" width="53" height="19.5"/>
|
<rect key="frame" x="512" y="12" width="53" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="beeline" id="NLI-8k-jWy">
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="beeline" id="NLI-8k-jWy">
|
||||||
<rect key="frame" x="16" y="0.0" width="44" height="43.5"/>
|
<rect key="frame" x="15" y="0.0" width="44" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
|
@ -172,28 +168,28 @@
|
||||||
<tableViewSection headerTitle="Default" id="YNv-qE-Ndq">
|
<tableViewSection headerTitle="Default" id="YNv-qE-Ndq">
|
||||||
<cells>
|
<cells>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Hod-kU-jvC" detailTextLabel="MHK-Eb-EhW" imageView="LAe-1f-zZu" style="IBUITableViewCellStyleValue1" id="uGe-5R-mhz">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="Hod-kU-jvC" detailTextLabel="MHK-Eb-EhW" imageView="LAe-1f-zZu" style="IBUITableViewCellStyleValue1" id="uGe-5R-mhz">
|
||||||
<rect key="frame" x="0.0" y="343.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="389.5" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="uGe-5R-mhz" id="h7j-2o-NcK">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="uGe-5R-mhz" id="h7j-2o-NcK">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Redmadrobot" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Hod-kU-jvC">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Redmadrobot" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Hod-kU-jvC">
|
||||||
<rect key="frame" x="75" y="12" width="99" height="19.5"/>
|
<rect key="frame" x="74" y="12" width="99" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Top" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="MHK-Eb-EhW">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Top" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="MHK-Eb-EhW">
|
||||||
<rect key="frame" x="313" y="12" width="27" height="19.5"/>
|
<rect key="frame" x="537.5" y="12" width="27.5" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="redmadlogo-1" id="LAe-1f-zZu">
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="redmadlogo-1" id="LAe-1f-zZu">
|
||||||
<rect key="frame" x="16" y="0.0" width="44" height="43.5"/>
|
<rect key="frame" x="15" y="0.0" width="44" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
|
@ -203,28 +199,28 @@
|
||||||
</connections>
|
</connections>
|
||||||
</tableViewCell>
|
</tableViewCell>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="PEJ-1c-whb" detailTextLabel="cmt-br-dNG" imageView="1iM-wK-6Uf" style="IBUITableViewCellStyleValue1" id="Mlu-1N-6jM">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" textLabel="PEJ-1c-whb" detailTextLabel="cmt-br-dNG" imageView="1iM-wK-6Uf" style="IBUITableViewCellStyleValue1" id="Mlu-1N-6jM">
|
||||||
<rect key="frame" x="0.0" y="387.5" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="433.5" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Mlu-1N-6jM" id="Xfk-9c-f5n">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Mlu-1N-6jM" id="Xfk-9c-f5n">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="341" height="43.5"/>
|
<rect key="frame" x="0.0" y="0.0" width="567" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Redmadrobot" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="PEJ-1c-whb">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Redmadrobot" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="PEJ-1c-whb">
|
||||||
<rect key="frame" x="75" y="12" width="99" height="19.5"/>
|
<rect key="frame" x="74" y="12" width="99" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Bottom" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="cmt-br-dNG">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Bottom" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="cmt-br-dNG">
|
||||||
<rect key="frame" x="287" y="12" width="53" height="19.5"/>
|
<rect key="frame" x="512" y="12" width="53" height="19.5"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.5568627451" green="0.5568627451" blue="0.57647058819999997" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="redmadlogo-1" id="1iM-wK-6Uf">
|
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" image="redmadlogo-1" id="1iM-wK-6Uf">
|
||||||
<rect key="frame" x="16" y="0.0" width="44" height="43.5"/>
|
<rect key="frame" x="15" y="0.0" width="44" height="43.5"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</imageView>
|
</imageView>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
|
@ -245,7 +241,7 @@
|
||||||
</tableViewController>
|
</tableViewController>
|
||||||
<placeholder placeholderIdentifier="IBFirstResponder" id="2e9-Jk-9A8" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
<placeholder placeholderIdentifier="IBFirstResponder" id="2e9-Jk-9A8" userLabel="First Responder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="143" y="323"/>
|
<point key="canvasLocation" x="269" y="324"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--View Controller-->
|
<!--View Controller-->
|
||||||
<scene sceneID="tne-QT-ifu">
|
<scene sceneID="tne-QT-ifu">
|
||||||
|
|
@ -256,26 +252,26 @@
|
||||||
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
|
||||||
</layoutGuides>
|
</layoutGuides>
|
||||||
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="qa0-J0-SDd">
|
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="qa0-J0-SDd">
|
||||||
<rect key="frame" x="0.0" y="64" width="375" height="603"/>
|
<rect key="frame" x="0.0" y="64" width="600" height="536"/>
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<color key="separatorColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="separatorColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
<prototypes>
|
<prototypes>
|
||||||
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" misplaced="YES" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="pxY-0R-2l7" style="IBUITableViewCellStyleDefault" id="RzC-n2-Iry">
|
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="pxY-0R-2l7" style="IBUITableViewCellStyleDefault" id="RzC-n2-Iry">
|
||||||
<rect key="frame" x="0.0" y="28" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="28" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="RzC-n2-Iry" id="QD1-aM-jfC">
|
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="RzC-n2-Iry" id="QD1-aM-jfC">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
|
<rect key="frame" x="0.0" y="0.0" width="600" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="pxY-0R-2l7">
|
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="pxY-0R-2l7">
|
||||||
<rect key="frame" x="15" y="0.0" width="345" height="44"/>
|
<rect key="frame" x="15" y="0.0" width="570" height="44"/>
|
||||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||||
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
<fontDescription key="fontDescription" type="system" pointSize="16"/>
|
||||||
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<nil key="highlightedColor"/>
|
<nil key="highlightedColor"/>
|
||||||
</label>
|
</label>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
|
@ -288,7 +284,7 @@
|
||||||
</connections>
|
</connections>
|
||||||
</tableView>
|
</tableView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="qa0-J0-SDd" firstAttribute="top" secondItem="8bC-Xf-vdC" secondAttribute="top" constant="64" id="6Du-Fj-JAv"/>
|
<constraint firstItem="qa0-J0-SDd" firstAttribute="top" secondItem="8bC-Xf-vdC" secondAttribute="top" constant="64" id="6Du-Fj-JAv"/>
|
||||||
<constraint firstItem="qa0-J0-SDd" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="ONC-Bk-CbX"/>
|
<constraint firstItem="qa0-J0-SDd" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="ONC-Bk-CbX"/>
|
||||||
|
|
@ -315,7 +311,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>
|
||||||
|
|
|
||||||
|
|
@ -10,14 +10,14 @@ import UIKit
|
||||||
import RMRPullToRefresh
|
import RMRPullToRefresh
|
||||||
|
|
||||||
enum AnimationStage: Int {
|
enum AnimationStage: Int {
|
||||||
case stage1 // big medium small
|
case Stage1 // big medium small
|
||||||
case stage2 // big medium
|
case Stage2 // big medium
|
||||||
case stage3 // big
|
case Stage3 // big
|
||||||
case stage4 //
|
case Stage4 //
|
||||||
case stage5 // big
|
case Stage5 // big
|
||||||
case stage6 // big medium
|
case Stage6 // big medium
|
||||||
|
|
||||||
static var count: Int { return AnimationStage.stage6.hashValue + 1}
|
static var count: Int { return AnimationStage.Stage6.hashValue + 1}
|
||||||
}
|
}
|
||||||
|
|
||||||
class BeelineView: RMRPullToRefreshView {
|
class BeelineView: RMRPullToRefreshView {
|
||||||
|
|
@ -30,22 +30,22 @@ class BeelineView: RMRPullToRefreshView {
|
||||||
var animationStage: AnimationStage?
|
var animationStage: AnimationStage?
|
||||||
|
|
||||||
class func XIB_VIEW() -> BeelineView? {
|
class func XIB_VIEW() -> BeelineView? {
|
||||||
let subviewArray = Bundle.main.loadNibNamed("BeelineView", owner: self, options: nil)
|
let subviewArray = NSBundle.mainBundle().loadNibNamed("BeelineView", owner: self, options: nil)
|
||||||
return subviewArray?.first as? BeelineView
|
return subviewArray.first as? BeelineView
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
func hideBigIcons(_ hide: Bool) {
|
func hideBigIcons(hide: Bool) {
|
||||||
for iV in bigIcons { iV.isHidden = hide }
|
for iV in bigIcons { iV.hidden = hide }
|
||||||
}
|
}
|
||||||
|
|
||||||
func hideMediumIcons(_ hide: Bool) {
|
func hideMediumIcons(hide: Bool) {
|
||||||
for iV in mediumIcons { iV.isHidden = hide }
|
for iV in mediumIcons { iV.hidden = hide }
|
||||||
}
|
}
|
||||||
|
|
||||||
func hideSmallIcons(_ hide: Bool) {
|
func hideSmallIcons(hide: Bool) {
|
||||||
for iV in smallIcons { iV.isHidden = hide }
|
for iV in smallIcons { iV.hidden = hide }
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func executeAnimation() {
|
@objc func executeAnimation() {
|
||||||
|
|
@ -54,20 +54,20 @@ class BeelineView: RMRPullToRefreshView {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
hideBigIcons(animationStage == .stage4)
|
hideBigIcons(animationStage == .Stage4)
|
||||||
hideMediumIcons(animationStage == .stage3 || animationStage == .stage4 || animationStage == .stage5)
|
hideMediumIcons(animationStage == .Stage3 || animationStage == .Stage4 || animationStage == .Stage5)
|
||||||
hideSmallIcons(animationStage != .stage1)
|
hideSmallIcons(animationStage != .Stage1)
|
||||||
|
|
||||||
if let stage = animationStage {
|
if let stage = animationStage {
|
||||||
animationStage = AnimationStage(rawValue: (stage.rawValue+1)%AnimationStage.count)
|
animationStage = AnimationStage(rawValue: (stage.rawValue+1)%AnimationStage.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
perform(#selector(executeAnimation), with: nil, afterDelay: 0.4)
|
performSelector(#selector(executeAnimation), withObject: nil, afterDelay: 0.4)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - RMRPullToRefreshViewProtocol
|
// MARK: - RMRPullToRefreshViewProtocol
|
||||||
|
|
||||||
override func didChangeDraggingProgress(_ progress: CGFloat) {
|
override func didChangeDraggingProgress(progress: CGFloat) {
|
||||||
hideBigIcons(progress < 0.33)
|
hideBigIcons(progress < 0.33)
|
||||||
hideMediumIcons(progress < 0.66)
|
hideMediumIcons(progress < 0.66)
|
||||||
hideSmallIcons(progress < 0.99)
|
hideSmallIcons(progress < 0.99)
|
||||||
|
|
@ -75,11 +75,11 @@ class BeelineView: RMRPullToRefreshView {
|
||||||
|
|
||||||
override func beginLoadingAnimation() {
|
override func beginLoadingAnimation() {
|
||||||
animationIsCanceled = false
|
animationIsCanceled = false
|
||||||
animationStage = .stage1
|
animationStage = .Stage1
|
||||||
executeAnimation()
|
executeAnimation()
|
||||||
}
|
}
|
||||||
|
|
||||||
override func didEndLoadingAnimation(_ hidden: Bool) {
|
override func didEndLoadingAnimation(hidden: Bool) {
|
||||||
animationIsCanceled = true
|
animationIsCanceled = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,37 +16,37 @@ class PerekrestokView: RMRPullToRefreshView {
|
||||||
var fromValue: CGFloat = 0.0
|
var fromValue: CGFloat = 0.0
|
||||||
|
|
||||||
class func XIB_VIEW() -> PerekrestokView? {
|
class func XIB_VIEW() -> PerekrestokView? {
|
||||||
let subviewArray = Bundle.main.loadNibNamed("PerekrestokView", owner: self, options: nil)
|
let subviewArray = NSBundle.mainBundle().loadNibNamed("PerekrestokView", owner: self, options: nil)
|
||||||
return subviewArray?.first as? PerekrestokView
|
return subviewArray.first as? PerekrestokView
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
|
||||||
func angle(_ progress: CGFloat) -> CGFloat {
|
func angle(progress: CGFloat) -> CGFloat {
|
||||||
return -.pi/progress
|
return -CGFloat(M_PI)/progress
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - RMRPullToRefreshViewProtocol
|
// MARK: - RMRPullToRefreshViewProtocol
|
||||||
|
|
||||||
override func didChangeDraggingProgress(_ progress: CGFloat) {
|
override func didChangeDraggingProgress(progress: CGFloat) {
|
||||||
logoImageView.transform = CGAffineTransform(rotationAngle: angle(progress));
|
logoImageView.transform = CGAffineTransformMakeRotation(angle(progress));
|
||||||
}
|
}
|
||||||
|
|
||||||
override func prepareForLoadingAnimation(_ startProgress: CGFloat) {
|
override func prepareForLoadingAnimation(startProgress: CGFloat) {
|
||||||
fromValue = angle(startProgress)
|
fromValue = angle(startProgress)
|
||||||
}
|
}
|
||||||
|
|
||||||
override func beginLoadingAnimation() {
|
override func beginLoadingAnimation() {
|
||||||
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
|
let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation.z")
|
||||||
rotationAnimation.fromValue = fromValue
|
rotationAnimation.fromValue = fromValue
|
||||||
rotationAnimation.byValue = 2*Double.pi
|
rotationAnimation.byValue = 2*M_PI
|
||||||
rotationAnimation.duration = 0.9
|
rotationAnimation.duration = 0.9
|
||||||
rotationAnimation.repeatCount = HUGE
|
rotationAnimation.repeatCount = HUGE
|
||||||
|
|
||||||
self.logoImageView.layer.add(rotationAnimation, forKey: "transformAnimation")
|
self.logoImageView.layer.addAnimation(rotationAnimation, forKey: "transformAnimation")
|
||||||
}
|
}
|
||||||
|
|
||||||
override func didEndLoadingAnimation(_ hidden: Bool) {
|
override func didEndLoadingAnimation(hidden: Bool) {
|
||||||
self.logoImageView.layer.removeAnimation(forKey: "transformAnimation")
|
self.logoImageView.layer.removeAnimationForKey("transformAnimation")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,25 +8,26 @@
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
final class TableViewController: UITableViewController {
|
class TableViewController: UITableViewController {
|
||||||
|
|
||||||
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
|
|
||||||
super.prepare(for: segue, sender: sender)
|
|
||||||
|
|
||||||
if let identifier = segue.identifier, let controller = segue.destination as? ViewController {
|
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
|
||||||
|
super.prepareForSegue(segue, sender: sender)
|
||||||
|
|
||||||
|
if let identifier = segue.identifier, let controller = segue.destinationViewController as? ViewController {
|
||||||
switch identifier {
|
switch identifier {
|
||||||
case "perekrestok_top":
|
case "perekrestok_top":
|
||||||
controller.exampleType = .perekrestokTop
|
controller.exampleType = .PerekrestokTop
|
||||||
case "perekrestok_bottom":
|
case "perekrestok_bottom":
|
||||||
controller.exampleType = .perekrestokBottom
|
controller.exampleType = .PerekrestokBottom
|
||||||
case "beeline_top":
|
case "beeline_top":
|
||||||
controller.exampleType = .beelineTop
|
controller.exampleType = .BeelineTop
|
||||||
case "beeline_bottom":
|
case "beeline_bottom":
|
||||||
controller.exampleType = .beelineBottom
|
controller.exampleType = .BeelineBottom
|
||||||
case "redmadrobot_top":
|
case "redmadrobot_top":
|
||||||
controller.exampleType = .redmadrobotTop
|
controller.exampleType = .RedmadrobotTop
|
||||||
case "redmadrobot_bottom":
|
case "redmadrobot_bottom":
|
||||||
controller.exampleType = .redmadrobotBottom
|
controller.exampleType = .RedmadrobotBottom
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,56 +10,28 @@ import UIKit
|
||||||
import RMRPullToRefresh
|
import RMRPullToRefresh
|
||||||
|
|
||||||
public enum ExampleType: Int {
|
public enum ExampleType: Int {
|
||||||
case perekrestokTop
|
case PerekrestokTop
|
||||||
case perekrestokBottom
|
case PerekrestokBottom
|
||||||
case beelineTop
|
case BeelineTop
|
||||||
case beelineBottom
|
case BeelineBottom
|
||||||
case redmadrobotTop
|
case RedmadrobotTop
|
||||||
case redmadrobotBottom
|
case RedmadrobotBottom
|
||||||
}
|
}
|
||||||
|
|
||||||
final class ViewController: UIViewController {
|
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIActionSheetDelegate {
|
||||||
|
|
||||||
// MARK: - Public properties
|
|
||||||
|
|
||||||
var exampleType: ExampleType = .beelineBottom
|
|
||||||
|
|
||||||
// MARK: - Private properites
|
|
||||||
|
|
||||||
private var pullToRefresh: RMRPullToRefresh?
|
|
||||||
private let formatter = DateFormatter()
|
|
||||||
private var items: [String] = []
|
|
||||||
private var count = 2
|
|
||||||
private var result = RMRPullToRefreshResultType.success
|
|
||||||
|
|
||||||
// MARK: - IBOutlets
|
|
||||||
|
|
||||||
@IBOutlet weak var tableView: UITableView!
|
@IBOutlet weak var tableView: UITableView!
|
||||||
|
|
||||||
// MARK: - IBActions
|
var exampleType: ExampleType = .BeelineBottom
|
||||||
|
|
||||||
@IBAction func settings(_ sender: AnyObject) {
|
var pullToRefresh: RMRPullToRefresh?
|
||||||
let alertController = UIAlertController(title: "Result type", message: nil, preferredStyle: .actionSheet)
|
|
||||||
|
|
||||||
let successAction = UIAlertAction(title: "Success", style: .default) { _ in
|
let formatter = NSDateFormatter()
|
||||||
self.result = .noUpdates
|
|
||||||
}
|
|
||||||
alertController.addAction(successAction)
|
|
||||||
|
|
||||||
let noUpdatesAction = UIAlertAction(title: "No updates", style: .default) { _ in
|
var items: [String] = []
|
||||||
self.result = .noUpdates
|
var count = 2
|
||||||
}
|
|
||||||
alertController.addAction(noUpdatesAction)
|
|
||||||
|
|
||||||
let errorAction = UIAlertAction(title: "Error", style: .default) { _ in
|
var result = RMRPullToRefreshResultType.Success
|
||||||
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,10 +44,11 @@ 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(scrollView: tableView, position: position()) { [weak self] _ in
|
||||||
if self?.result == .success {
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(5.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {
|
||||||
|
if self?.result == .Success {
|
||||||
self?.loadMore()
|
self?.loadMore()
|
||||||
}
|
}
|
||||||
if let result = self?.result {
|
if let result = self?.result {
|
||||||
|
|
@ -84,91 +57,113 @@ final class ViewController: UIViewController {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
pullToRefresh?.height = 90.0
|
pullToRefresh?.height = 90.0
|
||||||
pullToRefresh?.backgroundColor = UIColor.white
|
pullToRefresh?.backgroundColor = UIColor.whiteColor()
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
}
|
}
|
||||||
return .bottom
|
return .Bottom
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Configure
|
// MARK: - Configure
|
||||||
|
|
||||||
private func someConfiguring() {
|
func someConfiguring() {
|
||||||
formatter.dateStyle = DateFormatter.Style.long
|
formatter.dateStyle = NSDateFormatterStyle.LongStyle
|
||||||
formatter.timeStyle = .medium
|
formatter.timeStyle = .MediumStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Action
|
||||||
|
|
||||||
|
|
||||||
|
@IBAction func settings(sender: AnyObject) {
|
||||||
|
UIActionSheet(title: "Result type", delegate: self, cancelButtonTitle: nil, destructiveButtonTitle: nil, otherButtonTitles: ".Success", ".NoUpdates", ".Error").showInView(self.view)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - UIActionSheetDelegate
|
||||||
|
|
||||||
|
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex 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.stringFromDate(NSDate()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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.stringFromDate(NSDate(timeIntervalSinceNow: 20)))
|
||||||
}
|
}
|
||||||
self.tableView.reloadData()
|
self.tableView.reloadData()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - UITableViewDataSource
|
// MARK: - TableView
|
||||||
extension ViewController: UITableViewDataSource {
|
|
||||||
|
|
||||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
|
||||||
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
|
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
|
||||||
cell.textLabel?.text = items[(indexPath as NSIndexPath).row]
|
cell.textLabel?.text = items[indexPath.row]
|
||||||
return cell
|
return cell
|
||||||
}
|
}
|
||||||
|
|
||||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||||
return items.count
|
return items.count
|
||||||
}
|
}
|
||||||
|
|
||||||
func numberOfSections(in tableView: UITableView) -> Int {
|
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,10 @@
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
2CEF3E7B42820531D2D97DCC /* Pods_RMRPullToRefreshExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4DF5731A80639276BB33DCA /* Pods_RMRPullToRefreshExample.framework */; };
|
|
||||||
8921D4F51CA425B4000D28E3 /* PerekrestokView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8921D4F41CA425B4000D28E3 /* PerekrestokView.swift */; };
|
8921D4F51CA425B4000D28E3 /* PerekrestokView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8921D4F41CA425B4000D28E3 /* PerekrestokView.swift */; };
|
||||||
8921D4F71CA425C0000D28E3 /* PerekrestokView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8921D4F61CA425C0000D28E3 /* PerekrestokView.xib */; };
|
8921D4F71CA425C0000D28E3 /* PerekrestokView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8921D4F61CA425C0000D28E3 /* PerekrestokView.xib */; };
|
||||||
8952BE3E1CBACA1D00D94689 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8952BE3D1CBACA1D00D94689 /* TableViewController.swift */; };
|
8952BE3E1CBACA1D00D94689 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8952BE3D1CBACA1D00D94689 /* TableViewController.swift */; };
|
||||||
|
89B014751CBAE22F002AB1B7 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89B014741CBAE22F002AB1B7 /* Pods.framework */; };
|
||||||
89B014771CBAE3D5002AB1B7 /* RMRPullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89B014761CBAE3D5002AB1B7 /* RMRPullToRefresh.framework */; };
|
89B014771CBAE3D5002AB1B7 /* RMRPullToRefresh.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 89B014761CBAE3D5002AB1B7 /* RMRPullToRefresh.framework */; };
|
||||||
89B06BF01CBA8A4900485A08 /* BeelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89B06BEF1CBA8A4900485A08 /* BeelineView.swift */; };
|
89B06BF01CBA8A4900485A08 /* BeelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89B06BEF1CBA8A4900485A08 /* BeelineView.swift */; };
|
||||||
89B06BF21CBA8B0700485A08 /* BeelineView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89B06BF11CBA8B0700485A08 /* BeelineView.xib */; };
|
89B06BF21CBA8B0700485A08 /* BeelineView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 89B06BF11CBA8B0700485A08 /* BeelineView.xib */; };
|
||||||
|
|
@ -22,11 +22,11 @@
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
51A8D36C5CCC1E18D2666CD6 /* Pods-RMRPullToRefreshExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RMRPullToRefreshExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RMRPullToRefreshExample/Pods-RMRPullToRefreshExample.debug.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
766D53F6605D8961328E54A1 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
|
766D53F6605D8961328E54A1 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
8921D4F41CA425B4000D28E3 /* PerekrestokView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerekrestokView.swift; sourceTree = "<group>"; };
|
8921D4F41CA425B4000D28E3 /* PerekrestokView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerekrestokView.swift; sourceTree = "<group>"; };
|
||||||
8921D4F61CA425C0000D28E3 /* PerekrestokView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PerekrestokView.xib; sourceTree = "<group>"; };
|
8921D4F61CA425C0000D28E3 /* PerekrestokView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PerekrestokView.xib; sourceTree = "<group>"; };
|
||||||
8952BE3D1CBACA1D00D94689 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
|
8952BE3D1CBACA1D00D94689 /* TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = "<group>"; };
|
||||||
|
89B014741CBAE22F002AB1B7 /* Pods.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Pods.framework; path = "../../../../Library/Developer/Xcode/DerivedData/RMRPullToRefresh-fwnpioedcaituoahusazwcgryphj/Build/Products/Debug-iphonesimulator/Pods.framework"; sourceTree = "<group>"; };
|
||||||
89B014761CBAE3D5002AB1B7 /* RMRPullToRefresh.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RMRPullToRefresh.framework; path = "../../../../Library/Developer/Xcode/DerivedData/RMRPullToRefresh-fwnpioedcaituoahusazwcgryphj/Build/Products/Debug-iphonesimulator/RMRPullToRefresh.framework"; sourceTree = "<group>"; };
|
89B014761CBAE3D5002AB1B7 /* RMRPullToRefresh.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RMRPullToRefresh.framework; path = "../../../../Library/Developer/Xcode/DerivedData/RMRPullToRefresh-fwnpioedcaituoahusazwcgryphj/Build/Products/Debug-iphonesimulator/RMRPullToRefresh.framework"; sourceTree = "<group>"; };
|
||||||
89B06BEF1CBA8A4900485A08 /* BeelineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeelineView.swift; sourceTree = "<group>"; };
|
89B06BEF1CBA8A4900485A08 /* BeelineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeelineView.swift; sourceTree = "<group>"; };
|
||||||
89B06BF11CBA8B0700485A08 /* BeelineView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BeelineView.xib; sourceTree = "<group>"; };
|
89B06BF11CBA8B0700485A08 /* BeelineView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = BeelineView.xib; sourceTree = "<group>"; };
|
||||||
|
|
@ -37,8 +37,6 @@
|
||||||
89CB123E1C9DA07B00048E46 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
89CB123E1C9DA07B00048E46 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||||
89CB12411C9DA07B00048E46 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
89CB12411C9DA07B00048E46 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||||
89CB12431C9DA07B00048E46 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
89CB12431C9DA07B00048E46 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
9373B01A0C7A0314295D05D2 /* Pods-RMRPullToRefreshExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RMRPullToRefreshExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-RMRPullToRefreshExample/Pods-RMRPullToRefreshExample.release.xcconfig"; sourceTree = "<group>"; };
|
|
||||||
A4DF5731A80639276BB33DCA /* Pods_RMRPullToRefreshExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RMRPullToRefreshExample.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
D48C26E126E3942BBDFD40CF /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
|
D48C26E126E3942BBDFD40CF /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
|
@ -48,7 +46,7 @@
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
89B014771CBAE3D5002AB1B7 /* RMRPullToRefresh.framework in Frameworks */,
|
89B014771CBAE3D5002AB1B7 /* RMRPullToRefresh.framework in Frameworks */,
|
||||||
2CEF3E7B42820531D2D97DCC /* Pods_RMRPullToRefreshExample.framework in Frameworks */,
|
89B014751CBAE22F002AB1B7 /* Pods.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
@ -60,8 +58,6 @@
|
||||||
children = (
|
children = (
|
||||||
766D53F6605D8961328E54A1 /* Pods.debug.xcconfig */,
|
766D53F6605D8961328E54A1 /* Pods.debug.xcconfig */,
|
||||||
D48C26E126E3942BBDFD40CF /* Pods.release.xcconfig */,
|
D48C26E126E3942BBDFD40CF /* Pods.release.xcconfig */,
|
||||||
51A8D36C5CCC1E18D2666CD6 /* Pods-RMRPullToRefreshExample.debug.xcconfig */,
|
|
||||||
9373B01A0C7A0314295D05D2 /* Pods-RMRPullToRefreshExample.release.xcconfig */,
|
|
||||||
);
|
);
|
||||||
name = Pods;
|
name = Pods;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -115,7 +111,7 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
89B014761CBAE3D5002AB1B7 /* RMRPullToRefresh.framework */,
|
89B014761CBAE3D5002AB1B7 /* RMRPullToRefresh.framework */,
|
||||||
A4DF5731A80639276BB33DCA /* Pods_RMRPullToRefreshExample.framework */,
|
89B014741CBAE22F002AB1B7 /* Pods.framework */,
|
||||||
);
|
);
|
||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
|
@ -127,11 +123,12 @@
|
||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 89CB12461C9DA07B00048E46 /* Build configuration list for PBXNativeTarget "RMRPullToRefreshExample" */;
|
buildConfigurationList = 89CB12461C9DA07B00048E46 /* Build configuration list for PBXNativeTarget "RMRPullToRefreshExample" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
00D4D85E4DF2FF039A017773 /* [CP] Check Pods Manifest.lock */,
|
00D4D85E4DF2FF039A017773 /* Check Pods Manifest.lock */,
|
||||||
89CB12301C9DA07B00048E46 /* Sources */,
|
89CB12301C9DA07B00048E46 /* Sources */,
|
||||||
89CB12311C9DA07B00048E46 /* Frameworks */,
|
89CB12311C9DA07B00048E46 /* Frameworks */,
|
||||||
89CB12321C9DA07B00048E46 /* Resources */,
|
89CB12321C9DA07B00048E46 /* Resources */,
|
||||||
2BE863C51DEA329C1234F1B0 /* [CP] Embed Pods Frameworks */,
|
2BE863C51DEA329C1234F1B0 /* Embed Pods Frameworks */,
|
||||||
|
C137BE069515EFF1A69455DF /* Copy Pods Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
|
|
@ -149,12 +146,11 @@
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastSwiftUpdateCheck = 0720;
|
LastSwiftUpdateCheck = 0720;
|
||||||
LastUpgradeCheck = 1000;
|
LastUpgradeCheck = 0720;
|
||||||
ORGANIZATIONNAME = "Merkulov Ilya";
|
ORGANIZATIONNAME = "Merkulov Ilya";
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
89CB12331C9DA07B00048E46 = {
|
89CB12331C9DA07B00048E46 = {
|
||||||
CreatedOnToolsVersion = 7.2.1;
|
CreatedOnToolsVersion = 7.2.1;
|
||||||
LastSwiftMigration = 0920;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
@ -192,40 +188,49 @@
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
00D4D85E4DF2FF039A017773 /* [CP] Check Pods Manifest.lock */ = {
|
00D4D85E4DF2FF039A017773 /* Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
|
||||||
"${PODS_ROOT}/Manifest.lock",
|
|
||||||
);
|
);
|
||||||
name = "[CP] Check Pods Manifest.lock";
|
name = "Check Pods Manifest.lock";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
"$(DERIVED_FILE_DIR)/Pods-RMRPullToRefreshExample-checkManifestLockResult.txt",
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
2BE863C51DEA329C1234F1B0 /* [CP] Embed Pods Frameworks */ = {
|
2BE863C51DEA329C1234F1B0 /* Embed Pods Frameworks */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
);
|
);
|
||||||
inputPaths = (
|
inputPaths = (
|
||||||
"${SRCROOT}/Pods/Target Support Files/Pods-RMRPullToRefreshExample/Pods-RMRPullToRefreshExample-frameworks.sh",
|
|
||||||
"${BUILT_PRODUCTS_DIR}/RMRPullToRefresh/RMRPullToRefresh.framework",
|
|
||||||
);
|
);
|
||||||
name = "[CP] Embed Pods Frameworks";
|
name = "Embed Pods Frameworks";
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RMRPullToRefresh.framework",
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-RMRPullToRefreshExample/Pods-RMRPullToRefreshExample-frameworks.sh\"\n";
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
C137BE069515EFF1A69455DF /* Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Copy Pods Resources";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
@ -273,23 +278,13 @@
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
|
@ -311,7 +306,7 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
|
|
@ -327,23 +322,13 @@
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
CLANG_WARN_COMMA = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
|
||||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
|
||||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
|
||||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
|
@ -359,43 +344,36 @@
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
|
|
||||||
VALIDATE_PRODUCT = YES;
|
VALIDATE_PRODUCT = YES;
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
89CB12471C9DA07B00048E46 /* Debug */ = {
|
89CB12471C9DA07B00048E46 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 51A8D36C5CCC1E18D2666CD6 /* Pods-RMRPullToRefreshExample.debug.xcconfig */;
|
baseConfigurationReference = 766D53F6605D8961328E54A1 /* Pods.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
DEVELOPMENT_TEAM = GMD7EK7S94;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||||
INFOPLIST_FILE = RMRPullToRefresh/Info.plist;
|
INFOPLIST_FILE = RMRPullToRefresh/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.RMRPullToRefresh;
|
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.RMRPullToRefresh;
|
||||||
PRODUCT_NAME = RMRPullToRefreshExample;
|
PRODUCT_NAME = RMRPullToRefreshExample;
|
||||||
SWIFT_VERSION = 4.2;
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
89CB12481C9DA07B00048E46 /* Release */ = {
|
89CB12481C9DA07B00048E46 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = 9373B01A0C7A0314295D05D2 /* Pods-RMRPullToRefreshExample.release.xcconfig */;
|
baseConfigurationReference = D48C26E126E3942BBDFD40CF /* Pods.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
DEVELOPMENT_TEAM = GMD7EK7S94;
|
|
||||||
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
FRAMEWORK_SEARCH_PATHS = "$(inherited)";
|
||||||
INFOPLIST_FILE = RMRPullToRefresh/Info.plist;
|
INFOPLIST_FILE = RMRPullToRefresh/Info.plist;
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.RMRPullToRefresh;
|
PRODUCT_BUNDLE_IDENTIFIER = com.redmadrobot.RMRPullToRefresh;
|
||||||
PRODUCT_NAME = RMRPullToRefreshExample;
|
PRODUCT_NAME = RMRPullToRefreshExample;
|
||||||
SWIFT_VERSION = 4.2;
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
17
LICENSE
17
LICENSE
|
|
@ -1,17 +0,0 @@
|
||||||
Copyright (c) 2016 Ilya Merkulov im@redmadrobot.com
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
150
README.md
150
README.md
|
|
@ -1,150 +0,0 @@
|
||||||
# RMRPullToRefresh
|
|
||||||
==
|
|
||||||
|
|
||||||
Репозиторий pull to refresh контрола для UIScrollView, UITableView, UICollectionView для платформы iOS.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<img src="https://dl.dropboxusercontent.com/u/69633554/RMRPullToRefresh/pullSuccessBottom.gif" width="262" height="468">
|
|
||||||
<img src="https://dl.dropboxusercontent.com/u/69633554/RMRPullToRefresh/pullNoUpdatesTop.gif" width="262" height="468">
|
|
||||||
<img src="https://dl.dropboxusercontent.com/u/69633554/RMRPullToRefresh/pullErrorTop.gif" width="262" height="468">
|
|
||||||
|
|
||||||
Как установить?
|
|
||||||
--------
|
|
||||||
|
|
||||||
`pod 'RMRPullToRefresh', :git => "git@git.redmadrobot.com:helper-ios/RMRPullToRefresh.git"`
|
|
||||||
|
|
||||||
Как добавить?
|
|
||||||
--------
|
|
||||||
|
|
||||||
```swift
|
|
||||||
import RMRPullToRefresh
|
|
||||||
|
|
||||||
var pullToRefresh: RMRPullToRefresh?
|
|
||||||
|
|
||||||
pullToRefresh = RMRPullToRefresh(scrollView: tableView,
|
|
||||||
position: .Top) { [weak self] _ in // .Top или .Bottom
|
|
||||||
// Загрузка данных
|
|
||||||
self?.service.load() { _ in
|
|
||||||
// Завершение загрузки
|
|
||||||
self?.pullToRefresh?.stopLoading()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Чтобы завершить анимацию, необходимо выполнить:
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.stopLoading() // Завершиться с результатом .Success
|
|
||||||
```
|
|
||||||
или
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.stopLoading(.Success) // .Success, .NoUpdates, .Error
|
|
||||||
```
|
|
||||||
|
|
||||||
Позиции
|
|
||||||
--------
|
|
||||||
```swift
|
|
||||||
public enum RMRPullToRefreshPosition: Int {
|
|
||||||
case Top // Для добавления контрола сверху скрола
|
|
||||||
case Bottom // Для добавления контроль снизу скрола
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Состояния
|
|
||||||
--------
|
|
||||||
```swift
|
|
||||||
public enum RMRPullToRefreshState: Int {
|
|
||||||
case Stopped // Нет скролинга, нет загрузки
|
|
||||||
case Dragging // Скролинг
|
|
||||||
case Loading // Загрузка
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Тип результата
|
|
||||||
--------
|
|
||||||
```swift
|
|
||||||
public enum RMRPullToRefreshResultType: Int {
|
|
||||||
case Success // Загрузка завершилась успешно и есть обновления
|
|
||||||
case NoUpdates // Загрузка завершилась успешно, но обновлений нет
|
|
||||||
case Error // Загрузка завершилась с ошибкой
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Как кастомизировать?
|
|
||||||
--------
|
|
||||||
|
|
||||||
Существует два метода для конфигурации кастомных view:
|
|
||||||
```swift
|
|
||||||
func configureView(view :RMRPullToRefreshView, state:RMRPullToRefreshState, result:RMRPullToRefreshResultType)
|
|
||||||
```
|
|
||||||
|
|
||||||
```swift
|
|
||||||
func configureView(view :RMRPullToRefreshView, result:RMRPullToRefreshResultType) // Будет сконфигурировано для состояний .Loading, .Dragging и .Stopped
|
|
||||||
```
|
|
||||||
|
|
||||||
Пример:
|
|
||||||
```swift
|
|
||||||
// Конфигурируем view для состояний .Dragging и .Loading для результата .Success
|
|
||||||
if let pullToRefreshView = BeelineView.XIB_VIEW() {
|
|
||||||
pullToRefresh?.configureView(pullToRefreshView, state: .Dragging, result: .Success)
|
|
||||||
pullToRefresh?.configureView(pullToRefreshView, state: .Loading, result: .Success)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Кастомная view должна наследоваться от класса RMRPullToRefreshView и для анимирования должны быть реализованы методы протокола RMRPullToRefreshViewProtocol:
|
|
||||||
|
|
||||||
```swift
|
|
||||||
// Подготовка к анимации загрузки
|
|
||||||
// Вызываться перед beginLoadingAnimation()
|
|
||||||
public func prepareForLoadingAnimation(startProgress: CGFloat) {}
|
|
||||||
|
|
||||||
// Начало анимации
|
|
||||||
public func beginLoadingAnimation() {}
|
|
||||||
|
|
||||||
// Завершение анимации
|
|
||||||
// Будет вызываться сразу после завершения загрузки
|
|
||||||
public func willEndLoadingAnimation() {}
|
|
||||||
|
|
||||||
// Завершение анимации
|
|
||||||
// Будет вызывать через время, равное hideDelay после завершения загрузки
|
|
||||||
// @param hidden - флаг будет скрыт контрол или нет после завершения анимации
|
|
||||||
public func didEndLoadingAnimation(hidden: Bool) {}
|
|
||||||
|
|
||||||
// Изменения прогресса скролинга
|
|
||||||
public func didChangeDraggingProgress(progress: CGFloat) {}
|
|
||||||
```
|
|
||||||
|
|
||||||
Настройки
|
|
||||||
--------
|
|
||||||
|
|
||||||
|
|
||||||
Для задания RedMadRobot дизайна:
|
|
||||||
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.setupDefaultSettings()
|
|
||||||
```
|
|
||||||
|
|
||||||
Изменить высоту (по умолчанию 90.0):
|
|
||||||
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.height = 70.0
|
|
||||||
```
|
|
||||||
|
|
||||||
Изменить цвет бэкграунда (по умолчанию whiteColor()):
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.backgroundColor = UIColor(red: 16.0/255.0,
|
|
||||||
green: 192.0/255.0,
|
|
||||||
blue: 119.0/255.0,
|
|
||||||
alpha: 1.0)
|
|
||||||
```
|
|
||||||
Для задания времени закрытия контрола (по умолчанию 0.0):
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.setHideDelay(5.0, result: .Success) // .Success, .NoUpdates, .Error
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
Если не хотим скрывать контрол с ошибкой (не забудьте установить view для .Error):
|
|
||||||
```swift
|
|
||||||
pullToRefresh?.hideWhenError = false
|
|
||||||
```
|
|
||||||
<img src="https://dl.dropboxusercontent.com/u/69633554/RMRPullToRefresh/pullErrorTopNoHide.gif" width="262" height="468">
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
Pod::Spec.new do |spec|
|
Pod::Spec.new do |spec|
|
||||||
spec.name = "RMRPullToRefresh"
|
spec.name = "RMRPullToRefresh"
|
||||||
spec.version = "0.8.0"
|
spec.version = "0.1"
|
||||||
spec.platform = :ios, "9.0"
|
spec.platform = :ios, "8.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)"
|
||||||
spec.homepage = "http://redmadrobot.com/"
|
spec.homepage = "http://redmadrobot.com/"
|
||||||
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/im/RMRPullToRefresh", :tag => "v0.1" }
|
||||||
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
|
||||||
Loading…
Reference in New Issue