diff --git a/MJRefresh-Bridge-header.h b/MJRefresh-Bridge-header.h index d08fd6c..bebf0b6 100644 --- a/MJRefresh-Bridge-header.h +++ b/MJRefresh-Bridge-header.h @@ -8,6 +8,6 @@ #ifndef MJRefresh_Bridge_header_h #define MJRefresh_Bridge_header_h - +#import "MJRefresh.h" #endif /* MJRefresh_Bridge_header_h */ diff --git a/MJRefresh/Base/MJRefreshAutoFooter.h b/MJRefresh/Base/MJRefreshAutoFooter.h new file mode 100755 index 0000000..5aac4f6 --- /dev/null +++ b/MJRefresh/Base/MJRefreshAutoFooter.h @@ -0,0 +1,20 @@ +// +// MJRefreshAutoFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshFooter.h" + +@interface MJRefreshAutoFooter : MJRefreshFooter +/** 是否自动刷新(默认为YES) */ +@property (assign, nonatomic, getter=isAutomaticallyRefresh) BOOL automaticallyRefresh; + +/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ +@property (assign, nonatomic) CGFloat appearencePercentTriggerAutoRefresh MJRefreshDeprecated("请使用automaticallyChangeAlpha属性"); + +/** 当底部控件出现多少时就自动刷新(默认为1.0,也就是底部控件完全出现时,才会自动刷新) */ +@property (assign, nonatomic) CGFloat triggerAutomaticallyRefreshPercent; +@end diff --git a/MJRefresh/Base/MJRefreshAutoFooter.m b/MJRefresh/Base/MJRefreshAutoFooter.m new file mode 100755 index 0000000..fd1687f --- /dev/null +++ b/MJRefresh/Base/MJRefreshAutoFooter.m @@ -0,0 +1,133 @@ +// +// MJRefreshAutoFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoFooter.h" + +@interface MJRefreshAutoFooter() +@end + +@implementation MJRefreshAutoFooter + +#pragma mark - 初始化 +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + if (newSuperview) { // 新的父控件 + if (self.hidden == NO) { + self.scrollView.mj_insetB += self.mj_h; + } + + // 设置位置 + self.mj_y = _scrollView.mj_contentH; + } else { // 被移除了 + if (self.hidden == NO) { + self.scrollView.mj_insetB -= self.mj_h; + } + } +} + +#pragma mark - 过期方法 +- (void)setAppearencePercentTriggerAutoRefresh:(CGFloat)appearencePercentTriggerAutoRefresh +{ + self.triggerAutomaticallyRefreshPercent = appearencePercentTriggerAutoRefresh; +} + +- (CGFloat)appearencePercentTriggerAutoRefresh +{ + return self.triggerAutomaticallyRefreshPercent; +} + +#pragma mark - 实现父类的方法 +- (void)prepare +{ + [super prepare]; + + // 默认底部控件100%出现时才会自动刷新 + self.triggerAutomaticallyRefreshPercent = 1.0; + + // 设置为默认状态 + self.automaticallyRefresh = YES; +} + +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change +{ + [super scrollViewContentSizeDidChange:change]; + + // 设置位置 + self.mj_y = self.scrollView.mj_contentH; +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change +{ + [super scrollViewContentOffsetDidChange:change]; + + if (self.state != MJRefreshStateIdle || !self.automaticallyRefresh || self.mj_y == 0) return; + + if (_scrollView.mj_insetT + _scrollView.mj_contentH > _scrollView.mj_h) { // 内容超过一个屏幕 + // 这里的_scrollView.mj_contentH替换掉self.mj_y更为合理 + if (_scrollView.mj_offsetY >= _scrollView.mj_contentH - _scrollView.mj_h + self.mj_h * self.triggerAutomaticallyRefreshPercent + _scrollView.mj_insetB - self.mj_h) { + // 防止手松开时连续调用 + CGPoint old = [change[@"old"] CGPointValue]; + CGPoint new = [change[@"new"] CGPointValue]; + if (new.y <= old.y) return; + + // 当底部刷新控件完全出现时,才刷新 + [self beginRefreshing]; + } + } +} + +- (void)scrollViewPanStateDidChange:(NSDictionary *)change +{ + [super scrollViewPanStateDidChange:change]; + + if (self.state != MJRefreshStateIdle) return; + + if (_scrollView.panGestureRecognizer.state == UIGestureRecognizerStateEnded) {// 手松开 + if (_scrollView.mj_insetT + _scrollView.mj_contentH <= _scrollView.mj_h) { // 不够一个屏幕 + if (_scrollView.mj_offsetY >= - _scrollView.mj_insetT) { // 向上拽 + [self beginRefreshing]; + } + } else { // 超出一个屏幕 + if (_scrollView.mj_offsetY >= _scrollView.mj_contentH + _scrollView.mj_insetB - _scrollView.mj_h) { + [self beginRefreshing]; + } + } + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + if (state == MJRefreshStateRefreshing) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self executeRefreshingCallback]; + }); + } +} + +- (void)setHidden:(BOOL)hidden +{ + BOOL lastHidden = self.isHidden; + + [super setHidden:hidden]; + + if (!lastHidden && hidden) { + self.state = MJRefreshStateIdle; + + self.scrollView.mj_insetB -= self.mj_h; + } else if (lastHidden && !hidden) { + self.scrollView.mj_insetB += self.mj_h; + + // 设置位置 + self.mj_y = _scrollView.mj_contentH; + } +} +@end diff --git a/MJRefresh/Base/MJRefreshBackFooter.h b/MJRefresh/Base/MJRefreshBackFooter.h new file mode 100755 index 0000000..347083c --- /dev/null +++ b/MJRefresh/Base/MJRefreshBackFooter.h @@ -0,0 +1,13 @@ +// +// MJRefreshBackFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshFooter.h" + +@interface MJRefreshBackFooter : MJRefreshFooter + +@end diff --git a/MJRefresh/Base/MJRefreshBackFooter.m b/MJRefresh/Base/MJRefreshBackFooter.m new file mode 100755 index 0000000..c3d0db6 --- /dev/null +++ b/MJRefresh/Base/MJRefreshBackFooter.m @@ -0,0 +1,166 @@ +// +// MJRefreshBackFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackFooter.h" + +@interface MJRefreshBackFooter() +@property (assign, nonatomic) NSInteger lastRefreshCount; +@property (assign, nonatomic) CGFloat lastBottomDelta; +@end + +@implementation MJRefreshBackFooter + +#pragma mark - 初始化 +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + [self scrollViewContentSizeDidChange:nil]; +} + +#pragma mark - 实现父类的方法 +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change +{ + [super scrollViewContentOffsetDidChange:change]; + + // 如果正在刷新,直接返回 + if (self.state == MJRefreshStateRefreshing) return; + + _scrollViewOriginalInset = self.scrollView.contentInset; + + // 当前的contentOffset + CGFloat currentOffsetY = self.scrollView.mj_offsetY; + // 尾部控件刚好出现的offsetY + CGFloat happenOffsetY = [self happenOffsetY]; + // 如果是向下滚动到看不见尾部控件,直接返回 + if (currentOffsetY <= happenOffsetY) return; + + CGFloat pullingPercent = (currentOffsetY - happenOffsetY) / self.mj_h; + + // 如果已全部加载,仅设置pullingPercent,然后返回 + if (self.state == MJRefreshStateNoMoreData) { + self.pullingPercent = pullingPercent; + return; + } + + if (self.scrollView.isDragging) { + self.pullingPercent = pullingPercent; + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetY = happenOffsetY + self.mj_h; + + if (self.state == MJRefreshStateIdle && currentOffsetY > normal2pullingOffsetY) { + // 转为即将刷新状态 + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && currentOffsetY <= normal2pullingOffsetY) { + // 转为普通状态 + self.state = MJRefreshStateIdle; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + [self beginRefreshing]; + } else if (pullingPercent < 1) { + self.pullingPercent = pullingPercent; + } +} + +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change +{ + [super scrollViewContentSizeDidChange:change]; + + // 内容的高度 + CGFloat contentHeight = self.scrollView.mj_contentH + self.ignoredScrollViewContentInsetBottom; + // 表格的高度 + CGFloat scrollHeight = self.scrollView.mj_h - self.scrollViewOriginalInset.top - self.scrollViewOriginalInset.bottom + self.ignoredScrollViewContentInsetBottom; + // 设置位置和尺寸 + self.mj_y = MAX(contentHeight, scrollHeight); +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态来设置属性 + if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + // 刷新完毕 + if (MJRefreshStateRefreshing == oldState) { + [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ + self.scrollView.mj_insetB -= self.lastBottomDelta; + + // 自动调整透明度 + if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; + } completion:^(BOOL finished) { + self.pullingPercent = 0.0; + }]; + } + + CGFloat deltaH = [self heightForContentBreakView]; + // 刚刷新完毕 + if (MJRefreshStateRefreshing == oldState && deltaH > 0 && self.scrollView.totalDataCount != self.lastRefreshCount) { + self.scrollView.mj_offsetY = self.scrollView.mj_offsetY; + } + } else if (state == MJRefreshStateRefreshing) { + // 记录刷新前的数量 + self.lastRefreshCount = self.scrollView.totalDataCount; + + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + CGFloat bottom = self.mj_h + self.scrollViewOriginalInset.bottom; + CGFloat deltaH = [self heightForContentBreakView]; + if (deltaH < 0) { // 如果内容高度小于view的高度 + bottom -= deltaH; + } + self.lastBottomDelta = bottom - self.scrollView.mj_insetB; + self.scrollView.mj_insetB = bottom; + self.scrollView.mj_offsetY = [self happenOffsetY] + self.mj_h; + } completion:^(BOOL finished) { + [self executeRefreshingCallback]; + }]; + } +} + +#pragma mark - 公共方法 +- (void)endRefreshing +{ + if ([self.scrollView isKindOfClass:[UICollectionView class]]) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [super endRefreshing]; + }); + } else { + [super endRefreshing]; + } +} + +- (void)noticeNoMoreData +{ + if ([self.scrollView isKindOfClass:[UICollectionView class]]) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [super noticeNoMoreData]; + }); + } else { + [super noticeNoMoreData]; + } +} + +#pragma mark - 私有方法 +#pragma mark 获得scrollView的内容 超出 view 的高度 +- (CGFloat)heightForContentBreakView +{ + CGFloat h = self.scrollView.frame.size.height - self.scrollViewOriginalInset.bottom - self.scrollViewOriginalInset.top; + return self.scrollView.contentSize.height - h; +} + +#pragma mark 刚好看到上拉刷新控件时的contentOffset.y +- (CGFloat)happenOffsetY +{ + CGFloat deltaH = [self heightForContentBreakView]; + if (deltaH > 0) { + return deltaH - self.scrollViewOriginalInset.top; + } else { + return - self.scrollViewOriginalInset.top; + } +} +@end diff --git a/MJRefresh/Base/MJRefreshComponent.h b/MJRefresh/Base/MJRefreshComponent.h new file mode 100755 index 0000000..4581dde --- /dev/null +++ b/MJRefresh/Base/MJRefreshComponent.h @@ -0,0 +1,93 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// MJRefreshComponent.h +// MJRefreshExample +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 刷新控件的基类 + +#import +#import "MJRefreshConst.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +/** 刷新控件的状态 */ +typedef enum { + /** 普通闲置状态 */ + MJRefreshStateIdle = 1, + /** 松开就可以进行刷新的状态 */ + MJRefreshStatePulling, + /** 正在刷新中的状态 */ + MJRefreshStateRefreshing, + /** 即将刷新的状态 */ + MJRefreshStateWillRefresh, + /** 所有数据加载完毕,没有更多的数据了 */ + MJRefreshStateNoMoreData +} MJRefreshState; + +/** 进入刷新状态的回调 */ +typedef void (^MJRefreshComponentRefreshingBlock)(); + +/** 刷新控件的基类 */ +@interface MJRefreshComponent : UIView +{ + /** 记录scrollView刚开始的inset */ + UIEdgeInsets _scrollViewOriginalInset; + /** 父控件 */ + __weak UIScrollView *_scrollView; +} +#pragma mark - 刷新回调 +/** 正在刷新的回调 */ +@property (copy, nonatomic) MJRefreshComponentRefreshingBlock refreshingBlock; +/** 设置回调对象和回调方法 */ +- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action; +/** 回调对象 */ +@property (weak, nonatomic) id refreshingTarget; +/** 回调方法 */ +@property (assign, nonatomic) SEL refreshingAction; +/** 触发回调(交给子类去调用) */ +- (void)executeRefreshingCallback; + +#pragma mark - 刷新状态控制 +/** 进入刷新状态 */ +- (void)beginRefreshing; +/** 结束刷新状态 */ +- (void)endRefreshing; +/** 是否正在刷新 */ +- (BOOL)isRefreshing; +/** 刷新状态 一般交给子类内部实现 */ +@property (assign, nonatomic) MJRefreshState state; + +#pragma mark - 交给子类去访问 +/** 记录scrollView刚开始的inset */ +@property (assign, nonatomic, readonly) UIEdgeInsets scrollViewOriginalInset; +/** 父控件 */ +@property (weak, nonatomic, readonly) UIScrollView *scrollView; + +#pragma mark - 交给子类们去实现 +/** 初始化 */ +- (void)prepare; +/** 摆放子控件frame */ +- (void)placeSubviews; +/** 当scrollView的contentOffset发生改变的时候调用 */ +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change; +/** 当scrollView的contentSize发生改变的时候调用 */ +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change; +/** 当scrollView的拖拽状态发生改变的时候调用 */ +- (void)scrollViewPanStateDidChange:(NSDictionary *)change; + + +#pragma mark - 其他 +/** 拉拽的百分比(交给子类重写) */ +@property (assign, nonatomic) CGFloat pullingPercent; +/** 根据拖拽比例自动切换透明度 */ +@property (assign, nonatomic, getter=isAutoChangeAlpha) BOOL autoChangeAlpha MJRefreshDeprecated("请使用automaticallyChangeAlpha属性"); +/** 根据拖拽比例自动切换透明度 */ +@property (assign, nonatomic, getter=isAutomaticallyChangeAlpha) BOOL automaticallyChangeAlpha; +@end + +@interface UILabel(MJRefresh) ++ (instancetype)label; +@end diff --git a/MJRefresh/Base/MJRefreshComponent.m b/MJRefresh/Base/MJRefreshComponent.m new file mode 100755 index 0000000..1b6ea27 --- /dev/null +++ b/MJRefresh/Base/MJRefreshComponent.m @@ -0,0 +1,226 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// MJRefreshComponent.m +// MJRefreshExample +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshComponent.h" +#import "MJRefreshConst.h" +#import "UIView+MJExtension.h" +#import "UIScrollView+MJRefresh.h" + +@interface MJRefreshComponent() +@property (strong, nonatomic) UIPanGestureRecognizer *pan; +@end + +@implementation MJRefreshComponent +#pragma mark - 初始化 +- (instancetype)initWithFrame:(CGRect)frame +{ + if (self = [super initWithFrame:frame]) { + // 准备工作 + [self prepare]; + + // 默认是普通状态 + self.state = MJRefreshStateIdle; + } + return self; +} + +- (void)prepare +{ + // 基本属性 + self.autoresizingMask = UIViewAutoresizingFlexibleWidth; + self.backgroundColor = [UIColor clearColor]; +} + +- (void)layoutSubviews +{ + [super layoutSubviews]; + + [self placeSubviews]; +} + +- (void)placeSubviews{} + +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + // 如果不是UIScrollView,不做任何事情 + if (newSuperview && ![newSuperview isKindOfClass:[UIScrollView class]]) return; + + // 旧的父控件移除监听 + [self removeObservers]; + + if (newSuperview) { // 新的父控件 + // 设置宽度 + self.mj_w = newSuperview.mj_w; + // 设置位置 + self.mj_x = 0; + + // 记录UIScrollView + _scrollView = (UIScrollView *)newSuperview; + // 设置永远支持垂直弹簧效果 + _scrollView.alwaysBounceVertical = YES; + // 记录UIScrollView最开始的contentInset + _scrollViewOriginalInset = _scrollView.contentInset; + + // 添加监听 + [self addObservers]; + } +} + +- (void)drawRect:(CGRect)rect +{ + [super drawRect:rect]; + + if (self.state == MJRefreshStateWillRefresh) { + // 预防view还没显示出来就调用了beginRefreshing + self.state = MJRefreshStateRefreshing; + } +} + +#pragma mark - KVO监听 +- (void)addObservers +{ + NSKeyValueObservingOptions options = NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld; + [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentOffset options:options context:nil]; + [self.scrollView addObserver:self forKeyPath:MJRefreshKeyPathContentSize options:options context:nil]; + self.pan = self.scrollView.panGestureRecognizer; + [self.pan addObserver:self forKeyPath:MJRefreshKeyPathPanState options:options context:nil]; +} + +- (void)removeObservers +{ + [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentOffset]; + [self.superview removeObserver:self forKeyPath:MJRefreshKeyPathContentSize];; + [self.pan removeObserver:self forKeyPath:MJRefreshKeyPathPanState]; + self.pan = nil; +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + // 遇到这些情况就直接返回 + if (!self.userInteractionEnabled) return; + + // 这个就算看不见也需要处理 + if ([keyPath isEqualToString:MJRefreshKeyPathContentSize]) { + [self scrollViewContentSizeDidChange:change]; + } + + // 看不见 + if (self.hidden) return; + if ([keyPath isEqualToString:MJRefreshKeyPathContentOffset]) { + [self scrollViewContentOffsetDidChange:change]; + } else if ([keyPath isEqualToString:MJRefreshKeyPathPanState]) { + [self scrollViewPanStateDidChange:change]; + } +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change{} +- (void)scrollViewContentSizeDidChange:(NSDictionary *)change{} +- (void)scrollViewPanStateDidChange:(NSDictionary *)change{} + +#pragma mark - 公共方法 +#pragma mark 设置回调对象和回调方法 +- (void)setRefreshingTarget:(id)target refreshingAction:(SEL)action +{ + self.refreshingTarget = target; + self.refreshingAction = action; +} + +#pragma mark 进入刷新状态 +- (void)beginRefreshing +{ + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.alpha = 1.0; + }]; + self.pullingPercent = 1.0; + // 只要正在刷新,就完全显示 + if (self.window) { + self.state = MJRefreshStateRefreshing; + } else { + self.state = MJRefreshStateWillRefresh; + // 刷新(预防从另一个控制器回到这个控制器的情况,回来要重新刷新一下) + [self setNeedsDisplay]; + } +} + +#pragma mark 结束刷新状态 +- (void)endRefreshing +{ + self.state = MJRefreshStateIdle; +} + +#pragma mark 是否正在刷新 +- (BOOL)isRefreshing +{ + return self.state == MJRefreshStateRefreshing || self.state == MJRefreshStateWillRefresh; +} + +#pragma mark 自动切换透明度 +- (void)setAutoChangeAlpha:(BOOL)autoChangeAlpha +{ + self.automaticallyChangeAlpha = autoChangeAlpha; +} + +- (BOOL)isAutoChangeAlpha +{ + return self.isAutomaticallyChangeAlpha; +} + +- (void)setAutomaticallyChangeAlpha:(BOOL)automaticallyChangeAlpha +{ + _automaticallyChangeAlpha = automaticallyChangeAlpha; + + if (self.isRefreshing) return; + + if (automaticallyChangeAlpha) { + self.alpha = self.pullingPercent; + } else { + self.alpha = 1.0; + } +} + +#pragma mark 根据拖拽进度设置透明度 +- (void)setPullingPercent:(CGFloat)pullingPercent +{ + _pullingPercent = pullingPercent; + + if (self.isRefreshing) return; + + if (self.isAutomaticallyChangeAlpha) { + self.alpha = pullingPercent; + } +} + +#pragma mark - 内部方法 +- (void)executeRefreshingCallback +{ + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.refreshingBlock) { + self.refreshingBlock(); + } + if ([self.refreshingTarget respondsToSelector:self.refreshingAction]) { + MJRefreshMsgSend(MJRefreshMsgTarget(self.refreshingTarget), self.refreshingAction, self); + } + }); +} +@end + +@implementation UILabel(MJRefresh) ++ (instancetype)label +{ + UILabel *label = [[self alloc] init]; + label.font = MJRefreshLabelFont; + label.textColor = MJRefreshLabelTextColor; + label.autoresizingMask = UIViewAutoresizingFlexibleWidth; + label.textAlignment = NSTextAlignmentCenter; + label.backgroundColor = [UIColor clearColor]; + return label; +} +@end \ No newline at end of file diff --git a/MJRefresh/Base/MJRefreshFooter.h b/MJRefresh/Base/MJRefreshFooter.h new file mode 100755 index 0000000..ccce604 --- /dev/null +++ b/MJRefresh/Base/MJRefreshFooter.h @@ -0,0 +1,28 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// MJRefreshFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/3/5. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 上拉刷新控件 + +#import "MJRefreshComponent.h" + +@interface MJRefreshFooter : MJRefreshComponent +/** 创建footer */ ++ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock; +/** 创建footer */ ++ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 提示没有更多的数据 */ +- (void)noticeNoMoreData; +/** 重置没有更多的数据(消除没有更多数据的状态) */ +- (void)resetNoMoreData; + +/** 忽略多少scrollView的contentInset的bottom */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetBottom; + +/** 自动根据有无数据来显示和隐藏(有数据就显示,没有数据隐藏) */ +@property (assign, nonatomic, getter=isAutomaticallyHidden) BOOL automaticallyHidden; +@end diff --git a/MJRefresh/Base/MJRefreshFooter.m b/MJRefresh/Base/MJRefreshFooter.m new file mode 100755 index 0000000..fb57044 --- /dev/null +++ b/MJRefresh/Base/MJRefreshFooter.m @@ -0,0 +1,67 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// MJRefreshFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/3/5. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshFooter.h" + +@interface MJRefreshFooter() + +@end + +@implementation MJRefreshFooter +#pragma mark - 构造方法 ++ (instancetype)footerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock +{ + MJRefreshFooter *cmp = [[self alloc] init]; + cmp.refreshingBlock = refreshingBlock; + return cmp; +} ++ (instancetype)footerWithRefreshingTarget:(id)target refreshingAction:(SEL)action +{ + MJRefreshFooter *cmp = [[self alloc] init]; + [cmp setRefreshingTarget:target refreshingAction:action]; + return cmp; +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + // 设置自己的高度 + self.mj_h = MJRefreshFooterHeight; + + // 默认是自动隐藏 + self.automaticallyHidden = YES; +} + +- (void)willMoveToSuperview:(UIView *)newSuperview +{ + [super willMoveToSuperview:newSuperview]; + + if (newSuperview) { + // 监听scrollView数据的变化 + [self.scrollView setReloadDataBlock:^(NSInteger totalDataCount) { + if (self.isAutomaticallyHidden) { + self.hidden = (totalDataCount == 0); + } + }]; + } +} + +#pragma mark - 公共方法 +- (void)noticeNoMoreData +{ + self.state = MJRefreshStateNoMoreData; +} + +- (void)resetNoMoreData +{ + self.state = MJRefreshStateIdle; +} +@end diff --git a/MJRefresh/Base/MJRefreshHeader.h b/MJRefresh/Base/MJRefreshHeader.h new file mode 100755 index 0000000..0816024 --- /dev/null +++ b/MJRefresh/Base/MJRefreshHeader.h @@ -0,0 +1,25 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// MJRefreshHeader.h +// MJRefreshExample +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 下拉刷新控件:负责监控用户下拉的状态 + +#import "MJRefreshComponent.h" + +@interface MJRefreshHeader : MJRefreshComponent +/** 创建header */ ++ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock; +/** 创建header */ ++ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action; + +/** 这个key用来存储上一次下拉刷新成功的时间 */ +@property (copy, nonatomic) NSString *lastUpdatedTimeKey; +/** 上一次下拉刷新成功的时间 */ +@property (strong, nonatomic, readonly) NSDate *lastUpdatedTime; + +/** 忽略多少scrollView的contentInset的top */ +@property (assign, nonatomic) CGFloat ignoredScrollViewContentInsetTop; +@end diff --git a/MJRefresh/Base/MJRefreshHeader.m b/MJRefresh/Base/MJRefreshHeader.m new file mode 100755 index 0000000..7f7e2c2 --- /dev/null +++ b/MJRefresh/Base/MJRefreshHeader.m @@ -0,0 +1,145 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// MJRefreshHeader.m +// MJRefreshExample +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshHeader.h" + +@interface MJRefreshHeader() + +@end + +@implementation MJRefreshHeader +#pragma mark - 构造方法 ++ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock +{ + MJRefreshHeader *cmp = [[self alloc] init]; + cmp.refreshingBlock = refreshingBlock; + return cmp; +} ++ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action +{ + MJRefreshHeader *cmp = [[self alloc] init]; + [cmp setRefreshingTarget:target refreshingAction:action]; + return cmp; +} + +#pragma mark - 覆盖父类的方法 +- (void)prepare +{ + [super prepare]; + + // 设置key + self.lastUpdatedTimeKey = MJRefreshHeaderLastUpdatedTimeKey; + + // 设置高度 + self.mj_h = MJRefreshHeaderHeight; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 设置y值(当自己的高度发生改变了,肯定要重新调整Y值,所以放到placeSubviews方法中设置y值) + self.mj_y = - self.mj_h - self.ignoredScrollViewContentInsetTop; +} + +- (void)scrollViewContentOffsetDidChange:(NSDictionary *)change +{ + [super scrollViewContentOffsetDidChange:change]; + + // 在刷新的refreshing状态 + if (self.state == MJRefreshStateRefreshing) { + // sectionheader停留解决 + return; + } + + // 跳转到下一个控制器时,contentInset可能会变 + _scrollViewOriginalInset = self.scrollView.contentInset; + + // 当前的contentOffset + CGFloat offsetY = self.scrollView.mj_offsetY; + // 头部控件刚好出现的offsetY + CGFloat happenOffsetY = - self.scrollViewOriginalInset.top; + + // 如果是向上滚动到看不见头部控件,直接返回 + // >= -> > + if (offsetY > happenOffsetY) return; + + // 普通 和 即将刷新 的临界点 + CGFloat normal2pullingOffsetY = happenOffsetY - self.mj_h; + CGFloat pullingPercent = (happenOffsetY - offsetY) / self.mj_h; + + if (self.scrollView.isDragging) { // 如果正在拖拽 + self.pullingPercent = pullingPercent; + if (self.state == MJRefreshStateIdle && offsetY < normal2pullingOffsetY) { + // 转为即将刷新状态 + self.state = MJRefreshStatePulling; + } else if (self.state == MJRefreshStatePulling && offsetY >= normal2pullingOffsetY) { + // 转为普通状态 + self.state = MJRefreshStateIdle; + } + } else if (self.state == MJRefreshStatePulling) {// 即将刷新 && 手松开 + // 开始刷新 + [self beginRefreshing]; + } else if (pullingPercent < 1) { + self.pullingPercent = pullingPercent; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState != MJRefreshStateRefreshing) return; + + // 保存刷新时间 + [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:self.lastUpdatedTimeKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; + + // 恢复inset和offset + [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ + self.scrollView.mj_insetT -= self.mj_h; + + // 自动调整透明度 + if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0; + } completion:^(BOOL finished) { + self.pullingPercent = 0.0; + }]; + } else if (state == MJRefreshStateRefreshing) { + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + // 增加滚动区域 + CGFloat top = self.scrollViewOriginalInset.top + self.mj_h; + self.scrollView.mj_insetT = top; + + // 设置滚动位置 + self.scrollView.mj_offsetY = - top; + } completion:^(BOOL finished) { + [self executeRefreshingCallback]; + }]; + } +} + +#pragma mark - 公共方法 +- (void)endRefreshing +{ + if ([self.scrollView isKindOfClass:[UICollectionView class]]) { + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [super endRefreshing]; + }); + } else { + [super endRefreshing]; + } +} + +- (NSDate *)lastUpdatedTime +{ + return [[NSUserDefaults standardUserDefaults] objectForKey:self.lastUpdatedTimeKey]; +} +@end diff --git a/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h new file mode 100755 index 0000000..4c96286 --- /dev/null +++ b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.h @@ -0,0 +1,15 @@ +// +// MJRefreshAutoGifFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoStateFooter.h" + +@interface MJRefreshAutoGifFooter : MJRefreshAutoStateFooter +/** 设置state状态下的动画图片images 动画持续时间duration*/ +- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; +- (void)setImages:(NSArray *)images forState:(MJRefreshState)state; +@end diff --git a/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m new file mode 100755 index 0000000..0ab312e --- /dev/null +++ b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoGifFooter.m @@ -0,0 +1,104 @@ +// +// MJRefreshAutoGifFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoGifFooter.h" + +@interface MJRefreshAutoGifFooter() +@property (weak, nonatomic) UIImageView *gifView; +/** 所有状态对应的动画图片 */ +@property (strong, nonatomic) NSMutableDictionary *stateImages; +/** 所有状态对应的动画时间 */ +@property (strong, nonatomic) NSMutableDictionary *stateDurations; +@end + +@implementation MJRefreshAutoGifFooter +#pragma mark - 懒加载 +- (UIImageView *)gifView +{ + if (!_gifView) { + UIImageView *gifView = [[UIImageView alloc] init]; + [self addSubview:_gifView = gifView]; + } + return _gifView; +} + +- (NSMutableDictionary *)stateImages +{ + if (!_stateImages) { + self.stateImages = [NSMutableDictionary dictionary]; + } + return _stateImages; +} + +- (NSMutableDictionary *)stateDurations +{ + if (!_stateDurations) { + self.stateDurations = [NSMutableDictionary dictionary]; + } + return _stateDurations; +} + +#pragma mark - 公共方法 +- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state +{ + if (images == nil) return; + + self.stateImages[@(state)] = images; + self.stateDurations[@(state)] = @(duration); + + /* 根据图片设置控件的高度 */ + UIImage *image = [images firstObject]; + if (image.size.height > self.mj_h) { + self.mj_h = image.size.height; + } +} + +- (void)setImages:(NSArray *)images forState:(MJRefreshState)state +{ + [self setImages:images duration:images.count * 0.1 forState:state]; +} + +#pragma mark - 实现父类的方法 +- (void)placeSubviews +{ + [super placeSubviews]; + + self.gifView.frame = self.bounds; + if (self.isRefreshingTitleHidden) { + self.gifView.contentMode = UIViewContentModeCenter; + } else { + self.gifView.contentMode = UIViewContentModeRight; + self.gifView.mj_w = self.mj_w * 0.5 - 90; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateRefreshing) { + NSArray *images = self.stateImages[@(state)]; + if (images.count == 0) return; + [self.gifView stopAnimating]; + + self.gifView.hidden = NO; + if (images.count == 1) { // 单张图片 + self.gifView.image = [images lastObject]; + } else { // 多张图片 + self.gifView.animationImages = images; + self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; + [self.gifView startAnimating]; + } + } else if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + [self.gifView stopAnimating]; + self.gifView.hidden = YES; + } +} +@end + diff --git a/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h new file mode 100755 index 0000000..5549cff --- /dev/null +++ b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.h @@ -0,0 +1,14 @@ +// +// MJRefreshAutoNormalFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoStateFooter.h" + +@interface MJRefreshAutoNormalFooter : MJRefreshAutoStateFooter +/** 菊花的样式 */ +@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle; +@end diff --git a/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m new file mode 100755 index 0000000..76be140 --- /dev/null +++ b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoNormalFooter.m @@ -0,0 +1,67 @@ +// +// MJRefreshAutoNormalFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoNormalFooter.h" + +@interface MJRefreshAutoNormalFooter() +@property (weak, nonatomic) UIActivityIndicatorView *loadingView; +@end + +@implementation MJRefreshAutoNormalFooter +#pragma mark - 懒加载子控件 +- (UIActivityIndicatorView *)loadingView +{ + if (!_loadingView) { + UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle]; + loadingView.hidesWhenStopped = YES; + [self addSubview:_loadingView = loadingView]; + } + return _loadingView; +} + +- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle +{ + _activityIndicatorViewStyle = activityIndicatorViewStyle; + + self.loadingView = nil; + [self setNeedsLayout]; +} +#pragma makr - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 圈圈 + CGFloat arrowCenterX = self.mj_w * 0.5; + if (!self.isRefreshingTitleHidden) { + arrowCenterX -= 100; + } + CGFloat arrowCenterY = self.mj_h * 0.5; + self.loadingView.center = CGPointMake(arrowCenterX, arrowCenterY); +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateNoMoreData || state == MJRefreshStateIdle) { + [self.loadingView stopAnimating]; + } else if (state == MJRefreshStateRefreshing) { + [self.loadingView startAnimating]; + } +} + +@end diff --git a/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h new file mode 100755 index 0000000..956188b --- /dev/null +++ b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.h @@ -0,0 +1,20 @@ +// +// MJRefreshAutoStateFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoFooter.h" + +@interface MJRefreshAutoStateFooter : MJRefreshAutoFooter +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; + +/** 设置state状态下的文字 */ +- (void)setTitle:(NSString *)title forState:(MJRefreshState)state; + +/** 隐藏刷新状态的文字 */ +@property (assign, nonatomic, getter=isRefreshingTitleHidden) BOOL refreshingTitleHidden; +@end diff --git a/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m new file mode 100755 index 0000000..ccbc602 --- /dev/null +++ b/MJRefresh/Custom/Footer/Auto/MJRefreshAutoStateFooter.m @@ -0,0 +1,87 @@ +// +// MJRefreshAutoStateFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshAutoStateFooter.h" + +@interface MJRefreshAutoStateFooter() +{ + /** 显示刷新状态的label */ + __weak UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshAutoStateFooter +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles +{ + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel +{ + if (!_stateLabel) { + [self addSubview:_stateLabel = [UILabel label]]; + } + return _stateLabel; +} + +#pragma mark - 公共方法 +- (void)setTitle:(NSString *)title forState:(MJRefreshState)state +{ + if (title == nil) return; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; +} + +#pragma mark - 私有方法 +- (void)stateLabelClick +{ + if (self.state == MJRefreshStateIdle) { + [self beginRefreshing]; + } +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化文字 + [self setTitle:MJRefreshAutoFooterIdleText forState:MJRefreshStateIdle]; + [self setTitle:MJRefreshAutoFooterRefreshingText forState:MJRefreshStateRefreshing]; + [self setTitle:MJRefreshAutoFooterNoMoreDataText forState:MJRefreshStateNoMoreData]; + + // 监听label + self.stateLabel.userInteractionEnabled = YES; + [self.stateLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(stateLabelClick)]]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 状态标签 + self.stateLabel.frame = self.bounds; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + if (self.isRefreshingTitleHidden && state == MJRefreshStateRefreshing) { + self.stateLabel.text = nil; + } else { + self.stateLabel.text = self.stateTitles[@(state)]; + } +} +@end \ No newline at end of file diff --git a/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h b/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h new file mode 100755 index 0000000..10d92e4 --- /dev/null +++ b/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.h @@ -0,0 +1,15 @@ +// +// MJRefreshBackGifFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackStateFooter.h" + +@interface MJRefreshBackGifFooter : MJRefreshBackStateFooter +/** 设置state状态下的动画图片images 动画持续时间duration*/ +- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; +- (void)setImages:(NSArray *)images forState:(MJRefreshState)state; +@end diff --git a/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m b/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m new file mode 100755 index 0000000..ce18b53 --- /dev/null +++ b/MJRefresh/Custom/Footer/Back/MJRefreshBackGifFooter.m @@ -0,0 +1,115 @@ +// +// MJRefreshBackGifFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackGifFooter.h" + +@interface MJRefreshBackGifFooter() +@property (weak, nonatomic) UIImageView *gifView; +/** 所有状态对应的动画图片 */ +@property (strong, nonatomic) NSMutableDictionary *stateImages; +/** 所有状态对应的动画时间 */ +@property (strong, nonatomic) NSMutableDictionary *stateDurations; +@end + +@implementation MJRefreshBackGifFooter +#pragma mark - 懒加载 +- (UIImageView *)gifView +{ + if (!_gifView) { + UIImageView *gifView = [[UIImageView alloc] init]; + [self addSubview:_gifView = gifView]; + } + return _gifView; +} + +- (NSMutableDictionary *)stateImages +{ + if (!_stateImages) { + self.stateImages = [NSMutableDictionary dictionary]; + } + return _stateImages; +} + +- (NSMutableDictionary *)stateDurations +{ + if (!_stateDurations) { + self.stateDurations = [NSMutableDictionary dictionary]; + } + return _stateDurations; +} + +#pragma mark - 公共方法 +- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state +{ + if (images == nil) return; + + self.stateImages[@(state)] = images; + self.stateDurations[@(state)] = @(duration); + + /* 根据图片设置控件的高度 */ + UIImage *image = [images firstObject]; + if (image.size.height > self.mj_h) { + self.mj_h = image.size.height; + } +} + +- (void)setImages:(NSArray *)images forState:(MJRefreshState)state +{ + [self setImages:images duration:images.count * 0.1 forState:state]; +} + +#pragma mark - 实现父类的方法 +- (void)setPullingPercent:(CGFloat)pullingPercent +{ + [super setPullingPercent:pullingPercent]; + NSArray *images = self.stateImages[@(MJRefreshStateIdle)]; + if (self.state != MJRefreshStateIdle || images.count == 0) return; + [self.gifView stopAnimating]; + NSUInteger index = images.count * pullingPercent; + if (index >= images.count) index = images.count - 1; + self.gifView.image = images[index]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + self.gifView.frame = self.bounds; + if (self.stateLabel.hidden) { + self.gifView.contentMode = UIViewContentModeCenter; + } else { + self.gifView.contentMode = UIViewContentModeRight; + self.gifView.mj_w = self.mj_w * 0.5 - 90; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) { + NSArray *images = self.stateImages[@(state)]; + if (images.count == 0) return; + + self.gifView.hidden = NO; + [self.gifView stopAnimating]; + if (images.count == 1) { // 单张图片 + self.gifView.image = [images lastObject]; + } else { // 多张图片 + self.gifView.animationImages = images; + self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; + [self.gifView startAnimating]; + } + } else if (state == MJRefreshStateIdle) { + self.gifView.hidden = NO; + } else if (state == MJRefreshStateNoMoreData) { + self.gifView.hidden = YES; + } +} +@end diff --git a/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h b/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h new file mode 100755 index 0000000..90e8b77 --- /dev/null +++ b/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.h @@ -0,0 +1,15 @@ +// +// MJRefreshBackNormalFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackStateFooter.h" + +@interface MJRefreshBackNormalFooter : MJRefreshBackStateFooter +@property (weak, nonatomic, readonly) UIImageView *arrowView; +/** 菊花的样式 */ +@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle; +@end diff --git a/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m b/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m new file mode 100755 index 0000000..7b7b930 --- /dev/null +++ b/MJRefresh/Custom/Footer/Back/MJRefreshBackNormalFooter.m @@ -0,0 +1,109 @@ +// +// MJRefreshBackNormalFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackNormalFooter.h" + +@interface MJRefreshBackNormalFooter() +{ + __weak UIImageView *_arrowView; +} +@property (weak, nonatomic) UIActivityIndicatorView *loadingView; +@end + +@implementation MJRefreshBackNormalFooter +#pragma mark - 懒加载子控件 +- (UIImageView *)arrowView +{ + if (!_arrowView) { + UIImageView *arrowView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MJRefreshSrcName(@"arrow.png")]]; + [self addSubview:_arrowView = arrowView]; + } + return _arrowView; +} + +- (UIActivityIndicatorView *)loadingView +{ + if (!_loadingView) { + UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle]; + loadingView.hidesWhenStopped = YES; + [self addSubview:_loadingView = loadingView]; + } + return _loadingView; +} + +- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle +{ + _activityIndicatorViewStyle = activityIndicatorViewStyle; + + self.loadingView = nil; + [self setNeedsLayout]; +} +#pragma makr - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 箭头 + self.arrowView.mj_size = self.arrowView.image.size; + CGFloat arrowCenterX = self.mj_w * 0.5; + if (!self.stateLabel.hidden) { + arrowCenterX -= 100; + } + CGFloat arrowCenterY = self.mj_h * 0.5; + self.arrowView.center = CGPointMake(arrowCenterX, arrowCenterY); + + // 圈圈 + self.loadingView.frame = self.arrowView.frame; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState == MJRefreshStateRefreshing) { + self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); + [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ + self.loadingView.alpha = 0.0; + } completion:^(BOOL finished) { + self.loadingView.alpha = 1.0; + [self.loadingView stopAnimating]; + + self.arrowView.hidden = NO; + }]; + } else { + self.arrowView.hidden = NO; + [self.loadingView stopAnimating]; + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); + }]; + } + } else if (state == MJRefreshStatePulling) { + self.arrowView.hidden = NO; + [self.loadingView stopAnimating]; + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformIdentity; + }]; + } else if (state == MJRefreshStateRefreshing) { + self.arrowView.hidden = YES; + [self.loadingView startAnimating]; + } else if (state == MJRefreshStateNoMoreData) { + self.arrowView.hidden = YES; + [self.loadingView stopAnimating]; + } +} + +@end diff --git a/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h b/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h new file mode 100755 index 0000000..2d02b2e --- /dev/null +++ b/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.h @@ -0,0 +1,19 @@ +// +// MJRefreshBackStateFooter.h +// MJRefreshExample +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackFooter.h" + +@interface MJRefreshBackStateFooter : MJRefreshBackFooter +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; +/** 设置state状态下的文字 */ +- (void)setTitle:(NSString *)title forState:(MJRefreshState)state; + +/** 获取state状态下的title */ +- (NSString *)titleForState:(MJRefreshState)state; +@end diff --git a/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m b/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m new file mode 100755 index 0000000..d75460e --- /dev/null +++ b/MJRefresh/Custom/Footer/Back/MJRefreshBackStateFooter.m @@ -0,0 +1,77 @@ +// +// MJRefreshBackStateFooter.m +// MJRefreshExample +// +// Created by MJ Lee on 15/6/13. +// Copyright © 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshBackStateFooter.h" + +@interface MJRefreshBackStateFooter() +{ + /** 显示刷新状态的label */ + __weak UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshBackStateFooter +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles +{ + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel +{ + if (!_stateLabel) { + [self addSubview:_stateLabel = [UILabel label]]; + } + return _stateLabel; +} + +#pragma mark - 公共方法 +- (void)setTitle:(NSString *)title forState:(MJRefreshState)state +{ + if (title == nil) return; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; +} + +- (NSString *)titleForState:(MJRefreshState)state { + return self.stateTitles[@(state)]; +} + +#pragma mark - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化文字 + [self setTitle:MJRefreshBackFooterIdleText forState:MJRefreshStateIdle]; + [self setTitle:MJRefreshBackFooterPullingText forState:MJRefreshStatePulling]; + [self setTitle:MJRefreshBackFooterRefreshingText forState:MJRefreshStateRefreshing]; + [self setTitle:MJRefreshBackFooterNoMoreDataText forState:MJRefreshStateNoMoreData]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 状态标签 + self.stateLabel.frame = self.bounds; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 设置状态文字 + self.stateLabel.text = self.stateTitles[@(state)]; +} +@end diff --git a/MJRefresh/Custom/Header/MJRefreshGifHeader.h b/MJRefresh/Custom/Header/MJRefreshGifHeader.h new file mode 100755 index 0000000..560c847 --- /dev/null +++ b/MJRefresh/Custom/Header/MJRefreshGifHeader.h @@ -0,0 +1,15 @@ +// +// MJRefreshGifHeader.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshStateHeader.h" + +@interface MJRefreshGifHeader : MJRefreshStateHeader +/** 设置state状态下的动画图片images 动画持续时间duration*/ +- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state; +- (void)setImages:(NSArray *)images forState:(MJRefreshState)state; +@end diff --git a/MJRefresh/Custom/Header/MJRefreshGifHeader.m b/MJRefresh/Custom/Header/MJRefreshGifHeader.m new file mode 100755 index 0000000..aa2ddd5 --- /dev/null +++ b/MJRefresh/Custom/Header/MJRefreshGifHeader.m @@ -0,0 +1,112 @@ +// +// MJRefreshGifHeader.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshGifHeader.h" + +@interface MJRefreshGifHeader() +@property (weak, nonatomic) UIImageView *gifView; +/** 所有状态对应的动画图片 */ +@property (strong, nonatomic) NSMutableDictionary *stateImages; +/** 所有状态对应的动画时间 */ +@property (strong, nonatomic) NSMutableDictionary *stateDurations; +@end + +@implementation MJRefreshGifHeader +#pragma mark - 懒加载 +- (UIImageView *)gifView +{ + if (!_gifView) { + UIImageView *gifView = [[UIImageView alloc] init]; + [self addSubview:_gifView = gifView]; + } + return _gifView; +} + +- (NSMutableDictionary *)stateImages +{ + if (!_stateImages) { + self.stateImages = [NSMutableDictionary dictionary]; + } + return _stateImages; +} + +- (NSMutableDictionary *)stateDurations +{ + if (!_stateDurations) { + self.stateDurations = [NSMutableDictionary dictionary]; + } + return _stateDurations; +} + +#pragma mark - 公共方法 +- (void)setImages:(NSArray *)images duration:(NSTimeInterval)duration forState:(MJRefreshState)state +{ + if (images == nil) return; + + self.stateImages[@(state)] = images; + self.stateDurations[@(state)] = @(duration); + + /* 根据图片设置控件的高度 */ + UIImage *image = [images firstObject]; + if (image.size.height > self.mj_h) { + self.mj_h = image.size.height; + } +} + +- (void)setImages:(NSArray *)images forState:(MJRefreshState)state +{ + [self setImages:images duration:images.count * 0.1 forState:state]; +} + +#pragma mark - 实现父类的方法 +- (void)setPullingPercent:(CGFloat)pullingPercent +{ + [super setPullingPercent:pullingPercent]; + NSArray *images = self.stateImages[@(MJRefreshStateIdle)]; + if (self.state != MJRefreshStateIdle || images.count == 0) return; + // 停止动画 + [self.gifView stopAnimating]; + // 设置当前需要显示的图片 + NSUInteger index = images.count * pullingPercent; + if (index >= images.count) index = images.count - 1; + self.gifView.image = images[index]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + self.gifView.frame = self.bounds; + if (self.stateLabel.hidden && self.lastUpdatedTimeLabel.hidden) { + self.gifView.contentMode = UIViewContentModeCenter; + } else { + self.gifView.contentMode = UIViewContentModeRight; + self.gifView.mj_w = self.mj_w * 0.5 - 90; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStatePulling || state == MJRefreshStateRefreshing) { + NSArray *images = self.stateImages[@(state)]; + if (images.count == 0) return; + + [self.gifView stopAnimating]; + if (images.count == 1) { // 单张图片 + self.gifView.image = [images lastObject]; + } else { // 多张图片 + self.gifView.animationImages = images; + self.gifView.animationDuration = [self.stateDurations[@(state)] doubleValue]; + [self.gifView startAnimating]; + } + } +} +@end diff --git a/MJRefresh/Custom/Header/MJRefreshNormalHeader.h b/MJRefresh/Custom/Header/MJRefreshNormalHeader.h new file mode 100755 index 0000000..547d05e --- /dev/null +++ b/MJRefresh/Custom/Header/MJRefreshNormalHeader.h @@ -0,0 +1,15 @@ +// +// MJRefreshNormalHeader.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshStateHeader.h" + +@interface MJRefreshNormalHeader : MJRefreshStateHeader +@property (weak, nonatomic, readonly) UIImageView *arrowView; +/** 菊花的样式 */ +@property (assign, nonatomic) UIActivityIndicatorViewStyle activityIndicatorViewStyle; +@end diff --git a/MJRefresh/Custom/Header/MJRefreshNormalHeader.m b/MJRefresh/Custom/Header/MJRefreshNormalHeader.m new file mode 100755 index 0000000..3ed5c36 --- /dev/null +++ b/MJRefresh/Custom/Header/MJRefreshNormalHeader.m @@ -0,0 +1,115 @@ +// +// MJRefreshNormalHeader.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshNormalHeader.h" + +@interface MJRefreshNormalHeader() +{ + __weak UIImageView *_arrowView; +} +@property (weak, nonatomic) UIActivityIndicatorView *loadingView; +@end + +@implementation MJRefreshNormalHeader +#pragma mark - 懒加载子控件 +- (UIImageView *)arrowView +{ + if (!_arrowView) { + UIImage *image = [UIImage imageNamed:MJRefreshSrcName(@"arrow.png")]; + if (!image) { + image = [UIImage imageNamed:MJRefreshFrameworkSrcName(@"arrow.png")]; + } + UIImageView *arrowView = [[UIImageView alloc] initWithImage:image]; + [self addSubview:_arrowView = arrowView]; + } + return _arrowView; +} + +- (UIActivityIndicatorView *)loadingView +{ + if (!_loadingView) { + UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:self.activityIndicatorViewStyle]; + loadingView.hidesWhenStopped = YES; + [self addSubview:_loadingView = loadingView]; + } + return _loadingView; +} + +#pragma mark - 公共方法 +- (void)setActivityIndicatorViewStyle:(UIActivityIndicatorViewStyle)activityIndicatorViewStyle +{ + _activityIndicatorViewStyle = activityIndicatorViewStyle; + + self.loadingView = nil; + [self setNeedsLayout]; +} + +#pragma makr - 重写父类的方法 +- (void)prepare +{ + [super prepare]; + + self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + // 箭头 + self.arrowView.mj_size = self.arrowView.image.size; + CGFloat arrowCenterX = self.mj_w * 0.5; + if (!self.stateLabel.hidden) { + arrowCenterX -= 100; + } + CGFloat arrowCenterY = self.mj_h * 0.5; + self.arrowView.center = CGPointMake(arrowCenterX, arrowCenterY); + + // 圈圈 + self.loadingView.frame = self.arrowView.frame; +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 根据状态做事情 + if (state == MJRefreshStateIdle) { + if (oldState == MJRefreshStateRefreshing) { + self.arrowView.transform = CGAffineTransformIdentity; + + [UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{ + self.loadingView.alpha = 0.0; + } completion:^(BOOL finished) { + // 如果执行完动画发现不是idle状态,就直接返回,进入其他状态 + if (self.state != MJRefreshStateIdle) return; + + self.loadingView.alpha = 1.0; + [self.loadingView stopAnimating]; + self.arrowView.hidden = NO; + }]; + } else { + [self.loadingView stopAnimating]; + self.arrowView.hidden = NO; + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformIdentity; + }]; + } + } else if (state == MJRefreshStatePulling) { + [self.loadingView stopAnimating]; + self.arrowView.hidden = NO; + [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{ + self.arrowView.transform = CGAffineTransformMakeRotation(0.000001 - M_PI); + }]; + } else if (state == MJRefreshStateRefreshing) { + self.loadingView.alpha = 1.0; // 防止refreshing -> idle的动画完毕动作没有被执行 + [self.loadingView startAnimating]; + self.arrowView.hidden = YES; + } +} +@end diff --git a/MJRefresh/Custom/Header/MJRefreshStateHeader.h b/MJRefresh/Custom/Header/MJRefreshStateHeader.h new file mode 100755 index 0000000..5909532 --- /dev/null +++ b/MJRefresh/Custom/Header/MJRefreshStateHeader.h @@ -0,0 +1,23 @@ +// +// MJRefreshStateHeader.h +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshHeader.h" + +@interface MJRefreshStateHeader : MJRefreshHeader +#pragma mark - 刷新时间相关 +/** 利用这个block来决定显示的更新时间文字 */ +@property (copy, nonatomic) NSString *(^lastUpdatedTimeText)(NSDate *lastUpdatedTime); +/** 显示上一次刷新时间的label */ +@property (weak, nonatomic, readonly) UILabel *lastUpdatedTimeLabel; + +#pragma mark - 状态相关 +/** 显示刷新状态的label */ +@property (weak, nonatomic, readonly) UILabel *stateLabel; +/** 设置state状态下的文字 */ +- (void)setTitle:(NSString *)title forState:(MJRefreshState)state; +@end diff --git a/MJRefresh/Custom/Header/MJRefreshStateHeader.m b/MJRefresh/Custom/Header/MJRefreshStateHeader.m new file mode 100755 index 0000000..20ee3ef --- /dev/null +++ b/MJRefresh/Custom/Header/MJRefreshStateHeader.m @@ -0,0 +1,139 @@ +// +// MJRefreshStateHeader.m +// MJRefreshExample +// +// Created by MJ Lee on 15/4/24. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "MJRefreshStateHeader.h" + +@interface MJRefreshStateHeader() +{ + /** 显示上一次刷新时间的label */ + __weak UILabel *_lastUpdatedTimeLabel; + /** 显示刷新状态的label */ + __weak UILabel *_stateLabel; +} +/** 所有状态对应的文字 */ +@property (strong, nonatomic) NSMutableDictionary *stateTitles; +@end + +@implementation MJRefreshStateHeader +#pragma mark - 懒加载 +- (NSMutableDictionary *)stateTitles +{ + if (!_stateTitles) { + self.stateTitles = [NSMutableDictionary dictionary]; + } + return _stateTitles; +} + +- (UILabel *)stateLabel +{ + if (!_stateLabel) { + [self addSubview:_stateLabel = [UILabel label]]; + } + return _stateLabel; +} + +- (UILabel *)lastUpdatedTimeLabel +{ + if (!_lastUpdatedTimeLabel) { + [self addSubview:_lastUpdatedTimeLabel = [UILabel label]]; + } + return _lastUpdatedTimeLabel; +} + +#pragma mark - 公共方法 +- (void)setTitle:(NSString *)title forState:(MJRefreshState)state +{ + if (title == nil) return; + self.stateTitles[@(state)] = title; + self.stateLabel.text = self.stateTitles[@(self.state)]; +} + +#pragma mark key的处理 +- (void)setLastUpdatedTimeKey:(NSString *)lastUpdatedTimeKey +{ + [super setLastUpdatedTimeKey:lastUpdatedTimeKey]; + + NSDate *lastUpdatedTime = [[NSUserDefaults standardUserDefaults] objectForKey:lastUpdatedTimeKey]; + + // 如果有block + if (self.lastUpdatedTimeText) { + self.lastUpdatedTimeLabel.text = self.lastUpdatedTimeText(lastUpdatedTime); + return; + } + + if (lastUpdatedTime) { + // 1.获得年月日 + NSCalendar *calendar = [NSCalendar currentCalendar]; + NSUInteger unitFlags = NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay |NSCalendarUnitHour |NSCalendarUnitMinute; + NSDateComponents *cmp1 = [calendar components:unitFlags fromDate:lastUpdatedTime]; + NSDateComponents *cmp2 = [calendar components:unitFlags fromDate:[NSDate date]]; + + // 2.格式化日期 + NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; + if ([cmp1 day] == [cmp2 day]) { // 今天 + formatter.dateFormat = @"今天 HH:mm"; + } else if ([cmp1 year] == [cmp2 year]) { // 今年 + formatter.dateFormat = @"MM-dd HH:mm"; + } else { + formatter.dateFormat = @"yyyy-MM-dd HH:mm"; + } + NSString *time = [formatter stringFromDate:lastUpdatedTime]; + + // 3.显示日期 + self.lastUpdatedTimeLabel.text = [NSString stringWithFormat:@"最后更新:%@", time]; + } else { + self.lastUpdatedTimeLabel.text = @"最后更新:无记录"; + } +} + +#pragma mark - 覆盖父类的方法 +- (void)prepare +{ + [super prepare]; + + // 初始化文字 + [self setTitle:MJRefreshHeaderIdleText forState:MJRefreshStateIdle]; + [self setTitle:MJRefreshHeaderPullingText forState:MJRefreshStatePulling]; + [self setTitle:MJRefreshHeaderRefreshingText forState:MJRefreshStateRefreshing]; +} + +- (void)placeSubviews +{ + [super placeSubviews]; + + if (self.stateLabel.hidden) return; + + if (self.lastUpdatedTimeLabel.hidden) { + // 状态 + self.stateLabel.frame = self.bounds; + } else { + // 状态 + self.stateLabel.mj_x = 0; + self.stateLabel.mj_y = 0; + self.stateLabel.mj_w = self.mj_w; + self.stateLabel.mj_h = self.mj_h * 0.5; + + // 更新时间 + self.lastUpdatedTimeLabel.mj_x = 0; + self.lastUpdatedTimeLabel.mj_y = self.stateLabel.mj_h; + self.lastUpdatedTimeLabel.mj_w = self.mj_w; + self.lastUpdatedTimeLabel.mj_h = self.mj_h - self.lastUpdatedTimeLabel.mj_y; + } +} + +- (void)setState:(MJRefreshState)state +{ + MJRefreshCheckState + + // 设置状态文字 + self.stateLabel.text = self.stateTitles[@(state)]; + + // 重新设置key(重新显示时间) + self.lastUpdatedTimeKey = self.lastUpdatedTimeKey; +} +@end diff --git a/MJRefresh/MJRefresh.bundle/arrow@2x.png b/MJRefresh/MJRefresh.bundle/arrow@2x.png new file mode 100644 index 0000000..4f2ea63 Binary files /dev/null and b/MJRefresh/MJRefresh.bundle/arrow@2x.png differ diff --git a/MJRefresh/MJRefresh.h b/MJRefresh/MJRefresh.h new file mode 100755 index 0000000..196e6ec --- /dev/null +++ b/MJRefresh/MJRefresh.h @@ -0,0 +1,14 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 + +#import "UIScrollView+MJRefresh.h" +#import "UIScrollView+MJExtension.h" +#import "UIView+MJExtension.h" + +#import "MJRefreshNormalHeader.h" +#import "MJRefreshGifHeader.h" + +#import "MJRefreshBackNormalFooter.h" +#import "MJRefreshBackGifFooter.h" +#import "MJRefreshAutoNormalFooter.h" +#import "MJRefreshAutoGifFooter.h" \ No newline at end of file diff --git a/MJRefresh/MJRefreshConst.h b/MJRefresh/MJRefreshConst.h new file mode 100755 index 0000000..038ac3f --- /dev/null +++ b/MJRefresh/MJRefreshConst.h @@ -0,0 +1,63 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +#import +#import + +// 日志输出 +#ifdef DEBUG +#define MJRefreshLog(...) NSLog(__VA_ARGS__) +#else +#define MJRefreshLog(...) +#endif + +// 过期提醒 +#define MJRefreshDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead) + +// 运行时objc_msgSend +#define MJRefreshMsgSend(...) ((void (*)(void *, SEL, UIView *))objc_msgSend)(__VA_ARGS__) +#define MJRefreshMsgTarget(target) (__bridge void *)(target) + +// RGB颜色 +#define MJRefreshColor(r, g, b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] + +// 文字颜色 +#define MJRefreshLabelTextColor MJRefreshColor(255,255, 255) + +// 字体大小 +#define MJRefreshLabelFont [UIFont boldSystemFontOfSize:14] + +// 图片路径 +#define MJRefreshSrcName(file) [@"MJRefresh.bundle" stringByAppendingPathComponent:file] +#define MJRefreshFrameworkSrcName(file) [@"Frameworks/MJRefresh.framework/MJRefresh.bundle" stringByAppendingPathComponent:file] + +// 常量 +UIKIT_EXTERN const CGFloat MJRefreshHeaderHeight; +UIKIT_EXTERN const CGFloat MJRefreshFooterHeight; +UIKIT_EXTERN const CGFloat MJRefreshFastAnimationDuration; +UIKIT_EXTERN const CGFloat MJRefreshSlowAnimationDuration; + +UIKIT_EXTERN NSString *const MJRefreshKeyPathContentOffset; +UIKIT_EXTERN NSString *const MJRefreshKeyPathContentSize; +UIKIT_EXTERN NSString *const MJRefreshKeyPathContentInset; +UIKIT_EXTERN NSString *const MJRefreshKeyPathPanState; + +UIKIT_EXTERN NSString *const MJRefreshHeaderLastUpdatedTimeKey; + +UIKIT_EXTERN NSString *const MJRefreshHeaderIdleText; +UIKIT_EXTERN NSString *const MJRefreshHeaderPullingText; +UIKIT_EXTERN NSString *const MJRefreshHeaderRefreshingText; + +UIKIT_EXTERN NSString *const MJRefreshAutoFooterIdleText; +UIKIT_EXTERN NSString *const MJRefreshAutoFooterRefreshingText; +UIKIT_EXTERN NSString *const MJRefreshAutoFooterNoMoreDataText; + +UIKIT_EXTERN NSString *const MJRefreshBackFooterIdleText; +UIKIT_EXTERN NSString *const MJRefreshBackFooterPullingText; +UIKIT_EXTERN NSString *const MJRefreshBackFooterRefreshingText; +UIKIT_EXTERN NSString *const MJRefreshBackFooterNoMoreDataText; + +// 状态检查 +#define MJRefreshCheckState \ +MJRefreshState oldState = self.state; \ +if (state == oldState) return; \ +[super setState:state]; diff --git a/MJRefresh/MJRefreshConst.m b/MJRefresh/MJRefreshConst.m new file mode 100755 index 0000000..e9eeafb --- /dev/null +++ b/MJRefresh/MJRefreshConst.m @@ -0,0 +1,28 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +#import + +const CGFloat MJRefreshHeaderHeight = 64.0; +const CGFloat MJRefreshFooterHeight = 44.0; +const CGFloat MJRefreshFastAnimationDuration = 0.25; +const CGFloat MJRefreshSlowAnimationDuration = 0.4; + +NSString *const MJRefreshKeyPathContentOffset = @"contentOffset"; +NSString *const MJRefreshKeyPathContentInset = @"contentInset"; +NSString *const MJRefreshKeyPathContentSize = @"contentSize"; +NSString *const MJRefreshKeyPathPanState = @"state"; + +NSString *const MJRefreshHeaderLastUpdatedTimeKey = @"MJRefreshHeaderLastUpdatedTimeKey"; + +NSString *const MJRefreshHeaderIdleText = @"下拉可以加载更多"; +NSString *const MJRefreshHeaderPullingText = @"松开立即加载更多"; +NSString *const MJRefreshHeaderRefreshingText = @"正在加载更多的数据..."; + +NSString *const MJRefreshAutoFooterIdleText = @"点击或上拉加载更多"; +NSString *const MJRefreshAutoFooterRefreshingText = @"正在加载更多的数据..."; +NSString *const MJRefreshAutoFooterNoMoreDataText = @"已经全部加载完毕"; + +NSString *const MJRefreshBackFooterIdleText = @"上拉可以加载更多"; +NSString *const MJRefreshBackFooterPullingText = @"松开立即加载更多"; +NSString *const MJRefreshBackFooterRefreshingText = @"正在加载更多的数据..."; +NSString *const MJRefreshBackFooterNoMoreDataText = @"已经全部加载完毕"; \ No newline at end of file diff --git a/MJRefresh/UIScrollView+MJExtension.h b/MJRefresh/UIScrollView+MJExtension.h new file mode 100755 index 0000000..734110f --- /dev/null +++ b/MJRefresh/UIScrollView+MJExtension.h @@ -0,0 +1,23 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// UIScrollView+Extension.h +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import + +@interface UIScrollView (MJExtension) +@property (assign, nonatomic) CGFloat mj_insetT; +@property (assign, nonatomic) CGFloat mj_insetB; +@property (assign, nonatomic) CGFloat mj_insetL; +@property (assign, nonatomic) CGFloat mj_insetR; + +@property (assign, nonatomic) CGFloat mj_offsetX; +@property (assign, nonatomic) CGFloat mj_offsetY; + +@property (assign, nonatomic) CGFloat mj_contentW; +@property (assign, nonatomic) CGFloat mj_contentH; +@end diff --git a/MJRefresh/UIScrollView+MJExtension.m b/MJRefresh/UIScrollView+MJExtension.m new file mode 100755 index 0000000..6a13f5f --- /dev/null +++ b/MJRefresh/UIScrollView+MJExtension.m @@ -0,0 +1,110 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// UIScrollView+Extension.m +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import "UIScrollView+MJExtension.h" +#import + +@implementation UIScrollView (MJExtension) + +- (void)setMj_insetT:(CGFloat)mj_insetT +{ + UIEdgeInsets inset = self.contentInset; + inset.top = mj_insetT; + self.contentInset = inset; +} + +- (CGFloat)mj_insetT +{ + return self.contentInset.top; +} + +- (void)setMj_insetB:(CGFloat)mj_insetB +{ + UIEdgeInsets inset = self.contentInset; + inset.bottom = mj_insetB; + self.contentInset = inset; +} + +- (CGFloat)mj_insetB +{ + return self.contentInset.bottom; +} + +- (void)setMj_insetL:(CGFloat)mj_insetL +{ + UIEdgeInsets inset = self.contentInset; + inset.left = mj_insetL; + self.contentInset = inset; +} + +- (CGFloat)mj_insetL +{ + return self.contentInset.left; +} + +- (void)setMj_insetR:(CGFloat)mj_insetR +{ + UIEdgeInsets inset = self.contentInset; + inset.right = mj_insetR; + self.contentInset = inset; +} + +- (CGFloat)mj_insetR +{ + return self.contentInset.right; +} + +- (void)setMj_offsetX:(CGFloat)mj_offsetX +{ + CGPoint offset = self.contentOffset; + offset.x = mj_offsetX; + self.contentOffset = offset; +} + +- (CGFloat)mj_offsetX +{ + return self.contentOffset.x; +} + +- (void)setMj_offsetY:(CGFloat)mj_offsetY +{ + CGPoint offset = self.contentOffset; + offset.y = mj_offsetY; + self.contentOffset = offset; +} + +- (CGFloat)mj_offsetY +{ + return self.contentOffset.y; +} + +- (void)setMj_contentW:(CGFloat)mj_contentW +{ + CGSize size = self.contentSize; + size.width = mj_contentW; + self.contentSize = size; +} + +- (CGFloat)mj_contentW +{ + return self.contentSize.width; +} + +- (void)setMj_contentH:(CGFloat)mj_contentH +{ + CGSize size = self.contentSize; + size.height = mj_contentH; + self.contentSize = size; +} + +- (CGFloat)mj_contentH +{ + return self.contentSize.height; +} +@end diff --git a/MJRefresh/UIScrollView+MJRefresh.h b/MJRefresh/UIScrollView+MJRefresh.h new file mode 100755 index 0000000..9f6dc53 --- /dev/null +++ b/MJRefresh/UIScrollView+MJRefresh.h @@ -0,0 +1,23 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// UIScrollView+MJRefresh.h +// MJRefreshExample +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// 给ScrollView增加下拉刷新、上拉刷新的功能 + +#import + +@class MJRefreshHeader, MJRefreshFooter; + +@interface UIScrollView (MJRefresh) +/** 下拉刷新控件 */ +@property (strong, nonatomic) MJRefreshHeader *header; +/** 上拉刷新控件 */ +@property (strong, nonatomic) MJRefreshFooter *footer; + +#pragma mark - other +- (NSInteger)totalDataCount; +@property (copy, nonatomic) void (^reloadDataBlock)(NSInteger totalDataCount); +@end diff --git a/MJRefresh/UIScrollView+MJRefresh.m b/MJRefresh/UIScrollView+MJRefresh.m new file mode 100755 index 0000000..b87a88c --- /dev/null +++ b/MJRefresh/UIScrollView+MJRefresh.m @@ -0,0 +1,142 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// UIScrollView+MJRefresh.m +// MJRefreshExample +// +// Created by MJ Lee on 15/3/4. +// Copyright (c) 2015年 小码哥. All rights reserved. +// + +#import "UIScrollView+MJRefresh.h" +#import "MJRefreshHeader.h" +#import "MJRefreshFooter.h" +#import + +@implementation NSObject (MJRefresh) + ++ (void)exchangeInstanceMethod1:(SEL)method1 method2:(SEL)method2 +{ + method_exchangeImplementations(class_getInstanceMethod(self, method1), class_getInstanceMethod(self, method2)); +} + ++ (void)exchangeClassMethod1:(SEL)method1 method2:(SEL)method2 +{ + method_exchangeImplementations(class_getClassMethod(self, method1), class_getClassMethod(self, method2)); +} + +@end + +@implementation UIScrollView (MJRefresh) + +#pragma mark - header +static const char MJRefreshHeaderKey = '\0'; +- (void)setHeader:(MJRefreshHeader *)header +{ + if (header != self.header) { + // 删除旧的,添加新的 + [self.header removeFromSuperview]; + [self addSubview:header]; + + // 存储新的 + [self willChangeValueForKey:@"header"]; // KVO + objc_setAssociatedObject(self, &MJRefreshHeaderKey, + header, OBJC_ASSOCIATION_ASSIGN); + [self didChangeValueForKey:@"header"]; // KVO + } +} + +- (MJRefreshHeader *)header +{ + return objc_getAssociatedObject(self, &MJRefreshHeaderKey); +} + +#pragma mark - footer +static const char MJRefreshFooterKey = '\0'; +- (void)setFooter:(MJRefreshFooter *)footer +{ + if (footer != self.footer) { + // 删除旧的,添加新的 + [self.footer removeFromSuperview]; + [self addSubview:footer]; + + // 存储新的 + [self willChangeValueForKey:@"footer"]; // KVO + objc_setAssociatedObject(self, &MJRefreshFooterKey, + footer, OBJC_ASSOCIATION_ASSIGN); + [self didChangeValueForKey:@"footer"]; // KVO + } +} + +- (MJRefreshFooter *)footer +{ + return objc_getAssociatedObject(self, &MJRefreshFooterKey); +} + +#pragma mark - other +- (NSInteger)totalDataCount +{ + NSInteger totalCount = 0; + if ([self isKindOfClass:[UITableView class]]) { + UITableView *tableView = (UITableView *)self; + + for (NSInteger section = 0; section + +@interface UIView (MJExtension) +@property (assign, nonatomic) CGFloat mj_x; +@property (assign, nonatomic) CGFloat mj_y; +@property (assign, nonatomic) CGFloat mj_w; +@property (assign, nonatomic) CGFloat mj_h; +@property (assign, nonatomic) CGSize mj_size; +@property (assign, nonatomic) CGPoint mj_origin; +@end diff --git a/MJRefresh/UIView+MJExtension.m b/MJRefresh/UIView+MJExtension.m new file mode 100755 index 0000000..7e8eda2 --- /dev/null +++ b/MJRefresh/UIView+MJExtension.m @@ -0,0 +1,84 @@ +// 代码地址: https://github.com/CoderMJLee/MJRefresh +// 代码地址: http://code4app.com/ios/%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E4%B8%8B%E6%8B%89%E4%B8%8A%E6%8B%89%E5%88%B7%E6%96%B0/52326ce26803fabc46000000 +// UIView+Extension.m +// MJRefreshExample +// +// Created by MJ Lee on 14-5-28. +// Copyright (c) 2014年 小码哥. All rights reserved. +// + +#import "UIView+MJExtension.h" + +@implementation UIView (MJExtension) +- (void)setMj_x:(CGFloat)mj_x +{ + CGRect frame = self.frame; + frame.origin.x = mj_x; + self.frame = frame; +} + +- (CGFloat)mj_x +{ + return self.frame.origin.x; +} + +- (void)setMj_y:(CGFloat)mj_y +{ + CGRect frame = self.frame; + frame.origin.y = mj_y; + self.frame = frame; +} + +- (CGFloat)mj_y +{ + return self.frame.origin.y; +} + +- (void)setMj_w:(CGFloat)mj_w +{ + CGRect frame = self.frame; + frame.size.width = mj_w; + self.frame = frame; +} + +- (CGFloat)mj_w +{ + return self.frame.size.width; +} + +- (void)setMj_h:(CGFloat)mj_h +{ + CGRect frame = self.frame; + frame.size.height = mj_h; + self.frame = frame; +} + +- (CGFloat)mj_h +{ + return self.frame.size.height; +} + +- (void)setMj_size:(CGSize)mj_size +{ + CGRect frame = self.frame; + frame.size = mj_size; + self.frame = frame; +} + +- (CGSize)mj_size +{ + return self.frame.size; +} + +- (void)setMj_origin:(CGPoint)mj_origin +{ + CGRect frame = self.frame; + frame.origin = mj_origin; + self.frame = frame; +} + +- (CGPoint)mj_origin +{ + return self.frame.origin; +} +@end diff --git a/MutiMessageTableViewCell.swift b/MutiMessageTableViewCell.swift new file mode 100644 index 0000000..84b65f6 --- /dev/null +++ b/MutiMessageTableViewCell.swift @@ -0,0 +1,124 @@ +// +// NewsTableViewCell.swift +// TuringChatMachine +// +// Created by codeGlider on 15/10/10. +// Copyright © 2015年 codeGlider. All rights reserved. +// + +import UIKit +import SnapKit + +class MutiMessageTableViewCell: UITableViewCell,UITableViewDataSource,UITableViewDelegate{ + var tableView:UITableView + var message:Message! + let sentDateLabel:UILabel + override init(style: UITableViewCellStyle, reuseIdentifier: String?) { + tableView = UITableView(frame: CGRectZero, style: UITableViewStyle.Plain) + tableView.layer.borderWidth = 1 + tableView.layer.shadowColor = UIColor.grayColor().CGColor + tableView.layer.shadowRadius = 1 + tableView.layer.shadowOffset = CGSize(width: 1,height: 1) + + sentDateLabel = UILabel(frame: CGRectZero) + sentDateLabel.font = UIFont.systemFontOfSize(sentDateFontSize) + sentDateLabel.numberOfLines = 1 + sentDateLabel.userInteractionEnabled = false + sentDateLabel.textAlignment = .Center + sentDateLabel.textColor = UIColor(red:0.95, green:0.98, blue:0.99, alpha:1) + + + super.init(style: style, reuseIdentifier: reuseIdentifier) + contentView.addSubview(tableView) + contentView.addSubview(sentDateLabel) + + sentDateLabel.snp_makeConstraints { (make) -> Void in + make.top.equalTo(contentView.snp_top).offset(6) + make.centerX.equalTo(contentView.snp_centerX) + + } + tableView.snp_makeConstraints { (make) -> Void in + + make.top.equalTo(sentDateLabel.snp_bottom).offset(6) + make.width.equalTo(200) + make.centerX.equalTo(contentView.snp_centerX) + make.bottom.equalTo(contentView.snp_bottom).offset(-4.5) + + + + } + + + + + + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + func configureWithMutiMessage(message:Message,showSentDate:Bool){ + if showSentDate { + sentDateLabel.text = formatDate(message.sentDate) + } + self.message = message + self.tableView.delegate = self + self.tableView.dataSource = self + + } + override func setSelected(selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + + // Configure the view for the selected state + } + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + + switch (message.messageType){ + case messageType.trains.rawValue: + return (message.contents as! [trainsType]).count + case messageType.news.rawValue: + return (message.contents as! [newsType]).count + case messageType.recipes.rawValue: + return (message.contents as! [recipeType]).count + default: + return 0 + } + + + } + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var cell = tableView.dequeueReusableCellWithIdentifier("cell") + + if cell == nil { + cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") + + + } + if message.messageType == messageType.news.rawValue{ + let news = message.contents as! [newsType] + + cell?.textLabel?.text = "\(news[indexPath.row].article)" + + } + else if message.messageType == messageType.trains.rawValue{ + let trains = message.contents as! [trainsType] + + cell?.textLabel?.text = "\(trains[indexPath.row].start)->\(trains[indexPath.row].terminal) \(trains[indexPath.row].trainnum) \n\(trains[indexPath.row].starttime) - \(trains[indexPath.row].endtime)" + + } + else if message.messageType == messageType.recipes.rawValue{ + let recipes = message.contents as! [recipeType] + + cell?.textLabel?.text = "\(recipes[indexPath.row].name)" + + } + return cell! + } + + +} + + diff --git a/Podfile b/Podfile index 367cd08..2240565 100644 --- a/Podfile +++ b/Podfile @@ -7,3 +7,4 @@ pod 'SnapKit', '~> 0.14.0' pod 'Parse','~>1.7.1' pod 'ParseUI','~>1.1.3' pod 'Spring', :git => 'https://github.com/MengTo/Spring.git', :branch => 'swift2' +pod 'SVProgressHUD', :head diff --git a/Podfile.lock b/Podfile.lock index f598fc2..9e9ff42 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -7,6 +7,7 @@ PODS: - Parse (~> 1.7) - SnapKit (0.14.0) - Spring (1.0.3) + - SVProgressHUD (HEAD based on 1.1.3) DEPENDENCIES: - Alamofire (~> 2.0) @@ -14,6 +15,7 @@ DEPENDENCIES: - ParseUI (~> 1.1.3) - SnapKit (~> 0.14.0) - Spring (from `https://github.com/MengTo/Spring.git`, branch `swift2`) + - SVProgressHUD (HEAD) EXTERNAL SOURCES: Spring: @@ -32,5 +34,6 @@ SPEC CHECKSUMS: ParseUI: d1228541b02a36a7354c8f47747f5f7a89cf1ff0 SnapKit: f42352ef34953866da0de1e1009c2ff82588a95e Spring: 3f02b5dc3308572ef177b3cad0fa7bbc4b0706f7 + SVProgressHUD: 748080e4f36e603f6c02aec292664239df5279c1 COCOAPODS: 0.38.2 diff --git a/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h b/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h new file mode 120000 index 0000000..55a38a2 --- /dev/null +++ b/Pods/Headers/Private/SVProgressHUD/SVIndefiniteAnimatedView.h @@ -0,0 +1 @@ +../../../SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h \ No newline at end of file diff --git a/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h b/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h new file mode 120000 index 0000000..608a8aa --- /dev/null +++ b/Pods/Headers/Private/SVProgressHUD/SVProgressHUD.h @@ -0,0 +1 @@ +../../../SVProgressHUD/SVProgressHUD/SVProgressHUD.h \ No newline at end of file diff --git a/Pods/Headers/Private/SVProgressHUD/SVRadialGradientLayer.h b/Pods/Headers/Private/SVProgressHUD/SVRadialGradientLayer.h new file mode 120000 index 0000000..d78beb5 --- /dev/null +++ b/Pods/Headers/Private/SVProgressHUD/SVRadialGradientLayer.h @@ -0,0 +1 @@ +../../../SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h \ No newline at end of file diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index f598fc2..9e9ff42 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -7,6 +7,7 @@ PODS: - Parse (~> 1.7) - SnapKit (0.14.0) - Spring (1.0.3) + - SVProgressHUD (HEAD based on 1.1.3) DEPENDENCIES: - Alamofire (~> 2.0) @@ -14,6 +15,7 @@ DEPENDENCIES: - ParseUI (~> 1.1.3) - SnapKit (~> 0.14.0) - Spring (from `https://github.com/MengTo/Spring.git`, branch `swift2`) + - SVProgressHUD (HEAD) EXTERNAL SOURCES: Spring: @@ -32,5 +34,6 @@ SPEC CHECKSUMS: ParseUI: d1228541b02a36a7354c8f47747f5f7a89cf1ff0 SnapKit: f42352ef34953866da0de1e1009c2ff82588a95e Spring: 3f02b5dc3308572ef177b3cad0fa7bbc4b0706f7 + SVProgressHUD: 748080e4f36e603f6c02aec292664239df5279c1 COCOAPODS: 0.38.2 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 7ec81e6..05ab769 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,738 +7,821 @@ objects = { /* Begin PBXBuildFile section */ - 069DCFF6F357AF739ABE21F1CA61C965 /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 21930B8F5A2E3A4B419F4BA539177AB7 /* PFPrimaryButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 072942E811E6C9100B1676766793F4B3 /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = C3AFF7B7B40645594019B3C0D7E3C17B /* PFTextButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 07992CB93B76BBBD3A7C7B606559DFFB /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 1707E5D9518DEC7F116929A71CADFFDF /* PFPrimaryButton.m */; }; + 00542154935409B6E0F7216646D9B2A0 /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 287F2E1B0538CFE3329A3D1391FC26AA /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 01B3A67869930615807D407D0AB86CFE /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = F618BADEA864A0619BBD9BE8B922BF52 /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 022377F31220CE75F13824356C769D38 /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BFDA6A3801715C48196AD0B41E0D706E /* CFNetwork.framework */; }; + 036EF8F81CFF50788C098069C8C30A39 /* BFDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = C21DCF345E330EE72957CA2945D9E320 /* BFDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0387597031644C77CDAD71E7F48DF5EE /* BFCancellationTokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = FB46E75A0F3C4B73C59A27C96A5C2693 /* BFCancellationTokenSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 05FE27011DE54090E4BE4029429D8427 /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 39119B303358B59CA3AEED3CCB2CD300 /* PFCollectionViewCell.m */; }; + 0804FDC25E2FC24FCB3FCA153273134C /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 361AE4BA7BBCA5B9BE1E48BC4C58EF0A /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; 084A26CC6355487E7392E536B44D91A7 /* AsyncImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 644DF8F1DD47151F078FE505B9287BE4 /* AsyncImageView.swift */; }; - 0A73CB1ADD3B3C15343E2CDCDBCE2DC2 /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = 02152B278C4453D07DE372BA1878980B /* PFResources.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 0AAAA58D8DB041B4008942524225CB7A /* PFConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F9D70004C3C93742BE50B92B574BA85 /* PFConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0B9A5BDF04D2007E2ED35E04D02B8D06 /* PFTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 05108789326C8A881E5B707AFAF6AA7E /* PFTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0C926B1D844554EFAF143C26682CB608 /* SpringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAB550BFBDE25FD73B2CAF77A9F8FBBD /* SpringView.swift */; }; - 0D1914603AA6A50213D6A3C45939F6F9 /* PFGeoPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C32CA54485DF0532765D86DFED06985 /* PFGeoPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0D2CCA0E49298A2560FCB82D4355124C /* PFTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = C0FD247C315187490BD81A1DD97F1E7E /* PFTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0E739B8AED070BC72A746FC43F67724F /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = DA65C47034D64F26A07A53F5D6A60A74 /* PFLogInView.m */; }; - 103BD05F091C19AC0A657376A24C5DEE /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DD3D276244CFAD2FD599BB2936EEE7F3 /* PFPurchaseTableViewCell.m */; }; - 10549903261B5C7AFB0E03BF5854949D /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 7043FB2241DD3BFD163B10202318FBD5 /* PFRect.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 10B1CC7C5E6BFFD4BDFA74D89225A16A /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BF41205D5F55CF1390FF22F32596A83 /* Validation.swift */; }; - 16AAC2788482090D85976A0620D6A831 /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C981B189C7B5FAD2129888F960302F /* Alamofire.swift */; }; + 0D66D02CA253045DC24842B6E6E4C861 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + 11B82CDBABB4133910945083B140E6B3 /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2490F7DAD75BF7DFC20AB48290DF7423 /* Stream.swift */; }; + 15150C73965ADEE5A751CEE39C5CB8CD /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A7246CE28A0DAEEF10FD13FB451EB51 /* Request.swift */; }; 1A089D36CCCBDD881CCD45446954B371 /* SnapKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E13811703F4D15A85A9D2260B00A6A8 /* SnapKit.swift */; }; - 1A2FD81B6F57264FFE591C59C48DCD96 /* PFAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = BB6CDDB8B7D0F8F3AEA0B9B417D8EE65 /* PFAlertView.m */; }; - 1D256E7932C2EDE1147B7779AE7C846E /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 43DD19A7937FD56AEF4B9B78D9296E32 /* PFProductTableViewController.m */; }; - 1F7BD9A8EA0D7D3302281F418225B24D /* PFConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = F911BCC6753E39BE56A448117EFE583B /* PFConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1B8F58E879F698D32945E8931BE22EF8 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CA2993073BEF1F00E8E948D6F17C0FF /* AudioToolbox.framework */; }; + 1F046BCDB89C073112BE882DF60ED712 /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 06236DA604D6EDF3778666A5F897B1C9 /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1F94518F62FFEF6DD9D6618D28EBE136 /* BFExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = D92805B1FFCFA09B998BB798CFFEEFF7 /* BFExecutor.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 21F8DC886788ECAE6C24E819922134A3 /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B748C4E502CD0B31F51CCEBF5C8A726 /* ResponseSerialization.swift */; }; 22146A3B71EE47900269447075267D49 /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F79B446D865CE125AC740FDABBA29405 /* ConstraintItem.swift */; }; - 241E49D04E71CF311AEEBE4FCEA28D37 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 654163298B34355180357BD7202005E8 /* ParameterEncoding.swift */; }; - 25AA95E50F4AF923B35CBD537E551A6B /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4787BEA987B200817A79F0029183243 /* MultipartFormData.swift */; }; + 261D8207E3D16403BAB0D7953350A39F /* PFTextButton.h in Headers */ = {isa = PBXBuildFile; fileRef = C1C59DE2E0089E70C3193D405C3FD899 /* PFTextButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 27069DFD47FAC7A6A27AB4C62F9EE44F /* PFPrimaryButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 9849C347117249E71063E2F2ECD55E7E /* PFPrimaryButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; 27156FA2EE58423E96F91E849944DE33 /* DesignableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17786A103C8CD0AAB191C5A9353EBBFC /* DesignableView.swift */; }; 276887C3869F383DA42BC7A4D2DBEF3C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; 281ACA5F324A1A67F397E55FC273EDD0 /* AutoTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91059726DC94563BC9E3159625138DBE /* AutoTextView.swift */; }; - 28C557AAEC038370EB9324BD7EC69E3D /* PFLogInViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AEB5FC45C9F39E323904CCEFBF1CDBA /* PFLogInViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2B78486CBC75FF3E3182A6EA6FBF8BD3 /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B5DB94AC2832BA38609FBB4A1FDA55B /* PFLocalization.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 2C811D9D9F74025612B3E5BB86F33A0D /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 33F10576660B378B4CFC07528FF421DB /* PFTextButton.m */; }; - 2D1C626A61E89D8EB6A6C53E5F35F42A /* BoltsVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 06B3538BB4105909804BF7C2D3B76536 /* BoltsVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2D1FFDEE41DA10935886D97C85D028AE /* BFCancellationTokenSource.h in Headers */ = {isa = PBXBuildFile; fileRef = C302836E12DD36986981D7278F790E48 /* BFCancellationTokenSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 31CEE4D47A07324201BF363110A88B7A /* PFAnonymousUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 078135ED9ADED2F1A1D2215F18436B0E /* PFAnonymousUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 337262395403AE7B94F06B3D16EB1F43 /* ParseUI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FFCCD631834F2D9C6867BD1301AE5961 /* ParseUI-dummy.m */; }; - 3494DA5EB57B4BA1E02C5FBA99D4FCAF /* BFCancellationToken.h in Headers */ = {isa = PBXBuildFile; fileRef = FD0477B33BA3FB332089112B0DAEACC6 /* BFCancellationToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 349C775B7F3CBC689577E923A8D62220 /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA213B03487BDD4FB41013E76DC09BD /* Upload.swift */; }; - 3910B25339DC47C320AE459EA34F3A33 /* PFObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C593C67ED65005EBD07E350C9D1EEEAD /* PFObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2B9C4851706AB469708026633229E81F /* Upload.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB24F8C7D8E68C58067814621FD731D4 /* Upload.swift */; }; + 2DBD001AAADA4542C8EFFF6F52630A22 /* PFResources.h in Headers */ = {isa = PBXBuildFile; fileRef = E6543DF9BAF55392649FC54BFBE94099 /* PFResources.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 2E6F023908C55E78A8860126C56768BA /* BoltsVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A45568AD0D13EB41FA696A0E1B9C5EC /* BoltsVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2F341D8F76DFAE9B0489607ADB975DEB /* PFTextButton.m in Sources */ = {isa = PBXBuildFile; fileRef = F0C3B855D2D8CCAE7BB493BAEE0CA01E /* PFTextButton.m */; }; + 30E6963CA2071195AC67662F3540A933 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + 34C70F218A58E0B477470A84299F98B5 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B03B94162B852FAF229D6CB4D1FC0BBA /* SystemConfiguration.framework */; }; + 357818DAA624FE16454DC5F90B63B559 /* PFSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 393B79938ACB795322FFB8E7CFA4E94F /* PFSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 35BA8B26BA3FF9EE389EDA244F3240C2 /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = DDD544D69B1394A01990CECAA59CD501 /* PFDismissButton.m */; }; + 361EE1A511CE78B7C59775C8F44F43F0 /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 59A73E110ED76AF3934F053161974C9D /* PFImage.m */; }; + 376CFC345181340679CC9B14D2F29FED /* BFTaskCompletionSource.m in Sources */ = {isa = PBXBuildFile; fileRef = A41FE48E86FB615385D9E58F2A46C197 /* BFTaskCompletionSource.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 39017DF418957A8AC7C562DD8CE77E09 /* MultipartFormData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5539396381995F75FED1503E91D2B3B6 /* MultipartFormData.swift */; }; + 3949FEBF3BF079829A622434619D4D7C /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = B06C4A1F0FEB3928451E0B19164C2458 /* PFColor.m */; }; + 3A411C8BBDB755C980A8CA64106B9743 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B53D33994CE2FBCF8BF2FD438BD01156 /* en.lproj */; }; 3B15962FE6CDF703F7517DBAF87AD6E4 /* DesignableLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 714B835B557B3F72D89945095C23B1A4 /* DesignableLabel.swift */; }; + 3C2840F926E8C2DF0CAF3604DBFC469F /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 08E432805E6A901FEB2070240505A1FD /* PFTextField.m */; }; 3C82DAC4A708FB34E8EA66C82D08EAA2 /* View+SnapKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A5B605BCB86C161823225245B5EDBB7 /* View+SnapKit.swift */; }; - 3CCF4CE0D330B2DC61359CD00FD7D87A /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5686FB083709538D706C4D268762D6CB /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 3D5EE5E1A310CABF653D85A19E1BA989 /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = BE6DBD9263E4AAB7DEEA032905A4FBCC /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41B8F35C9C65B8B30B9F6C665BC39FC4 /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = EC3087349188253DC83CDA33DBAD661B /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41F70FC034C180D8FCA89D547B12D40C /* PFColor.m in Sources */ = {isa = PBXBuildFile; fileRef = CC33F7917F30F0D128EB4597C33A850A /* PFColor.m */; }; - 42140907C0DFC912502AF225293FFF61 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F530822DE8A9ADDEBEF89A24C9601155 /* AudioToolbox.framework */; }; - 462CA69D87AF1AEF0C979ABE142148C0 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AEE8FA20AB847F641C7E19D78474281 /* CoreGraphics.framework */; }; - 48BB90D14AA949E0E1F31F29C738E912 /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = EEA666FC7A8B91B7C482755E5B37B81C /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4A171D4857AF49F74337F53B6764B653 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = EEF5EC8407B7990895F2E392D345B47D /* en.lproj */; }; - 4A70489D8BE3265EA9D7E1F54C80FB91 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C6A0B3B36B82A17E757EB2384F69E7D /* QuartzCore.framework */; }; + 3EB882DC3BE6A7E4CFA879BC4B31E449 /* BFCancellationToken.h in Headers */ = {isa = PBXBuildFile; fileRef = AD6DD3C95F055B9583AACA7C250FCD2F /* BFCancellationToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3EDC5D78EF81840A3518DA3A775657AA /* PFAnonymousUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 60240177579FFF75A882FE7C92FE294E /* PFAnonymousUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3F5CF742033477D6D60B533D19B74B93 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 452DC8A60EA82130BC0456AE720EFECD /* QuartzCore.framework */; }; + 4154A12EACF279F47EA694072A5EEFC5 /* PFPush.h in Headers */ = {isa = PBXBuildFile; fileRef = A5ECBAFFF053A6A15A5F57B72831BE1F /* PFPush.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 462B6D0E9C8E5A6949AEC0AC6A27D394 /* ParseUI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 251EEBE45B1DFC7FE457A7CE05D10C84 /* ParseUI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46B3F3ABECEB4E81857EC5A0F2467136 /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 60D28430C5C6A43297B289461DFE76C5 /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 46E6E0A9C42605F730517D83A819266B /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E52B6FDFE7367B8CB16245024DA0524 /* PFQueryTableViewController.m */; }; + 48A7255B01E3398C32E3105B3F92A1A0 /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = E2D5455D8B0CC48B6626F9A68701EAE9 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4AC63369F44D2E1FF5754F4817036BE9 /* SpringButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F9CC2BB93470648CCEE42F06CF16EF1 /* SpringButton.swift */; }; 4AEC16254AB33CD52714CBF96CB8A50D /* SpringTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47A46C4CDA26763F8A89977615BA750 /* SpringTextField.swift */; }; - 4B22DFBB08C1DAA841F2E2A90983900C /* PFAnalytics.h in Headers */ = {isa = PBXBuildFile; fileRef = 1503DE3EFC1DCE057C52116224894B78 /* PFAnalytics.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4D090ACD4E980D42EC4D62B6C77CE309 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5398C34213A73B844438E6B71AA0BCED /* ServerTrustPolicy.swift */; }; - 4D16F7E70CA7A87FDFC72EC9075BCB29 /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = A91973A30FFA50DA9B85027FD1FF3FB4 /* PFActivityIndicatorTableViewCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 52569F8D8D8FA2F81874B96B1AFF78B1 /* Parse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD09D8CAABCAADEE168B585A7AC3484A /* Parse.framework */; }; - 526AF42044845C6C006A001B7BB210FE /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A7FD3B441184263DF43CB5142A4A8B68 /* CFNetwork.framework */; }; - 539BE27FF7E32477145F1989AF1AF07C /* PFObject+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = 49E84A74508C9E0B0216D2077A293601 /* PFObject+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 56D16F568426CCAA5085520E13C3A1C6 /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 076939F207BBC37D59D8E99D11C7C22B /* PFLoadingView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 594E1BA3B3D7D7B0E8B0EA768A32F016 /* PFRelation.h in Headers */ = {isa = PBXBuildFile; fileRef = 41F1FCAF1DC8F8DA0B8C4816C29AF149 /* PFRelation.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5B78BFB3D8108F47E893630BFCA9BF9C /* BFCancellationToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 07416852D19B502C824B2215E599E3E2 /* BFCancellationToken.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 5D5C27ECB8CEB5148D95EB3A9359D41A /* BFTaskCompletionSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 85FC6B815CCEAABA71054B628DF69A90 /* BFTaskCompletionSource.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4B00E0B04DB9FEC43102CAA8448B1BF1 /* BFExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = 40AA194BEE16DE1048660D180335E1F3 /* BFExecutor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 4B565647E4CE2866BB776844F5125965 /* Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = D9AD49BAEA0F96BEDEDF75689E5E80A5 /* Empty.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 4D6617AA5A8DCA13BC8E11D6E173A5B5 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B4FCFF441BC88C3C93440C8AB5AC4D4F /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4DBB69AA0815D2DC906A46AC35F920C8 /* PFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 758F96886628277588E5FF023D967966 /* PFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4E4D33EB340E341A8CBBF9C1057A3ECF /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D4953D83FB9DEA59D16F16B0771382F /* PFLogInViewController.m */; }; + 4EF849886BC37542888E82D736ABB350 /* PFAnalytics.h in Headers */ = {isa = PBXBuildFile; fileRef = 43DBB1BEAFA6DC6E11DE1350BE6C9929 /* PFAnalytics.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 50C82437DA072084E673762C9D8925F3 /* ParseUI.h in Headers */ = {isa = PBXBuildFile; fileRef = F152DCFEEC242140DBF3C07E80AFCF3C /* ParseUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5320E8F68466C033ECD689829B9AF0D6 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8AE4453606003C10B246472F98990A7F /* SVProgressHUD.bundle */; }; + 537A37E464F4FF3F0F38FC06CC0AAD54 /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 587F78E603C59E2CA76F1F87E9290AC8 /* PFQueryCollectionViewController.m */; }; + 5606452FB7DF9F2A3B7B0A35A92FE92D /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EDE0C8044AC622910A88EAC11D6BEB1 /* StoreKit.framework */; }; + 56AB4535244D5D5C3A5D7B706F36D727 /* PFRect.h in Headers */ = {isa = PBXBuildFile; fileRef = A0985500DFF9DA15F13E1202ED5A30B4 /* PFRect.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 586B63CD22AA1E7CF5B79D91096A4002 /* PFGeoPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 73839B2A8E1B09479C277ADF660E0007 /* PFGeoPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 59878F3121333CB7A57BDFB3EA53368F /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 10A4E3F02F7C36F8CE94434F465BD9BD /* PFSignUpViewController.m */; }; + 5A2966D2385AD004D3C566729CC4909A /* PFLoadingView.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E8E610AC534CA6C61D72D332E96EE3 /* PFLoadingView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 5BBCCE4C7B6BABC5E0D9125D4F8FC92F /* Pods-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B6934BA8B55F3743F804D6BAEB21CD6C /* Pods-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5C32FA556B16C58686C726CB57DB28CE /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = D16DB5B5AECAA4767402AED1142C6FEA /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5F25AA2BA30FFEA0076EF52BA98FA6A3 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4D5BABFE5290CD0BEBCDBC63FA523652 /* Security.framework */; }; 604AC93637F2CBB5D54D0950C2E56CBA /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = E11A7B60D7208B393697E6DBAC0309DA /* ConstraintMaker.swift */; }; - 60C94CA5A2F73F65628C53B9F488FF2C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; - 6171C4A567AF119DBF5A9828642C305A /* BFCancellationTokenRegistration.h in Headers */ = {isa = PBXBuildFile; fileRef = ADE720C9B4B640594229F580C98F6B17 /* BFCancellationTokenRegistration.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 61A3F4234A9B7E66A6EED86EF4000CF6 /* BFTask.h in Headers */ = {isa = PBXBuildFile; fileRef = E9F757AA266BB6CEAE9C2B172BEC4B99 /* BFTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6658AF09FA3B2A432167718AB274B361 /* PFRole.h in Headers */ = {isa = PBXBuildFile; fileRef = 996CD86C6B353E7971E1801581C7687E /* PFRole.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 682F0D80D52620252D001284672DD8B8 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA38F77C56A772D55C417E71256CD3B0 /* Download.swift */; }; + 60F08273F56AB927524464832F3033A5 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C218EDD3D6766266752789E0C64270 /* Error.swift */; }; + 61FB58415A85514CD7366370E081ACC7 /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 98717A9D86302BD9634E2238C4396C22 /* PFActivityIndicatorCollectionReusableView.m */; }; + 640FA1D873A103D35DE7F3D829453FE8 /* PFConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C184939B6244BDD621865D1A38AE765 /* PFConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66035B9E35B16BE8CC3820E250029868 /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FF8DDF001C1D1231F42F1B40CE9A9282 /* PFImageCache.m */; }; + 672EDE90704EC79E84BF61A71870441E /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4E7832EE809C6BEC9E007BBEA7E0278 /* CoreGraphics.framework */; }; 6898D00A17F0B59B9FB7D020642B0FE7 /* DesignableTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 243BD3D3C3D5BDAF745916587420D963 /* DesignableTabBarController.swift */; }; - 69655D0FBC29299F9826728F90A62B0A /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = D21B5F4DF182266FD1A2E7A3CC2C9380 /* PFImageView.m */; }; - 69C450E747831FE0E7B7359647458614 /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 061269ECCAC33FCB30DCD94C7E3C8179 /* PFActionButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - 6AB03A8697AB2C745D134A3314B15ECE /* PFFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 42451D5EFB5EF882B747D212A3E99173 /* PFFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6BD52C05450099582B25A2164A50F2CC /* PFPurchaseTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 649C270409F15243E795A445A0FF6FF3 /* PFPurchaseTableViewCell.m */; }; 6BFDEC714855D29F024742DA5E9DBFB5 /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D367D337E0670CA623B6F343C738D610 /* SnapKit-dummy.m */; }; - 6CB1BEE715BFED05A71038A3A0747387 /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = B2F0FC66388874B19F7B6FCC59571B45 /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7050A0D28E5552DC28E8CF30AC6AF5C4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A09E2048281B47F3A22B7A84C7B22F3D /* UIKit.framework */; }; - 70FE6B4F8CC6539B8EC79CC74FFB52F1 /* PFImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 726340FD7A6DA30E8F9C818792479A74 /* PFImageCache.m */; }; + 6D49801E7C64CBC11380228DDEB31571 /* PFObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 580BBB40693DD05A0D17909B61A28D49 /* PFObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6E5562155E06E914EF7A627801E14565 /* PFProduct.h in Headers */ = {isa = PBXBuildFile; fileRef = 103E5B334CEE3BB93F03F8CFD073C8EF /* PFProduct.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6F2AB5AA862ECAE194284D94234A1C98 /* Validation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 361CCB3153F3E0B7B7F5B394C3959DA3 /* Validation.swift */; }; + 6F77B8606662F066CCEA90BAC4982D7D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + 71C076FDDBE1B7C862C75D4FFFC8A4F7 /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D98345F1E23E7A01AC789E1397E9CD5E /* PFImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; 726CC8949AD9DB523732F497AEF566A0 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D7963F02D79E7AF9280CB2426B041D /* ConstraintRelation.swift */; }; - 73AA26D2C8A7981D0D8213EE64E53649 /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3D9FCF401A907593B351131A977C75EA /* PFLoadingView.m */; }; + 73EB44DF2DBADDFA88E6119E031F2A57 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 26DAB12DDABFD4511181F007C98C61B8 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7480D7F88F7D6C491AC709D6A2485553 /* DesignableTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 747EC9F42A32387A595E40BE8E658168 /* DesignableTextField.swift */; }; + 76E443A1A0349619B388D2555A925882 /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 88A9999091877EA5951B69EDFEE2FD28 /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7784ABE02E493AE3288BA2467DED9485 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6106FA0626AF6849CC0B8FA5321C5814 /* Images.xcassets */; }; - 77B575EA089C02E8355ABC4749C0C2C7 /* Bolts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E20A125CCB0E552FEF69171F2DEBB281 /* Bolts.framework */; }; 78054845576BD105C4505ACCB26C9A77 /* DesignableButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5A10C62583F50B571B0FEE47047D3D8 /* DesignableButton.swift */; }; - 7873E85085A754312B5B2468DC040CBD /* PFUser.h in Headers */ = {isa = PBXBuildFile; fileRef = D8FE715741A6CACA712C2DDAD4741342 /* PFUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7A7BF1A47974A6A1DFABDACEDB04BFFF /* Empty.m in Sources */ = {isa = PBXBuildFile; fileRef = B72A9030BB75EDC7C949460E09DFFC34 /* Empty.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 7AFB986891F3062A12F3B44BFC1CA030 /* Pods-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E68507C083F44B56EED5B989CA4F69B /* Pods-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7C40171BDC50F12387EC8D5BC0F20B21 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A90D90B3C40658B1618985F4AE5619A2 /* StoreKit.framework */; }; - 7FADB9B205173D9E4B5D0C670EE4AC5B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; - 7FB99F92C7F6DEEC58A07CEDEA1E3D97 /* PFProduct.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B4401440DB72F77A0EE1F7DD76DD0F8 /* PFProduct.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78772AF4269486ACC41C0B0BC47F3859 /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = ED8D286893117F9D983C607CD1D8B741 /* PFActivityIndicatorCollectionReusableView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 79C35F9CD874927154030B9E70206083 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + 79F1B78A0ABCA80A286CA88C47C06A3F /* BFCancellationTokenRegistration.m in Sources */ = {isa = PBXBuildFile; fileRef = 3001B71F3724D4037E90DEE08F56F12F /* BFCancellationTokenRegistration.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 7BA5D269E28371444E60DF07C1EC894D /* PFAlertView.m in Sources */ = {isa = PBXBuildFile; fileRef = 49E8B5BC6CBC055DEAF397C5CB7B7EF3 /* PFAlertView.m */; }; + 7D7FBA0B5CE0ED500738FC0ACE4B5E60 /* PFLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = CA37B3BF8163FC1B2564F1ED3AB4064C /* PFLocalization.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 7DD3931B15B8AD69D0B3482DABB199B4 /* BFCancellationToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 30EAFCF691EA32F049B27A68363A1804 /* BFCancellationToken.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 7E93CAA9F6D292E7BFE886723EF11B04 /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 9FDFE426B21728242B5E57E6BC095106 /* PFColor.h */; settings = {ATTRIBUTES = (Project, ); }; }; 804B994DD42A6A3C3A324D5377F1FB97 /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 799F700E0350C1622AF654FBAC56DC3E /* ConstraintAttributes.swift */; }; - 81C0FB46AA83894EF0D0F8179985F4D0 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2244210AE6E65C8DC1D9E1DC7D61576C /* Result.swift */; }; - 82E5002F2CA571805B184403F7B88F67 /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B30A225F9EB005CF64C491C590F7507 /* PFRect.m */; }; + 837C018C8935D259B378D2D3AA746118 /* Download.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA9A9FF1BE67E6F1D81A8AE234171004 /* Download.swift */; }; 84ED7FEBE3F346BEA288422986F53438 /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA6701D0395AA53671F30906FDA34B59 /* Debugging.swift */; }; - 85530926A731AD3A898D4A3EEF47E2F0 /* PFColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 89269306E96C93939F7F0150C232F262 /* PFColor.h */; settings = {ATTRIBUTES = (Project, ); }; }; 858ED576E4AADE88999137E0AA25F219 /* Spring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60B11326E117F16B77C4601D8FF6FC0B /* Spring.swift */; }; 85E0A62EDF1B29F208623993EB92D9E7 /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 413D4C68BCDED964834146EFB422C3B3 /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 860E6166BDD6C7A2AF796EE6D7729971 /* DesignableImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B639C1CF665CE74FBD6494B9A6633AC /* DesignableImageView.swift */; }; 86D7CDF1DF0E7F8EF6B64A3D2DE329B7 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB44D45A9A34C20A034D0D004999B563 /* LayoutConstraint.swift */; }; - 889FB791C27A4C294058BBDE1E6022C2 /* ParseUI-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A15C2126FDF4473D9BB99A0A673C34F6 /* ParseUI-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 898D4E31759FB047AE22A1DC0AB765C8 /* DesignableTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C28517CF1749DF981B83A9F1D8542FF5 /* DesignableTextView.swift */; }; - 8AC235CBE26851B2896AFE4DAB7FB7F7 /* BFTask.m in Sources */ = {isa = PBXBuildFile; fileRef = AFB8F09E68527ED0E4AC084DCAED6738 /* BFTask.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 89EEE2F454C4F846BEED6FB2C9B60EF7 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B4E7832EE809C6BEC9E007BBEA7E0278 /* CoreGraphics.framework */; }; 8AC90AA4994A6B17D0C52A0BA584FE07 /* Misc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 108AA2994D7815017CD629C1646FFF61 /* Misc.swift */; }; - 8B374FB1F37181FD3E9B63C710A3F3A1 /* BFDefines.h in Headers */ = {isa = PBXBuildFile; fileRef = A9EE46757E86ED5193A14869F17EC76F /* BFDefines.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8D0B4246EB6DCBE5341094235A1A4101 /* Bolts-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4165840F4852501AC5A7E661580C375E /* Bolts-dummy.m */; }; - 8FAE660447B0AB33DD5FCA96A7AC927C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1C6A0B3B36B82A17E757EB2384F69E7D /* QuartzCore.framework */; }; - 91B0B19B00086AC28AD6187396DD84CB /* Parse.h in Headers */ = {isa = PBXBuildFile; fileRef = 6365DB4F685EE8AA8EA5C24C0D0D1285 /* Parse.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9337EED969067181016FC60CC91D0A25 /* PFQueryCollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B61F5ED2D9D993BCDEFA59B7D363A3E2 /* PFQueryCollectionViewController.m */; }; - 934C66048F06E4F560465931EB23910F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9AEE8FA20AB847F641C7E19D78474281 /* CoreGraphics.framework */; }; - 94128477785758DC1215D0BF99F5A4E0 /* Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = 2EBE38E5067AE5D9C22F593A2666DC49 /* Bolts.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - 9A303852920496DCBD73475C68043768 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + 8B28FCF1CE459134934DFCB648EF79F5 /* PFUser.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A3F33596F52BFB16F902E40F305DAF5 /* PFUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BBFF920300DB22C9564838477DEB87B /* Parse.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A3B5511329E515AC93B77B0CD4A74E0 /* Parse.framework */; }; + 8D2299BA9A7F1E615DDD45369689B26E /* BFTask.m in Sources */ = {isa = PBXBuildFile; fileRef = 8FFAE60111F4E1BE0FCEBF43495DA498 /* BFTask.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 8E9F9BE43A783CC74A1EF6CFDFA0D505 /* PFTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 4653940AC5534DC8D14E82222B585277 /* PFTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F5880D02EC1429D731E8CB5DE6FBA62 /* PFAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = 3185718E27DC8A81E079E142B7D32ACE /* PFAlertView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 927826DD13A0952EFDB246EC3CCCDBED /* PFRole.h in Headers */ = {isa = PBXBuildFile; fileRef = D876AEEF955131084C645A3B0B8BD887 /* PFRole.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 92AD7EE01191C38E06D286E317CAE066 /* Bolts.m in Sources */ = {isa = PBXBuildFile; fileRef = 0309020ABB0E6B6B641E4D1AB0E8E988 /* Bolts.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + 93FA2E68E0DB9606BE686744428E87D2 /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = C8AF90FFDF0E29A47B4C8FCC52D467B9 /* PFTableViewCell.m */; }; + 9888832F68C42C098818FE81B4E56C93 /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A6842DE3ED0513931D3916952F3A3E51 /* PFImageCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; + 9891149AAC68F87AF4DA22877094521B /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = AE363BE2712AC08ED24167DE8B2CB441 /* PFActionButton.m */; }; + 9A034B6A37CFA7F13EC6412F627AF13A /* PFCloud.h in Headers */ = {isa = PBXBuildFile; fileRef = E8027916151AD902E0A43F33CE27B7E0 /* PFCloud.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9AC2822452FF90EF30FBA616C28A7725 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D6738B20E7D15C17765999C766CE414 /* Pods-dummy.m */; }; 9D7C9A631C0EB1530C0DCFA887618587 /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDC6726B2AA1DAAC6F94E1FF507AE34F /* ConstraintDescription.swift */; }; - 9DAC86BD34D3B4D5154900729AFCB0B4 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = E130EDD8D847450BFD0CFBDCEA1C8B34 /* Error.swift */; }; - 9E951C5A963D508AC48ECCD4A69720D0 /* PFCloud.h in Headers */ = {isa = PBXBuildFile; fileRef = 3774BC83FF5F45C194A097082834BC59 /* PFCloud.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9F6480E139693689C0F8506F28EDEA2E /* PFImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = ACD95C6A17107D7B0D4151CA092A2DC2 /* PFImageCache.h */; settings = {ATTRIBUTES = (Project, ); }; }; - A22767F2F0711E5BA446582DFF8AD6B2 /* Pods-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2315AB3B41F08F5D357FE042565C2D29 /* Pods-dummy.m */; }; - A4DBEC57E9EB55FD21358656224434C1 /* PFSignUpViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D0ADFD5CDCB8C9CEE2DB0BBBD014FE2B /* PFSignUpViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A512D23B7F5E0B298F19280B9B0D44E3 /* PFACL.h in Headers */ = {isa = PBXBuildFile; fileRef = FCEEF2DB125C3703869CE76C8246D3AF /* PFACL.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A70DE4B544BA1BFA70712ED070859312 /* PFLogInViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC48B0E3AA4A922AFE9B6D1A9C2B0D37 /* PFLogInViewController.m */; }; - A72EF0BFFA4BC03F402307ECE2DF616D /* Parse-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 329A7719D2CBCFE9200E3E3CFDB83E99 /* Parse-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A969D1297DCD7E7626527888642356C2 /* PFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = EB398476F13AEE3DADEBC00631033495 /* PFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC97B7A733EB3AADA009E416C6E2643C /* Stream.swift in Sources */ = {isa = PBXBuildFile; fileRef = B24120BF8EC11CBA67082CE3CA86552B /* Stream.swift */; }; - AD40077A1966D9D3583BE9DA4B198587 /* PFActivityIndicatorCollectionReusableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 473927365B9FCAEE40A98098760F529E /* PFActivityIndicatorCollectionReusableView.m */; }; - ADD31B1666632E810F7C45DD9A72CA13 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86B3B2F11837A37D812CE9BF9D034517 /* SystemConfiguration.framework */; }; - AF492F87C4072C4D4289E29457897E97 /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = B02835E66DD9F8CD48090DE4A146B58B /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E4523F9AD635FFA505D93852A4725AA /* Alamofire.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B84FCC85A22611DC2837E4FC73EEF8 /* Alamofire.swift */; }; + A074914EA314C559B519718BCFAE1568 /* PFPrimaryButton.m in Sources */ = {isa = PBXBuildFile; fileRef = EF1ED1921DC38C56E4BA5D3FE8FEE0C7 /* PFPrimaryButton.m */; }; + A45D9D17328D1AAAA7222313318C3831 /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A98FE1CBBD63800685546A1781C7DA16 /* PFActivityIndicatorTableViewCell.m */; }; + A5FB4FC9341AF54DDBC6F0E259BF5751 /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 46F6C000C5DAF9A479F512AB77E75534 /* PFDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; + ABD686A74099679780357C536CBBC6BC /* PFSubclassing.h in Headers */ = {isa = PBXBuildFile; fileRef = 764A7ACB5CEA95AAD604FD3E83E642C8 /* PFSubclassing.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AD23E58221E07BBC5659AFA3569507E3 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 452DC8A60EA82130BC0456AE720EFECD /* QuartzCore.framework */; }; + AE00736E85E3AEE07BB77BBAAFA73F62 /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = C58634FA13A6634E61C5B04D59A8DAA8 /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + AE1E1DF3C60983FD0E91C38437B6D637 /* BFTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 9731F663579CFEE575FAD61109772AA6 /* BFTask.h */; settings = {ATTRIBUTES = (Public, ); }; }; AFC0905E8B9FD7BD96E3305BEC6A408F /* SpringAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F9876D10625C1E9006562055D3BF119 /* SpringAnimation.swift */; }; + AFEBD6DA74A0DD12DA250FF0A91A3940 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = F545D14D09725C4616C64E436D754B33 /* SVIndefiniteAnimatedView.m */; }; B12F19D2BD4393832C2CDEC13930A5E7 /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B0270ACC0A1AAAC0088467BF0131477 /* Constraint.swift */; }; B1526F737F8754B9637038A81C19492A /* SpringImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 017820BFEFFA04C8392724C5BE0810A8 /* SpringImageView.swift */; }; - B1BF0F846FF33D04397EA9047E25EFD8 /* ParseUIConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = E596E2F08BAC9C808CD9ED1063B35CDB /* ParseUIConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; B2B8DA274F8F397158E9D33FFE049FFD /* EdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A76927A838B74013DE81260B84691E9 /* EdgeInsets.swift */; }; - B2FA995DC707053FCC8907AE9146A820 /* PFSignUpViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 20E254CA0E4387DF2EB950F56CFD848A /* PFSignUpViewController.m */; }; B3006549161976151BA776A6BD4F81F8 /* LoadingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C55DE6BD2C60A6FC893D8DB339FC4553 /* LoadingView.xib */; }; - B34E814739F72988E68281C16866A026 /* BFCancellationTokenRegistration.m in Sources */ = {isa = PBXBuildFile; fileRef = ECA3D18E57560A0BD36ACF68CC22F3FD /* BFCancellationTokenRegistration.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; B37AD3E2F87A47B9EB5F0D023F33FF1D /* TransitionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83D313E70FABD3B63D31116FC62DDD68 /* TransitionManager.swift */; }; B5733524751399DED1A701C15EF79176 /* SpringLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2834662A3665BDF7D2F61BA3631A66AD /* SpringLabel.swift */; }; - B5EC7BD68B23662B134F23A5711F5F18 /* PFQueryTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D84902042741975B690B3ED3FE6A531 /* PFQueryTableViewController.m */; }; - B61606E3136018C59B7EA1162ADCC79B /* Request.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88D6940C6BC089F231E8F64EF7B55D2B /* Request.swift */; }; - B6745CFB4C3897C5C36CEE1B2D82DEA6 /* PFDismissButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E08206DCF1412A04160C2A026B636E0 /* PFDismissButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; - B6C9E45062DAD2A3F334B4D4C5B68879 /* PFDismissButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CD17B0D501488D7E11F7ED3E18444DF /* PFDismissButton.m */; }; - B789D911CC144440C272F51E01DB397D /* Bolts-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D1D96B881F470CF00BD5285A198D730 /* Bolts-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B94CBFBBC1F73912024B3EC3B3B7D78D /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 334C27B878CB55A2E533EEB5FEFAF669 /* CoreLocation.framework */; }; - BB70EA35A1A916E574F7FACA7D462E1B /* PFSession.h in Headers */ = {isa = PBXBuildFile; fileRef = 33060C546CC3A12A34E4DC4F1BEBEA13 /* PFSession.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BECE90E288C76FC1149331156688DE0B /* PFQueryTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 66DEEA830E416518FC457F0BCE0415DC /* PFQueryTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B58BA04269EA4002E513113DCA1F4988 /* BFCancellationTokenRegistration.h in Headers */ = {isa = PBXBuildFile; fileRef = D556F6BA06CBFD0CC18F6433222525A5 /* BFCancellationTokenRegistration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B78CBD9E9538363A533A6659F46BAE21 /* PFLogInView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0074F797C94992E9AF2E518942B7BDD3 /* PFLogInView.m */; }; + B7C6F773EDC2E0EF5AEA448711E1ED47 /* PFRelation.h in Headers */ = {isa = PBXBuildFile; fileRef = 66599A0C11C7DF068DFE811FEE10B12F /* PFRelation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B83FF94D922ED493F66036A928852E6F /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6DD4947BED6E6A5E9149DD5163F19B39 /* SVRadialGradientLayer.m */; }; + B87BC6AFA2F15F6C06E7B2080ECE341E /* PFCollectionViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F5B9A0BE0E6F9C012C548E4FEC305DE /* PFCollectionViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BE3D74842C4B26AD5A15F30B86F6F273 /* PFProductTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 17FAD471627A4D869995BE055AA63801 /* PFProductTableViewController.m */; }; + BEE888C2965FBDBD3AF49A1C0E784D38 /* PFActivityIndicatorTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D89EA957697F1D1474A399583AF1D5FD /* PFActivityIndicatorTableViewCell.h */; settings = {ATTRIBUTES = (Project, ); }; }; + BFAB994DAFBE38A006E51BA45BFF6E81 /* PFRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 3E1CEBC0D4DD95983BCBDA3225FEB8ED /* PFRect.m */; }; C0D2C01A6C49699CFCDF22D7AEFE93AF /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF1373004EE5CF38BDD54B6746887D0 /* LoadingView.swift */; }; - C647263ABFD3E2F396CED0B302BE628A /* PFImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 06C7B7564D072ADC32E4F931099E2D08 /* PFImage.m */; }; - C6F3D6D623AA94D2C75F9CF1EAE556B9 /* PFAlertView.h in Headers */ = {isa = PBXBuildFile; fileRef = A074C71E41494C35BFEA474B0CB0387B /* PFAlertView.h */; settings = {ATTRIBUTES = (Project, ); }; }; - C7AE60F557E3003FAF2F01AE41C295AF /* PFLogInView.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CFAA8ECCA0D31547511C97AE749943D /* PFLogInView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C80DBBA97B4422DF4D1BE50E563C7741 /* PFActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 6B677FC715FDBCE4406BD1EB97AF508E /* PFActionButton.m */; }; - CC5A157C447F72EC96B8D15E952FB5A1 /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D93BFC186680649D781B3FA74C419509 /* Alamofire-dummy.m */; }; - CCD46EC511BCCF0AE3B616D846C10878 /* PFActivityIndicatorCollectionReusableView.h in Headers */ = {isa = PBXBuildFile; fileRef = F3B6F4E29F5CDC8F823CA749C3A3E566 /* PFActivityIndicatorCollectionReusableView.h */; settings = {ATTRIBUTES = (Project, ); }; }; + C17EA9D4CAC3C4A4A08E0A612A87CFB0 /* PFFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F28B38ADA21BADEFC96D97F8041A278 /* PFFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C1E3E3D87295E4783F26D693C89378CC /* ParseUI-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FAF50DB4863046581B97E4A9EBA539F /* ParseUI-dummy.m */; }; + C269906BAC6D5DD615A52F2681D53C96 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CBB868387C6F0F3FCA32935DB61D9E54 /* UIKit.framework */; }; + C2F38D10F2632283EBF13B925DCA372E /* BFTaskCompletionSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3854AECC1465D66E5D45DD77183F8C60 /* BFTaskCompletionSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C357BEF62A1B64BC642AD7ACAB5E2D1C /* Alamofire-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0412020A7D3E2B0D70C752343F1DB4AB /* Alamofire-dummy.m */; }; + C362D5061FC52EA33FCC2A1F1C9253A7 /* PFTwitterUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = E5C59F4C7765389F0BDD91C928C5DEC2 /* PFTwitterUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C5A1B243339E2FA633462C7C24F63175 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2DA6B24AAC4C76D5B4D70190AE510B9 /* CoreLocation.framework */; }; + C75C3966653ABAFF635C8B76F577DA88 /* ParameterEncoding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57A6ABD3FCD0FB0C7D186A76E30CF307 /* ParameterEncoding.swift */; }; + C9AA6D0A1F2F1E9E0991FC1DE9C28523 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B369AF375B9E55D80FE78521D07277C9 /* SVProgressHUD-dummy.m */; }; + CBD7F8F8D123D647F3185AC0C75DB937 /* PFNullability.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CB33ED17B11C58A1FCA60100C9180DF /* PFNullability.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE6440B2339C05DA99776A76ADE4E7AA /* Bolts.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F3BDBDFC00CF6E0DF16B39FD8C63932 /* Bolts.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CE91E809940E967B9AEDC8A3BB1D6372 /* PFConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FF8CFB8D4402E5960D141A0948269C8 /* PFConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; CEA7DA76414B19CD1DF071D5250CA67E /* KeyboardLayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AB8DC0029F616AC6A34A74FDAFD750 /* KeyboardLayoutConstraint.swift */; }; - D2F0923E072647C05807A0C4A2EE1D9B /* BFTaskCompletionSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D7A0776F5C6A9EDA06958A838234B58 /* BFTaskCompletionSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D50BC1D5B12EA5E6D087E96D5980C127 /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 17274A6F722931352B127DDD52D5FFA3 /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D516FF90C0B3806624CBC54B42AE3A3B /* PFNullability.h in Headers */ = {isa = PBXBuildFile; fileRef = 1E68F776BD8C564CF76865F60E2D7338 /* PFNullability.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D51B649A51D369ED35CC9B489DB1F0AD /* ResponseSerialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94F47B0A77561D770A81AB69BB0D18BD /* ResponseSerialization.swift */; }; - D6DA99A41E45D88514FEA4A781E42DF8 /* PFSubclassing.h in Headers */ = {isa = PBXBuildFile; fileRef = 037B68012E4AA306ECE53D0465ED5231 /* PFSubclassing.h */; settings = {ATTRIBUTES = (Public, ); }; }; - D85B61A0FB7F2E630ED3FF39C5C9FB08 /* PFPush.h in Headers */ = {isa = PBXBuildFile; fileRef = A03272D0EBBFA0A4B6F3F592AF579D10 /* PFPush.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CED19FF0568CF8F91378CA00576B48BE /* PFACL.h in Headers */ = {isa = PBXBuildFile; fileRef = A048B1BF5DCBF924412F6482CD927CDE /* PFACL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D038F2276792902B80CCA388F5778175 /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = D5A224DBD1851D9A7E3290BDEC07AD17 /* SVProgressHUD.m */; }; + D2CE3816A69F70889FEFDA33968E37CA /* PFLoadingView.m in Sources */ = {isa = PBXBuildFile; fileRef = E4435B9709FA8B9AAAB8E57D9CE42BCE /* PFLoadingView.m */; }; + D58BBFD3150F77C2271FA15F678D2366 /* PFObject+Subclass.h in Headers */ = {isa = PBXBuildFile; fileRef = E334CE3256D8270A8B07AB8E4D2D5841 /* PFObject+Subclass.h */; settings = {ATTRIBUTES = (Public, ); }; }; D9098E669199273B2BD82EB82BE303A6 /* AsyncButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C96B6E188B9C19B02F7A48882B460FF1 /* AsyncButton.swift */; }; + D9D16EACD61783FBEB383A4799E867E9 /* PF_Twitter.h in Headers */ = {isa = PBXBuildFile; fileRef = BFF13EF2BB4110FB1C597DCDFB3B8739 /* PF_Twitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DA2957FBAFEB8B5CB6B279A3373F9249 /* PFActionButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 9DE37557D9AE8CF09267DEAE8E6A680A /* PFActionButton.h */; settings = {ATTRIBUTES = (Project, ); }; }; DA8ABA13298C7710C0415705CF15A95F /* Spring-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F5FA4219C27344F5A01D3CDD86C3EAB /* Spring-dummy.m */; }; - DC7398C7C0B9258DDF3104CEF9056AF7 /* PFTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 37466D05C28946491C8B6F92E1AF34F0 /* PFTextField.m */; }; + DB3B33C491B0A042CCD83EF00E73F06E /* Alamofire-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D3A264E34E686C9B6455DF0F4D7D0AA /* Alamofire-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DDF575AD6B47BCAFEB4BE7BF8B8F498D /* Spring-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4ACF5E472382B95FBDED0550E24C18DB /* Spring-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DE14523DFEB00D26207482AF9154A08A /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = A7EC8D261DE19EA24B57B2217D46056C /* PFResources.m */; }; - DF94E4D738B1FBB034A72F6A91F2DCD5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; - DFBEB9FA80B8BCCCF02B052CC1ECDBC2 /* PF_Twitter.h in Headers */ = {isa = PBXBuildFile; fileRef = FD8AA917755D9EF812676F9361CA1FBE /* PF_Twitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFECD3DCFFC2475C846B578E51BA1FB2 /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = B0F8719E85935AC69D18E6940DA61A3B /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E08A71BF43F93E2E40B711CC15745A93 /* PFInstallation.h in Headers */ = {isa = PBXBuildFile; fileRef = C3CC1F31D0EE6E4E95F4A54BEBD94105 /* PFInstallation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DF3F5FA80C168BD40810EF241B024A16 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E1300CD0F6178644BB14F654CB644D /* Result.swift */; }; + DFF2A1EDD7E9D5FB66C276959E0D0712 /* PFProductTableViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = F0A68535F08342A56A034EA610139152 /* PFProductTableViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E280564CD24D14A05E08B8B69BACD922 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + E2CD38897547A273E88DE2281590149A /* BFCancellationTokenSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D8DFDFFFC08DF7611DB6BD4E32F0E8 /* BFCancellationTokenSource.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; + E31045ABA8961A34400D284F1B54C948 /* PFSignUpView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5B3EFFC2C782099B7FEE2A4794D0463 /* PFSignUpView.h */; settings = {ATTRIBUTES = (Public, ); }; }; E445E02BAE699D3CD97213973DCDC5FE /* TransitionZoom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E4A04412784B2B3A8735C7186E1AE16 /* TransitionZoom.swift */; }; - E4F32A3FFA80F83585B306D991020B09 /* PFPurchase.h in Headers */ = {isa = PBXBuildFile; fileRef = EE640882780ACCFF1076824B4FC7758D /* PFPurchase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E63D2178263649942FA15921B439E898 /* Parse-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9E4FCBCFBF362B9CE50CC3A550C206F8 /* Parse-dummy.m */; }; E6D355B8760661369050BD92BA9CBC5E /* UnwindSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE0B4A3C8430E8D9BAC52FE90BB00CF2 /* UnwindSegue.swift */; }; - E8CFBA421710EF479C84DEFF028B859C /* PFTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3102047A87F834152B0127E2007B94F2 /* PFTableViewCell.m */; }; + E7371ECC7586209051E37456F1A75191 /* Parse-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 27A6C1C38D3E5DE37F31CC95DBF14527 /* Parse-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7D9D26AB80C32AAC77C9D08000A0AA8 /* Bolts-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AEF410AC64C0A37F9B5760AAC51EC79F /* Bolts-dummy.m */; }; + E88993ADBF55D591D24C375D021EA375 /* Bolts-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AA4CD17C753943BD57F738C6F2969DF4 /* Bolts-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E89E10B73335AA160BDE8D05A41E17A6 /* PFImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = CDE8C59AE734C3CB9FBF86DD3A73A3B1 /* PFImageView.m */; }; + E90143FE21009D78D8455E9F6FAAEBF3 /* ServerTrustPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F32D03A88F4C9F5D894D3B884BB4F28 /* ServerTrustPolicy.swift */; }; + E96B6C7AE4A6D521EC8D7EF8C41D083A /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 89F9035656D010E40C47CF4C678762FF /* Manager.swift */; }; E9D54407268E0C066760E9A3A283F8FC /* SpringTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73DD0FB30CDB217927C27FE7D04F75EE /* SpringTextView.swift */; }; - EA4BE9EED53C55B3EE7E1E784CD639C9 /* PFQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 218BBDF1ADF497140951BF702196AD8A /* PFQuery.h */; settings = {ATTRIBUTES = (Public, ); }; }; EA99C5E65D55AA9CEF09E17D00546D5F /* ImageLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6F2691BBD99CF1196A45A047DB048B5 /* ImageLoader.swift */; }; - EBE6C837145AED845C3FAED9611E0CE6 /* Manager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B9CC111A606AA1E4C02A5C9016E6DAA /* Manager.swift */; }; - ED4630CDE874FB3466F8B6CAB7AB0F95 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + EB8D2F85232E124393A498CA73F07999 /* Parse.h in Headers */ = {isa = PBXBuildFile; fileRef = 34180C62239AE4F47CCB1C87BDB1E856 /* Parse.h */; settings = {ATTRIBUTES = (Public, ); }; }; EDD147D64BC86E5198D4E99B05028490 /* ViewController+SnapKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = A00F6A7822756001C1AC412B0A1751A8 /* ViewController+SnapKit.swift */; }; - EE054CB64D25D4EC707EE2EF0688374C /* Bolts.h in Headers */ = {isa = PBXBuildFile; fileRef = 89A3850622568B464722BDD8E48AE401 /* Bolts.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EF9F51FE7E50A15079B409C103592F8A /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C307288668C20E0C1AC8C4F54C1F794A /* Security.framework */; }; + EE3F1DB0D7EE48DAF178C57F3CC1AFF4 /* PFResources.m in Sources */ = {isa = PBXBuildFile; fileRef = A3FE2C4B23714CFA2B84BE045055D140 /* PFResources.m */; }; + F0CA640D732D970B8664007876F64912 /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E82555FF3BCB2F60800EF4601D379BF /* PFSignUpView.m */; }; F25A1F5BF7035884B330E4CED131AD64 /* BlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F3D3BA73F633688D4B0A041AFDFEFF /* BlurView.swift */; }; - F786F5BE99346FE26924CB1AAE792059 /* PFActivityIndicatorTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 90BC08A82FA5C4B953FD4C7514080F33 /* PFActivityIndicatorTableViewCell.m */; }; - F7C44B88B46C865A9830777F246563C3 /* PFSignUpView.m in Sources */ = {isa = PBXBuildFile; fileRef = E5BC513513FF38AFAD95384D7F395606 /* PFSignUpView.m */; }; + F271248AF8E239B1F0FB662E2525C66E /* PFImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 38232F71D881443850F7C61339A90F07 /* PFImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3431EB47D159524821969C8B695E141 /* PFPurchase.h in Headers */ = {isa = PBXBuildFile; fileRef = 33BF98421E77DCEB4DF65DFC0462C62C /* PFPurchase.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F3F610506DF90617B6C9CF8B99674AEE /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 452DC8A60EA82130BC0456AE720EFECD /* QuartzCore.framework */; }; + F7CCA099E97A320B450650CDDFF814C9 /* Bolts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0FF1064C49918490D4466B434376596B /* Bolts.framework */; }; F7DDAE900EED9ABD4430EAB819BBED9C /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; - FA2224BE68772766C33D1C14AA9AE9B1 /* PFImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 17C4A07234837C6CA7292DCE78515E8E /* PFImage.h */; settings = {ATTRIBUTES = (Project, ); }; }; - FC6074D7116A1E85EC82FB502C38BB15 /* BFExecutor.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AD6A19BAC94D423253666DE63A53BBD /* BFExecutor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FD60E5C4A9526A38D9AD81937528FDA8 /* Parse-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E56673E8C14F7BD870A9F24D8753B937 /* Parse-dummy.m */; }; - FD625E4BF7141086F2E18867866CEB05 /* PFCollectionViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 74644F56B2B1BF51955065D573BCAFFF /* PFCollectionViewCell.m */; }; + F8C31B1845DFE777A6673434F0C2C675 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */; }; + FAF8C60CEA6A6D9CDC82E172D894E300 /* PFQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 94319398A39678774385D6CFCB352A28 /* PFQuery.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FB9F4B54305BE8F03FF8A25867A2BD69 /* PFInstallation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5A1AB3293CE8E2847302D74F97634EC9 /* PFInstallation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + FC2C3C6063FE39968B7613B0F88F5AB3 /* PFQueryCollectionViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D5C64F6E8F39ABB3FA04C92A2AC029EC /* PFQueryCollectionViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; FDD11A163E0E272D38230B50C4202AEE /* SoundPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21C0F51565A5346A442CC17CBFEE3FBD /* SoundPlayer.swift */; }; - FE5600F80309C0D314ECB21D032C2782 /* BFCancellationTokenSource.m in Sources */ = {isa = PBXBuildFile; fileRef = E400FE1997044A10576B564EF91BCAB7 /* BFCancellationTokenSource.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - FEAFA6E5ED98D2C85A2BE0875A444C38 /* BFExecutor.m in Sources */ = {isa = PBXBuildFile; fileRef = F4C3F6C87F0A22310388CC179B8CF4CF /* BFExecutor.m */; settings = {COMPILER_FLAGS = "-DOS_OBJECT_USE_OBJC=0"; }; }; - FF25769D96ED459BD66F1C3E7A8F1EE8 /* PFPurchaseTableViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 5E9CCFAB17FA3A760D0191E1338C5397 /* PFPurchaseTableViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 10310F8FD28115C6D92DD36CFCCD3508 /* PBXContainerItemProxy */ = { + 0264CCA35835DEEDED72438934DA4C39 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 10FC5CE2B571075A620708ACED6A2623; - remoteInfo = Bolts; + remoteGlobalIDString = 3CD6A168CBF3B631BB2C2F0BE2952A1C; + remoteInfo = SVProgressHUD; }; - 71111488C2E050A4E5DF4DF9C35DE7FE /* PBXContainerItemProxy */ = { + 2F79BB45A1A068748B0ED835D51962BF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 77545C60DD00C9F792CEEC9995290A1C; + remoteGlobalIDString = 235C5CA5D82C2DD787A19D63A785CABA; remoteInfo = Parse; }; - 7DB5D1D86535DCAF19019F7BC5A1E411 /* PBXContainerItemProxy */ = { + 413D839EE2D49DC60335F942FBFF1D7B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 10FC5CE2B571075A620708ACED6A2623; - remoteInfo = Bolts; - }; - C34248A9CB95A89509697B5875E3B447 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1091688AA925600943826D4E240A451A; + remoteGlobalIDString = 61A52E32A13FD38217F820D4B11E57B1; remoteInfo = ParseUI; }; - CC785A7EE4E95822352CB07EC1B45C13 /* PBXContainerItemProxy */ = { + 860351DD2EFD306846D21F2ABAE12B9D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = BB49AA45405B3C29158A457C15B32CB8; + remoteGlobalIDString = 85C0FAEA03C3F706077F691B3555AD88; remoteInfo = Alamofire; }; - E5652175708BDEE4182E3B100925D06A /* PBXContainerItemProxy */ = { + 93924BC7084BB6F89A4EF57B9714D118 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 4ADDC830F1F3957A877DC0A28F0CBD4E; - remoteInfo = Spring; + remoteGlobalIDString = 8D88C1D9673E5D48828AE5F0FB9A083C; + remoteInfo = Bolts; }; - EB427ADDD8CEC964ECB3282CF4297126 /* PBXContainerItemProxy */ = { + A689706B720E0085F7221EE2948083FB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; remoteGlobalIDString = 4EDA452517A913B556C7860F490D5FD3; remoteInfo = SnapKit; }; - F7536014CFA3998E1F983815A38CAA27 /* PBXContainerItemProxy */ = { + A8C1FA3148E2C91F9462A27EDC3DFCE8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8D88C1D9673E5D48828AE5F0FB9A083C; + remoteInfo = Bolts; + }; + D7C3DD80E36C76111F28464520C1148F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 77545C60DD00C9F792CEEC9995290A1C; + remoteGlobalIDString = 235C5CA5D82C2DD787A19D63A785CABA; remoteInfo = Parse; }; + EDE47945FCD3FA70E77E2A4CBC82EA18 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4ADDC830F1F3957A877DC0A28F0CBD4E; + remoteInfo = Spring; + }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 0074F797C94992E9AF2E518942B7BDD3 /* PFLogInView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFLogInView.m; path = ParseUI/Classes/LogInViewController/PFLogInView.m; sourceTree = ""; }; 017820BFEFFA04C8392724C5BE0810A8 /* SpringImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringImageView.swift; path = Spring/SpringImageView.swift; sourceTree = ""; }; - 01972408950E50752263871774688AAE /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 02152B278C4453D07DE372BA1878980B /* PFResources.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFResources.h; path = ParseUI/Generated/PFResources.h; sourceTree = ""; }; - 023223DDDF248415F863542228D653AC /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 037B68012E4AA306ECE53D0465ED5231 /* PFSubclassing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFSubclassing.h; sourceTree = ""; }; - 0403E497A9AFCB1B8E34FD5472ADCE6E /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 05108789326C8A881E5B707AFAF6AA7E /* PFTableViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFTableViewCell.h; path = ParseUI/Classes/Cells/PFTableViewCell.h; sourceTree = ""; }; - 061269ECCAC33FCB30DCD94C7E3C8179 /* PFActionButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFActionButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFActionButton.h; sourceTree = ""; }; - 06B3538BB4105909804BF7C2D3B76536 /* BoltsVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BoltsVersion.h; path = Bolts/Common/BoltsVersion.h; sourceTree = ""; }; - 06C7B7564D072ADC32E4F931099E2D08 /* PFImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFImage.m; path = ParseUI/Classes/Internal/Extensions/PFImage.m; sourceTree = ""; }; - 07416852D19B502C824B2215E599E3E2 /* BFCancellationToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationToken.m; path = Bolts/Common/BFCancellationToken.m; sourceTree = ""; }; - 076939F207BBC37D59D8E99D11C7C22B /* PFLoadingView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLoadingView.h; path = ParseUI/Classes/Internal/Views/PFLoadingView.h; sourceTree = ""; }; - 078135ED9ADED2F1A1D2215F18436B0E /* PFAnonymousUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFAnonymousUtils.h; sourceTree = ""; }; - 07E661F3694EEBC209973EB8E5DAB670 /* ParseUI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = ParseUI.modulemap; sourceTree = ""; }; + 0309020ABB0E6B6B641E4D1AB0E8E988 /* Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Bolts.m; path = Bolts/Common/Bolts.m; sourceTree = ""; }; + 03E1300CD0F6178644BB14F654CB644D /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; + 0412020A7D3E2B0D70C752343F1DB4AB /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; + 05A9D7231AC21BEA3ECEBAA3F41B0BE8 /* ParseUI-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ParseUI-prefix.pch"; sourceTree = ""; }; + 06236DA604D6EDF3778666A5F897B1C9 /* PFLogInViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLogInViewController.h; path = ParseUI/Classes/LogInViewController/PFLogInViewController.h; sourceTree = ""; }; + 071B15E0027F5EBEA7E278BFDD90713C /* Spring.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Spring.modulemap; sourceTree = ""; }; + 08E432805E6A901FEB2070240505A1FD /* PFTextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFTextField.m; path = ParseUI/Classes/Views/PFTextField.m; sourceTree = ""; }; 0A76927A838B74013DE81260B84691E9 /* EdgeInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EdgeInsets.swift; path = Source/EdgeInsets.swift; sourceTree = ""; }; - 0AEB5FC45C9F39E323904CCEFBF1CDBA /* PFLogInViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLogInViewController.h; path = ParseUI/Classes/LogInViewController/PFLogInViewController.h; sourceTree = ""; }; - 0B9CC111A606AA1E4C02A5C9016E6DAA /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; - 0D7A0776F5C6A9EDA06958A838234B58 /* BFTaskCompletionSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTaskCompletionSource.h; path = Bolts/Common/BFTaskCompletionSource.h; sourceTree = ""; }; + 0FF1064C49918490D4466B434376596B /* Bolts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Bolts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 103E5B334CEE3BB93F03F8CFD073C8EF /* PFProduct.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFProduct.h; sourceTree = ""; }; 108AA2994D7815017CD629C1646FFF61 /* Misc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Misc.swift; path = Spring/Misc.swift; sourceTree = ""; }; - 1503DE3EFC1DCE057C52116224894B78 /* PFAnalytics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFAnalytics.h; sourceTree = ""; }; - 1707E5D9518DEC7F116929A71CADFFDF /* PFPrimaryButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFPrimaryButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.m; sourceTree = ""; }; - 17274A6F722931352B127DDD52D5FFA3 /* PFProductTableViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFProductTableViewController.h; path = ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h; sourceTree = ""; }; + 10A4E3F02F7C36F8CE94434F465BD9BD /* PFSignUpViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFSignUpViewController.m; path = ParseUI/Classes/SignUpViewController/PFSignUpViewController.m; sourceTree = ""; }; + 11A7BE4205C5FABE76951CAC019CAD5D /* Bolts-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Bolts-Private.xcconfig"; sourceTree = ""; }; + 16750CC5D92DB8C6C526741A011C5B91 /* Parse-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Parse-Private.xcconfig"; sourceTree = ""; }; 17786A103C8CD0AAB191C5A9353EBBFC /* DesignableView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableView.swift; path = Spring/DesignableView.swift; sourceTree = ""; }; - 17B2F479990AF0E56D9793614EAA3EB8 /* SnapKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.xcconfig; sourceTree = ""; }; - 17C4A07234837C6CA7292DCE78515E8E /* PFImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFImage.h; path = ParseUI/Classes/Internal/Extensions/PFImage.h; sourceTree = ""; }; - 1C6A0B3B36B82A17E757EB2384F69E7D /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; - 1E68F776BD8C564CF76865F60E2D7338 /* PFNullability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFNullability.h; sourceTree = ""; }; - 20E254CA0E4387DF2EB950F56CFD848A /* PFSignUpViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFSignUpViewController.m; path = ParseUI/Classes/SignUpViewController/PFSignUpViewController.m; sourceTree = ""; }; - 218BBDF1ADF497140951BF702196AD8A /* PFQuery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFQuery.h; sourceTree = ""; }; - 21930B8F5A2E3A4B419F4BA539177AB7 /* PFPrimaryButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFPrimaryButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.h; sourceTree = ""; }; + 17C0431787B6202B2A87A216D86980E4 /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 17FAD471627A4D869995BE055AA63801 /* PFProductTableViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFProductTableViewController.m; path = ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m; sourceTree = ""; }; + 1E52B6FDFE7367B8CB16245024DA0524 /* PFQueryTableViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFQueryTableViewController.m; path = ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m; sourceTree = ""; }; + 1E82555FF3BCB2F60800EF4601D379BF /* PFSignUpView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFSignUpView.m; path = ParseUI/Classes/SignUpViewController/PFSignUpView.m; sourceTree = ""; }; 21C0F51565A5346A442CC17CBFEE3FBD /* SoundPlayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SoundPlayer.swift; path = Spring/SoundPlayer.swift; sourceTree = ""; }; - 2244210AE6E65C8DC1D9E1DC7D61576C /* Result.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Result.swift; path = Source/Result.swift; sourceTree = ""; }; - 2315AB3B41F08F5D357FE042565C2D29 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; + 2367F80CD9F7C71DA4C63D30FBBADCE8 /* Spring-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Spring-prefix.pch"; sourceTree = ""; }; 243BD3D3C3D5BDAF745916587420D963 /* DesignableTabBarController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableTabBarController.swift; path = Spring/DesignableTabBarController.swift; sourceTree = ""; }; - 2718FE194388BF00B40644A37BA12500 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + 2490F7DAD75BF7DFC20AB48290DF7423 /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; + 251EEBE45B1DFC7FE457A7CE05D10C84 /* ParseUI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ParseUI-umbrella.h"; sourceTree = ""; }; + 255A0F85905C132A66880AEAC56B913C /* Bolts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Bolts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 26DAB12DDABFD4511181F007C98C61B8 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = ""; }; + 27A6C1C38D3E5DE37F31CC95DBF14527 /* Parse-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Parse-umbrella.h"; sourceTree = ""; }; 2834662A3665BDF7D2F61BA3631A66AD /* SpringLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringLabel.swift; path = Spring/SpringLabel.swift; sourceTree = ""; }; - 2980DE99020EB37F71A94BB7D9E83ECB /* Parse-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Parse-prefix.pch"; sourceTree = ""; }; + 287F2E1B0538CFE3329A3D1391FC26AA /* PFLogInView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLogInView.h; path = ParseUI/Classes/LogInViewController/PFLogInView.h; sourceTree = ""; }; + 2A3F33596F52BFB16F902E40F305DAF5 /* PFUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFUser.h; sourceTree = ""; }; 2A5B605BCB86C161823225245B5EDBB7 /* View+SnapKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "View+SnapKit.swift"; path = "Source/View+SnapKit.swift"; sourceTree = ""; }; + 2AD215A6C42AB54F2861297DF3FD37C9 /* SVProgressHUD.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.xcconfig; sourceTree = ""; }; 2B0270ACC0A1AAAC0088467BF0131477 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Source/Constraint.swift; sourceTree = ""; }; - 2C32CA54485DF0532765D86DFED06985 /* PFGeoPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFGeoPoint.h; sourceTree = ""; }; - 2D41E40E2524D17BE799BCA3C3247B33 /* Bolts.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Bolts.modulemap; sourceTree = ""; }; - 2D4F759353A8957B54E7F1FA28611B2B /* Bolts-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Bolts-Private.xcconfig"; sourceTree = ""; }; - 2E68507C083F44B56EED5B989CA4F69B /* Pods-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-umbrella.h"; sourceTree = ""; }; - 2EBE38E5067AE5D9C22F593A2666DC49 /* Bolts.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Bolts.m; path = Bolts/Common/Bolts.m; sourceTree = ""; }; - 3102047A87F834152B0127E2007B94F2 /* PFTableViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFTableViewCell.m; path = ParseUI/Classes/Cells/PFTableViewCell.m; sourceTree = ""; }; - 329A7719D2CBCFE9200E3E3CFDB83E99 /* Parse-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Parse-umbrella.h"; sourceTree = ""; }; - 33060C546CC3A12A34E4DC4F1BEBEA13 /* PFSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFSession.h; sourceTree = ""; }; - 334C27B878CB55A2E533EEB5FEFAF669 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; - 33F10576660B378B4CFC07528FF421DB /* PFTextButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFTextButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFTextButton.m; sourceTree = ""; }; - 36E1BE52952D79B058C7BE0DFA36EC46 /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = ""; }; - 37466D05C28946491C8B6F92E1AF34F0 /* PFTextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFTextField.m; path = ParseUI/Classes/Views/PFTextField.m; sourceTree = ""; }; - 3774BC83FF5F45C194A097082834BC59 /* PFCloud.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFCloud.h; sourceTree = ""; }; + 2B748C4E502CD0B31F51CCEBF5C8A726 /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; + 2CB33ED17B11C58A1FCA60100C9180DF /* PFNullability.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFNullability.h; sourceTree = ""; }; + 2F28B38ADA21BADEFC96D97F8041A278 /* PFFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFFile.h; sourceTree = ""; }; + 2FC013551073BD0AD5E061F682C410DA /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = ""; }; + 3001B71F3724D4037E90DEE08F56F12F /* BFCancellationTokenRegistration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenRegistration.m; path = Bolts/Common/BFCancellationTokenRegistration.m; sourceTree = ""; }; + 30EAFCF691EA32F049B27A68363A1804 /* BFCancellationToken.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationToken.m; path = Bolts/Common/BFCancellationToken.m; sourceTree = ""; }; + 3185718E27DC8A81E079E142B7D32ACE /* PFAlertView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFAlertView.h; path = ParseUI/Classes/Internal/Extensions/PFAlertView.h; sourceTree = ""; }; + 33BF98421E77DCEB4DF65DFC0462C62C /* PFPurchase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFPurchase.h; sourceTree = ""; }; + 34180C62239AE4F47CCB1C87BDB1E856 /* Parse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Parse.h; sourceTree = ""; }; + 35503964B683B866056E0E48C1C86E5B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 361AE4BA7BBCA5B9BE1E48BC4C58EF0A /* PFTableViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFTableViewCell.h; path = ParseUI/Classes/Cells/PFTableViewCell.h; sourceTree = ""; }; + 361CCB3153F3E0B7B7F5B394C3959DA3 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; 37F3D3BA73F633688D4B0A041AFDFEFF /* BlurView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BlurView.swift; path = Spring/BlurView.swift; sourceTree = ""; }; - 3B4401440DB72F77A0EE1F7DD76DD0F8 /* PFProduct.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFProduct.h; sourceTree = ""; }; - 3BA75C13F675948CCDEFF6EFE449CD18 /* Parse-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Parse-Private.xcconfig"; sourceTree = ""; }; - 3D0E67B2901EB5C44772E4815027EA15 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 3D9FCF401A907593B351131A977C75EA /* PFLoadingView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFLoadingView.m; path = ParseUI/Classes/Internal/Views/PFLoadingView.m; sourceTree = ""; }; + 38232F71D881443850F7C61339A90F07 /* PFImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFImageView.h; path = ParseUI/Classes/Views/PFImageView.h; sourceTree = ""; }; + 3854AECC1465D66E5D45DD77183F8C60 /* BFTaskCompletionSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTaskCompletionSource.h; path = Bolts/Common/BFTaskCompletionSource.h; sourceTree = ""; }; + 39119B303358B59CA3AEED3CCB2CD300 /* PFCollectionViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFCollectionViewCell.m; path = ParseUI/Classes/Cells/PFCollectionViewCell.m; sourceTree = ""; }; + 393B79938ACB795322FFB8E7CFA4E94F /* PFSession.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFSession.h; sourceTree = ""; }; + 3A45568AD0D13EB41FA696A0E1B9C5EC /* BoltsVersion.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BoltsVersion.h; path = Bolts/Common/BoltsVersion.h; sourceTree = ""; }; + 3ACBC43B508943DB8829B56E0FFEFCDB /* ParseUI-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "ParseUI-Private.xcconfig"; sourceTree = ""; }; + 3AE26F23E78236AF895151F7AFE72677 /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; + 3D91B922667273EA65C1C147B5BFC61C /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3DBD3F68F708AA6E6115CA4B4FCA0258 /* SnapKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3E1CEBC0D4DD95983BCBDA3225FEB8ED /* PFRect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFRect.m; path = ParseUI/Classes/Internal/Extensions/PFRect.m; sourceTree = ""; }; + 3F32D03A88F4C9F5D894D3B884BB4F28 /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; + 3F8C79A2B090D23F858817C6E00CDE75 /* Spring.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Spring.xcconfig; sourceTree = ""; }; 3F9CC2BB93470648CCEE42F06CF16EF1 /* SpringButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringButton.swift; path = Spring/SpringButton.swift; sourceTree = ""; }; + 3FE434FC71E0D089BEB8336E256F09A4 /* ParseUI.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ParseUI.xcconfig; sourceTree = ""; }; + 40AA194BEE16DE1048660D180335E1F3 /* BFExecutor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFExecutor.m; path = Bolts/Common/BFExecutor.m; sourceTree = ""; }; 413D4C68BCDED964834146EFB422C3B3 /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = ""; }; - 4165840F4852501AC5A7E661580C375E /* Bolts-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Bolts-dummy.m"; sourceTree = ""; }; - 41F1FCAF1DC8F8DA0B8C4816C29AF149 /* PFRelation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFRelation.h; sourceTree = ""; }; - 4227AAB17CD9D4CEF8AE341A7D04B748 /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SnapKit.modulemap; sourceTree = ""; }; - 42451D5EFB5EF882B747D212A3E99173 /* PFFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFFile.h; sourceTree = ""; }; - 43DD19A7937FD56AEF4B9B78D9296E32 /* PFProductTableViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFProductTableViewController.m; path = ParseUI/Classes/ProductTableViewController/PFProductTableViewController.m; sourceTree = ""; }; + 419B65045CFC7415BFC7F9ADCEFDA5DA /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; + 43DBB1BEAFA6DC6E11DE1350BE6C9929 /* PFAnalytics.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFAnalytics.h; sourceTree = ""; }; 451746300E823F97EB2F05F955A14B46 /* Spring.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Spring.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 459753A28F648AD1C23AEA099281663F /* Alamofire-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-prefix.pch"; sourceTree = ""; }; - 473927365B9FCAEE40A98098760F529E /* PFActivityIndicatorCollectionReusableView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFActivityIndicatorCollectionReusableView.m; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.m; sourceTree = ""; }; - 48F44658EFCC9D962C723EF00D444C88 /* Bolts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Bolts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 49E84A74508C9E0B0216D2077A293601 /* PFObject+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PFObject+Subclass.h"; sourceTree = ""; }; + 452DC8A60EA82130BC0456AE720EFECD /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 4653940AC5534DC8D14E82222B585277 /* PFTextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFTextField.h; path = ParseUI/Classes/Views/PFTextField.h; sourceTree = ""; }; + 46F6C000C5DAF9A479F512AB77E75534 /* PFDismissButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFDismissButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFDismissButton.h; sourceTree = ""; }; + 49E8B5BC6CBC055DEAF397C5CB7B7EF3 /* PFAlertView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFAlertView.m; path = ParseUI/Classes/Internal/Extensions/PFAlertView.m; sourceTree = ""; }; + 4A094507A53DF403A0A95F04F593F90B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4A7246CE28A0DAEEF10FD13FB451EB51 /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; + 4A7F748596AE965EB0E37E3671A4E832 /* Bolts-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Bolts-prefix.pch"; sourceTree = ""; }; 4ACF5E472382B95FBDED0550E24C18DB /* Spring-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Spring-umbrella.h"; sourceTree = ""; }; + 4D3A264E34E686C9B6455DF0F4D7D0AA /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; + 4D5BABFE5290CD0BEBCDBC63FA523652 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 4DF1373004EE5CF38BDD54B6746887D0 /* LoadingView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LoadingView.swift; path = Spring/LoadingView.swift; sourceTree = ""; }; - 4EA213B03487BDD4FB41013E76DC09BD /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; - 500182D1D79F038B835937E6DE83DE75 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 50AB8DC0029F616AC6A34A74FDAFD750 /* KeyboardLayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KeyboardLayoutConstraint.swift; path = Spring/KeyboardLayoutConstraint.swift; sourceTree = ""; }; - 50F8C96A23850452A0CFDCB06D2F55D2 /* Parse.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Parse.xcconfig; sourceTree = ""; }; - 51909C7F1AD1EBABD6272372A4140053 /* ParseUI-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "ParseUI-Private.xcconfig"; sourceTree = ""; }; - 5398C34213A73B844438E6B71AA0BCED /* ServerTrustPolicy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ServerTrustPolicy.swift; path = Source/ServerTrustPolicy.swift; sourceTree = ""; }; - 5686FB083709538D706C4D268762D6CB /* Alamofire-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Alamofire-umbrella.h"; sourceTree = ""; }; - 56F0C1D85586744FA2BFCA00EF37E6E0 /* Bolts.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bolts.xcconfig; sourceTree = ""; }; - 5D1D96B881F470CF00BD5285A198D730 /* Bolts-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Bolts-umbrella.h"; sourceTree = ""; }; - 5E9CCFAB17FA3A760D0191E1338C5397 /* PFPurchaseTableViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFPurchaseTableViewCell.h; path = ParseUI/Classes/Cells/PFPurchaseTableViewCell.h; sourceTree = ""; }; - 5F9D70004C3C93742BE50B92B574BA85 /* PFConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFConstants.h; sourceTree = ""; }; + 54CAE8C301393C47EB390B9074376B1C /* SnapKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.xcconfig; sourceTree = ""; }; + 5539396381995F75FED1503E91D2B3B6 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; + 57A6ABD3FCD0FB0C7D186A76E30CF307 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; + 580BBB40693DD05A0D17909B61A28D49 /* PFObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFObject.h; sourceTree = ""; }; + 587F78E603C59E2CA76F1F87E9290AC8 /* PFQueryCollectionViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFQueryCollectionViewController.m; path = ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m; sourceTree = ""; }; + 58B84FCC85A22611DC2837E4FC73EEF8 /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; + 59A73E110ED76AF3934F053161974C9D /* PFImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFImage.m; path = ParseUI/Classes/Internal/Extensions/PFImage.m; sourceTree = ""; }; + 5A1AB3293CE8E2847302D74F97634EC9 /* PFInstallation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFInstallation.h; sourceTree = ""; }; + 5B91690FAC44BB238E55220E574A4A1F /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; + 5D6738B20E7D15C17765999C766CE414 /* Pods-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-dummy.m"; sourceTree = ""; }; + 5F5388130D37843645ADF5DCA408FB72 /* Alamofire-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Alamofire-Private.xcconfig"; sourceTree = ""; }; + 5F5B9A0BE0E6F9C012C548E4FEC305DE /* PFCollectionViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFCollectionViewCell.h; path = ParseUI/Classes/Cells/PFCollectionViewCell.h; sourceTree = ""; }; + 60240177579FFF75A882FE7C92FE294E /* PFAnonymousUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFAnonymousUtils.h; sourceTree = ""; }; 60B11326E117F16B77C4601D8FF6FC0B /* Spring.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Spring.swift; path = Spring/Spring.swift; sourceTree = ""; }; + 60D28430C5C6A43297B289461DFE76C5 /* PFPurchaseTableViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFPurchaseTableViewCell.h; path = ParseUI/Classes/Cells/PFPurchaseTableViewCell.h; sourceTree = ""; }; 6106FA0626AF6849CC0B8FA5321C5814 /* Images.xcassets */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = SpringApp/Images.xcassets; sourceTree = ""; }; - 6365DB4F685EE8AA8EA5C24C0D0D1285 /* Parse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = Parse.h; sourceTree = ""; }; + 62D8DFDFFFC08DF7611DB6BD4E32F0E8 /* BFCancellationTokenSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenSource.m; path = Bolts/Common/BFCancellationTokenSource.m; sourceTree = ""; }; 644DF8F1DD47151F078FE505B9287BE4 /* AsyncImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncImageView.swift; path = Spring/AsyncImageView.swift; sourceTree = ""; }; - 654163298B34355180357BD7202005E8 /* ParameterEncoding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ParameterEncoding.swift; path = Source/ParameterEncoding.swift; sourceTree = ""; }; - 66DEEA830E416518FC457F0BCE0415DC /* PFQueryTableViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFQueryTableViewController.h; path = ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h; sourceTree = ""; }; - 66EA5941F2B36360103507DAB9E6258D /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; - 6B3767E0B6C96A11BA344206F79A0501 /* Alamofire.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Alamofire.xcconfig; sourceTree = ""; }; - 6B677FC715FDBCE4406BD1EB97AF508E /* PFActionButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFActionButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFActionButton.m; sourceTree = ""; }; - 6BF41205D5F55CF1390FF22F32596A83 /* Validation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Validation.swift; path = Source/Validation.swift; sourceTree = ""; }; - 6CD17B0D501488D7E11F7ED3E18444DF /* PFDismissButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFDismissButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFDismissButton.m; sourceTree = ""; }; - 6DA3F7D9BF1684804E8A97A7AA738E62 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 649C270409F15243E795A445A0FF6FF3 /* PFPurchaseTableViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFPurchaseTableViewCell.m; path = ParseUI/Classes/Cells/PFPurchaseTableViewCell.m; sourceTree = ""; }; + 66599A0C11C7DF068DFE811FEE10B12F /* PFRelation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFRelation.h; sourceTree = ""; }; + 6DD4947BED6E6A5E9149DD5163F19B39 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = ""; }; 6E13811703F4D15A85A9D2260B00A6A8 /* SnapKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SnapKit.swift; path = Source/SnapKit.swift; sourceTree = ""; }; + 6EF89611E10DF1324285A32294D1E52B /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 6F5FA4219C27344F5A01D3CDD86C3EAB /* Spring-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Spring-dummy.m"; sourceTree = ""; }; - 7043FB2241DD3BFD163B10202318FBD5 /* PFRect.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFRect.h; path = ParseUI/Classes/Internal/Extensions/PFRect.h; sourceTree = ""; }; 714B835B557B3F72D89945095C23B1A4 /* DesignableLabel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableLabel.swift; path = Spring/DesignableLabel.swift; sourceTree = ""; }; - 726340FD7A6DA30E8F9C818792479A74 /* PFImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFImageCache.m; path = ParseUI/Classes/Internal/PFImageCache.m; sourceTree = ""; }; + 73839B2A8E1B09479C277ADF660E0007 /* PFGeoPoint.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFGeoPoint.h; sourceTree = ""; }; 73DD0FB30CDB217927C27FE7D04F75EE /* SpringTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringTextView.swift; path = Spring/SpringTextView.swift; sourceTree = ""; }; - 74644F56B2B1BF51955065D573BCAFFF /* PFCollectionViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFCollectionViewCell.m; path = ParseUI/Classes/Cells/PFCollectionViewCell.m; sourceTree = ""; }; 747EC9F42A32387A595E40BE8E658168 /* DesignableTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableTextField.swift; path = Spring/DesignableTextField.swift; sourceTree = ""; }; - 76DF3B10F049D7F6816FAA620502C379 /* Spring.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Spring.xcconfig; sourceTree = ""; }; - 784252093BB669E51E962FA3A895C071 /* ParseUI-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ParseUI-prefix.pch"; sourceTree = ""; }; + 74E0F2B09B2747B927DC8FDCE9A2802B /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 758F96886628277588E5FF023D967966 /* PFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFNetworkActivityIndicatorManager.h; sourceTree = ""; }; + 764A7ACB5CEA95AAD604FD3E83E642C8 /* PFSubclassing.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFSubclassing.h; sourceTree = ""; }; + 787CDA821FFDFB2F042AC9C6CA614F0D /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 799F700E0350C1622AF654FBAC56DC3E /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Source/ConstraintAttributes.swift; sourceTree = ""; }; 79A9DEDC89FE8336BF5FEDAAF75BF7FC /* Pods.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Pods.modulemap; sourceTree = ""; }; 79D7963F02D79E7AF9280CB2426B041D /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Source/ConstraintRelation.swift; sourceTree = ""; }; - 7A1F24548E146566C61A6DAED05EEE17 /* Spring.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Spring.modulemap; sourceTree = ""; }; 7B639C1CF665CE74FBD6494B9A6633AC /* DesignableImageView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableImageView.swift; path = Spring/DesignableImageView.swift; sourceTree = ""; }; - 7B6643B0DA0A5E02F0020A3FF33B7346 /* Alamofire-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Alamofire-Private.xcconfig"; sourceTree = ""; }; - 7CFAA8ECCA0D31547511C97AE749943D /* PFLogInView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLogInView.h; path = ParseUI/Classes/LogInViewController/PFLogInView.h; sourceTree = ""; }; - 7D84902042741975B690B3ED3FE6A531 /* PFQueryTableViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFQueryTableViewController.m; path = ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.m; sourceTree = ""; }; - 8287E9D17815F27FF2B1FB1C05F6BAFC /* Alamofire.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Alamofire.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 7C184939B6244BDD621865D1A38AE765 /* PFConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFConstants.h; sourceTree = ""; }; + 7F3BDBDFC00CF6E0DF16B39FD8C63932 /* Bolts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Bolts.h; path = Bolts/Common/Bolts.h; sourceTree = ""; }; + 7FF8CFB8D4402E5960D141A0948269C8 /* PFConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFConfig.h; sourceTree = ""; }; + 82F797AA556F23E825A45094B4EB475D /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 83D313E70FABD3B63D31116FC62DDD68 /* TransitionManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransitionManager.swift; path = Spring/TransitionManager.swift; sourceTree = ""; }; - 85FC6B815CCEAABA71054B628DF69A90 /* BFTaskCompletionSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTaskCompletionSource.m; path = Bolts/Common/BFTaskCompletionSource.m; sourceTree = ""; }; - 86B3B2F11837A37D812CE9BF9D034517 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; 87B213035BAC5F75386F62D3C75D2342 /* Pods-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-acknowledgements.plist"; sourceTree = ""; }; - 88D6940C6BC089F231E8F64EF7B55D2B /* Request.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Request.swift; path = Source/Request.swift; sourceTree = ""; }; - 89269306E96C93939F7F0150C232F262 /* PFColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFColor.h; path = ParseUI/Classes/Internal/Extensions/PFColor.h; sourceTree = ""; }; - 89A3850622568B464722BDD8E48AE401 /* Bolts.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Bolts.h; path = Bolts/Common/Bolts.h; sourceTree = ""; }; - 8AD6A19BAC94D423253666DE63A53BBD /* BFExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFExecutor.h; path = Bolts/Common/BFExecutor.h; sourceTree = ""; }; - 8B30A225F9EB005CF64C491C590F7507 /* PFRect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFRect.m; path = ParseUI/Classes/Internal/Extensions/PFRect.m; sourceTree = ""; }; - 8E08206DCF1412A04160C2A026B636E0 /* PFDismissButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFDismissButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFDismissButton.h; sourceTree = ""; }; - 90BC08A82FA5C4B953FD4C7514080F33 /* PFActivityIndicatorTableViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFActivityIndicatorTableViewCell.m; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.m; sourceTree = ""; }; + 88A9999091877EA5951B69EDFEE2FD28 /* PFSignUpViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFSignUpViewController.h; path = ParseUI/Classes/SignUpViewController/PFSignUpViewController.h; sourceTree = ""; }; + 89F9035656D010E40C47CF4C678762FF /* Manager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Manager.swift; path = Source/Manager.swift; sourceTree = ""; }; + 8AE4453606003C10B246472F98990A7F /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = ""; }; + 8CA2993073BEF1F00E8E948D6F17C0FF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; + 8CF6C6C4FB470F1171F45C2EC9165A80 /* ParseUI.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = ParseUI.modulemap; sourceTree = ""; }; + 8D4953D83FB9DEA59D16F16B0771382F /* PFLogInViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFLogInViewController.m; path = ParseUI/Classes/LogInViewController/PFLogInViewController.m; sourceTree = ""; }; + 8DF048DA12B53C2BDFD683E1A1826550 /* Parse-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Parse-prefix.pch"; sourceTree = ""; }; + 8FFAE60111F4E1BE0FCEBF43495DA498 /* BFTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTask.m; path = Bolts/Common/BFTask.m; sourceTree = ""; }; 91059726DC94563BC9E3159625138DBE /* AutoTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AutoTextView.swift; path = Spring/AutoTextView.swift; sourceTree = ""; }; 936EA872CF8E0965EED1956E3083186F /* Spring-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Spring-Private.xcconfig"; sourceTree = ""; }; - 94F47B0A77561D770A81AB69BB0D18BD /* ResponseSerialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ResponseSerialization.swift; path = Source/ResponseSerialization.swift; sourceTree = ""; }; - 996CD86C6B353E7971E1801581C7687E /* PFRole.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFRole.h; sourceTree = ""; }; - 9AEE8FA20AB847F641C7E19D78474281 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; - 9B5DB94AC2832BA38609FBB4A1FDA55B /* PFLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLocalization.h; path = ParseUI/Classes/Internal/PFLocalization.h; sourceTree = ""; }; - 9E31572980E14568528FF85DF2F5530A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 94319398A39678774385D6CFCB352A28 /* PFQuery.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFQuery.h; sourceTree = ""; }; + 94AD46168A063C7E554F8044577161EB /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9731F663579CFEE575FAD61109772AA6 /* BFTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTask.h; path = Bolts/Common/BFTask.h; sourceTree = ""; }; + 9849C347117249E71063E2F2ECD55E7E /* PFPrimaryButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFPrimaryButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.h; sourceTree = ""; }; + 98717A9D86302BD9634E2238C4396C22 /* PFActivityIndicatorCollectionReusableView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFActivityIndicatorCollectionReusableView.m; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.m; sourceTree = ""; }; + 9A3B5511329E515AC93B77B0CD4A74E0 /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9DBF5386BD59DD908C3BBB66F313924C /* SVProgressHUD-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SVProgressHUD-Private.xcconfig"; sourceTree = ""; }; + 9DE37557D9AE8CF09267DEAE8E6A680A /* PFActionButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFActionButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFActionButton.h; sourceTree = ""; }; 9E4A04412784B2B3A8735C7186E1AE16 /* TransitionZoom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TransitionZoom.swift; path = Spring/TransitionZoom.swift; sourceTree = ""; }; + 9E4FCBCFBF362B9CE50CC3A550C206F8 /* Parse-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Parse-dummy.m"; sourceTree = ""; }; + 9EDE0C8044AC622910A88EAC11D6BEB1 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; }; 9F9876D10625C1E9006562055D3BF119 /* SpringAnimation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringAnimation.swift; path = Spring/SpringAnimation.swift; sourceTree = ""; }; + 9FAF50DB4863046581B97E4A9EBA539F /* ParseUI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ParseUI-dummy.m"; sourceTree = ""; }; + 9FDFE426B21728242B5E57E6BC095106 /* PFColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFColor.h; path = ParseUI/Classes/Internal/Extensions/PFColor.h; sourceTree = ""; }; A00F6A7822756001C1AC412B0A1751A8 /* ViewController+SnapKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ViewController+SnapKit.swift"; path = "Source/ViewController+SnapKit.swift"; sourceTree = ""; }; - A03272D0EBBFA0A4B6F3F592AF579D10 /* PFPush.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFPush.h; sourceTree = ""; }; - A074C71E41494C35BFEA474B0CB0387B /* PFAlertView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFAlertView.h; path = ParseUI/Classes/Internal/Extensions/PFAlertView.h; sourceTree = ""; }; - A09E2048281B47F3A22B7A84C7B22F3D /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - A15C2126FDF4473D9BB99A0A673C34F6 /* ParseUI-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ParseUI-umbrella.h"; sourceTree = ""; }; - A4787BEA987B200817A79F0029183243 /* MultipartFormData.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MultipartFormData.swift; path = Source/MultipartFormData.swift; sourceTree = ""; }; - A7EC8D261DE19EA24B57B2217D46056C /* PFResources.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFResources.m; path = ParseUI/Generated/PFResources.m; sourceTree = ""; }; - A7FD3B441184263DF43CB5142A4A8B68 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; - A80B5C0BF5D2CDCBA1B8EABCBAD8D729 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.release.xcconfig; sourceTree = ""; }; - A90D90B3C40658B1618985F4AE5619A2 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/StoreKit.framework; sourceTree = DEVELOPER_DIR; }; - A91973A30FFA50DA9B85027FD1FF3FB4 /* PFActivityIndicatorTableViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFActivityIndicatorTableViewCell.h; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.h; sourceTree = ""; }; - A9EE46757E86ED5193A14869F17EC76F /* BFDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFDefines.h; path = Bolts/Common/BFDefines.h; sourceTree = ""; }; - AA2EDC1D1CC3E22DC0EEB7336E08F868 /* ParseUI.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ParseUI.xcconfig; sourceTree = ""; }; - ACD95C6A17107D7B0D4151CA092A2DC2 /* PFImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFImageCache.h; path = ParseUI/Classes/Internal/PFImageCache.h; sourceTree = ""; }; - AD09D8CAABCAADEE168B585A7AC3484A /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - ADE720C9B4B640594229F580C98F6B17 /* BFCancellationTokenRegistration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenRegistration.h; path = Bolts/Common/BFCancellationTokenRegistration.h; sourceTree = ""; }; - AF0BC9C185347166C89926CDEBE24DD9 /* libParseLib.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = libParseLib.a; sourceTree = ""; }; - AFB8F09E68527ED0E4AC084DCAED6738 /* BFTask.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTask.m; path = Bolts/Common/BFTask.m; sourceTree = ""; }; - B02835E66DD9F8CD48090DE4A146B58B /* PFImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFImageView.h; path = ParseUI/Classes/Views/PFImageView.h; sourceTree = ""; }; - B0F8719E85935AC69D18E6940DA61A3B /* PFQueryCollectionViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFQueryCollectionViewController.h; path = ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h; sourceTree = ""; }; - B24120BF8EC11CBA67082CE3CA86552B /* Stream.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stream.swift; path = Source/Stream.swift; sourceTree = ""; }; - B2F0FC66388874B19F7B6FCC59571B45 /* PFTextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFTextField.h; path = ParseUI/Classes/Views/PFTextField.h; sourceTree = ""; }; + A048B1BF5DCBF924412F6482CD927CDE /* PFACL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFACL.h; sourceTree = ""; }; + A0985500DFF9DA15F13E1202ED5A30B4 /* PFRect.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFRect.h; path = ParseUI/Classes/Internal/Extensions/PFRect.h; sourceTree = ""; }; + A3FE2C4B23714CFA2B84BE045055D140 /* PFResources.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFResources.m; path = ParseUI/Generated/PFResources.m; sourceTree = ""; }; + A41FE48E86FB615385D9E58F2A46C197 /* BFTaskCompletionSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFTaskCompletionSource.m; path = Bolts/Common/BFTaskCompletionSource.m; sourceTree = ""; }; + A5ECBAFFF053A6A15A5F57B72831BE1F /* PFPush.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFPush.h; sourceTree = ""; }; + A63D66E105FAB952F2B231E32A6C45D9 /* Bolts.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Bolts.xcconfig; sourceTree = ""; }; + A65101DC9EB52DC9111DF0C0601F5128 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Pods.debug.xcconfig; sourceTree = ""; }; + A6842DE3ED0513931D3916952F3A3E51 /* PFImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFImageCache.h; path = ParseUI/Classes/Internal/PFImageCache.h; sourceTree = ""; }; + A937B72EFE45FCFB236A6081E5E742CE /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SnapKit.modulemap; sourceTree = ""; }; + A98FE1CBBD63800685546A1781C7DA16 /* PFActivityIndicatorTableViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFActivityIndicatorTableViewCell.m; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.m; sourceTree = ""; }; + AA4CD17C753943BD57F738C6F2969DF4 /* Bolts-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Bolts-umbrella.h"; sourceTree = ""; }; + AD6DD3C95F055B9583AACA7C250FCD2F /* BFCancellationToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationToken.h; path = Bolts/Common/BFCancellationToken.h; sourceTree = ""; }; + AE363BE2712AC08ED24167DE8B2CB441 /* PFActionButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFActionButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFActionButton.m; sourceTree = ""; }; + AE710F8773C9553F950D376DC3AAACAC /* Parse.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Parse.modulemap; sourceTree = ""; }; + AEF410AC64C0A37F9B5760AAC51EC79F /* Bolts-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Bolts-dummy.m"; sourceTree = ""; }; + B01EE46937CA861B9BC5A7EF186D5A6E /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B03B94162B852FAF229D6CB4D1FC0BBA /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; + B06C4A1F0FEB3928451E0B19164C2458 /* PFColor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFColor.m; path = ParseUI/Classes/Internal/Extensions/PFColor.m; sourceTree = ""; }; + B369AF375B9E55D80FE78521D07277C9 /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = ""; }; B47A46C4CDA26763F8A89977615BA750 /* SpringTextField.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringTextField.swift; path = Spring/SpringTextField.swift; sourceTree = ""; }; - B61F5ED2D9D993BCDEFA59B7D363A3E2 /* PFQueryCollectionViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFQueryCollectionViewController.m; path = ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.m; sourceTree = ""; }; - B72A9030BB75EDC7C949460E09DFFC34 /* Empty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Empty.m; sourceTree = ""; }; - B754C8C2763C267AB8D2F38C50C413F4 /* Spring-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Spring-prefix.pch"; sourceTree = ""; }; - B7FB992F77D278FC791010D485641B31 /* Bolts-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Bolts-prefix.pch"; sourceTree = ""; }; + B47D4A862DA291B637244015E9A747F3 /* Alamofire.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Alamofire.modulemap; sourceTree = ""; }; + B4E7832EE809C6BEC9E007BBEA7E0278 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + B4FCFF441BC88C3C93440C8AB5AC4D4F /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = ""; }; + B53D33994CE2FBCF8BF2FD438BD01156 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en.lproj; path = ParseUI/Resources/Localization/en.lproj; sourceTree = ""; }; + B6934BA8B55F3743F804D6BAEB21CD6C /* Pods-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-umbrella.h"; sourceTree = ""; }; + B9C218EDD3D6766266752789E0C64270 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - BB6CDDB8B7D0F8F3AEA0B9B417D8EE65 /* PFAlertView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFAlertView.m; path = ParseUI/Classes/Internal/Extensions/PFAlertView.m; sourceTree = ""; }; - BE6DBD9263E4AAB7DEEA032905A4FBCC /* PFCollectionViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFCollectionViewCell.h; path = ParseUI/Classes/Cells/PFCollectionViewCell.h; sourceTree = ""; }; - C0FD247C315187490BD81A1DD97F1E7E /* PFTwitterUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFTwitterUtils.h; sourceTree = ""; }; + BFDA6A3801715C48196AD0B41E0D706E /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; }; + BFF13EF2BB4110FB1C597DCDFB3B8739 /* PF_Twitter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PF_Twitter.h; sourceTree = ""; }; + C1C59DE2E0089E70C3193D405C3FD899 /* PFTextButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFTextButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFTextButton.h; sourceTree = ""; }; + C21DCF345E330EE72957CA2945D9E320 /* BFDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFDefines.h; path = Bolts/Common/BFDefines.h; sourceTree = ""; }; C28517CF1749DF981B83A9F1D8542FF5 /* DesignableTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableTextView.swift; path = Spring/DesignableTextView.swift; sourceTree = ""; }; - C302836E12DD36986981D7278F790E48 /* BFCancellationTokenSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenSource.h; path = Bolts/Common/BFCancellationTokenSource.h; sourceTree = ""; }; - C307288668C20E0C1AC8C4F54C1F794A /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; - C3AFF7B7B40645594019B3C0D7E3C17B /* PFTextButton.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFTextButton.h; path = ParseUI/Classes/Internal/Views/Buttons/PFTextButton.h; sourceTree = ""; }; - C3CC1F31D0EE6E4E95F4A54BEBD94105 /* PFInstallation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFInstallation.h; sourceTree = ""; }; C55DE6BD2C60A6FC893D8DB339FC4553 /* LoadingView.xib */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file.xib; name = LoadingView.xib; path = Spring/LoadingView.xib; sourceTree = ""; }; - C593C67ED65005EBD07E350C9D1EEEAD /* PFObject.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFObject.h; sourceTree = ""; }; - C6297B2E3EADBDD08EEBADBD52B97D2B /* Parse.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Parse.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C58634FA13A6634E61C5B04D59A8DAA8 /* PFQueryTableViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFQueryTableViewController.h; path = ParseUI/Classes/QueryTableViewController/PFQueryTableViewController.h; sourceTree = ""; }; + C8AF90FFDF0E29A47B4C8FCC52D467B9 /* PFTableViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFTableViewCell.m; path = ParseUI/Classes/Cells/PFTableViewCell.m; sourceTree = ""; }; C96B6E188B9C19B02F7A48882B460FF1 /* AsyncButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncButton.swift; path = Spring/AsyncButton.swift; sourceTree = ""; }; + CA37B3BF8163FC1B2564F1ED3AB4064C /* PFLocalization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLocalization.h; path = ParseUI/Classes/Internal/PFLocalization.h; sourceTree = ""; }; CA6701D0395AA53671F30906FDA34B59 /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Source/Debugging.swift; sourceTree = ""; }; + CA9A9FF1BE67E6F1D81A8AE234171004 /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; + CBB868387C6F0F3FCA32935DB61D9E54 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; CBC0F7C552B739C909B650A0F42F7F38 /* Pods-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-resources.sh"; sourceTree = ""; }; - CC33F7917F30F0D128EB4597C33A850A /* PFColor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFColor.m; path = ParseUI/Classes/Internal/Extensions/PFColor.m; sourceTree = ""; }; + CDE8C59AE734C3CB9FBF86DD3A73A3B1 /* PFImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFImageView.m; path = ParseUI/Classes/Views/PFImageView.m; sourceTree = ""; }; D0405803033A2A777B8E4DFA0C1800ED /* Pods-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-acknowledgements.markdown"; sourceTree = ""; }; - D0ADFD5CDCB8C9CEE2DB0BBBD014FE2B /* PFSignUpViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFSignUpViewController.h; path = ParseUI/Classes/SignUpViewController/PFSignUpViewController.h; sourceTree = ""; }; - D0C981B189C7B5FAD2129888F960302F /* Alamofire.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alamofire.swift; path = Source/Alamofire.swift; sourceTree = ""; }; - D21B5F4DF182266FD1A2E7A3CC2C9380 /* PFImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFImageView.m; path = ParseUI/Classes/Views/PFImageView.m; sourceTree = ""; }; + D16DB5B5AECAA4767402AED1142C6FEA /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = ""; }; D367D337E0670CA623B6F343C738D610 /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapKit-dummy.m"; sourceTree = ""; }; - D8FE715741A6CACA712C2DDAD4741342 /* PFUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFUser.h; sourceTree = ""; }; - D93BFC186680649D781B3FA74C419509 /* Alamofire-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Alamofire-dummy.m"; sourceTree = ""; }; - DA38F77C56A772D55C417E71256CD3B0 /* Download.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Download.swift; path = Source/Download.swift; sourceTree = ""; }; - DA65C47034D64F26A07A53F5D6A60A74 /* PFLogInView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFLogInView.m; path = ParseUI/Classes/LogInViewController/PFLogInView.m; sourceTree = ""; }; + D48112844885EDAF5448F14A700892D2 /* Parse.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Parse.xcconfig; sourceTree = ""; }; + D556F6BA06CBFD0CC18F6433222525A5 /* BFCancellationTokenRegistration.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenRegistration.h; path = Bolts/Common/BFCancellationTokenRegistration.h; sourceTree = ""; }; + D5A224DBD1851D9A7E3290BDEC07AD17 /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = ""; }; + D5C64F6E8F39ABB3FA04C92A2AC029EC /* PFQueryCollectionViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFQueryCollectionViewController.h; path = ParseUI/Classes/QueryCollectionViewController/PFQueryCollectionViewController.h; sourceTree = ""; }; + D876AEEF955131084C645A3B0B8BD887 /* PFRole.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFRole.h; sourceTree = ""; }; + D89EA957697F1D1474A399583AF1D5FD /* PFActivityIndicatorTableViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFActivityIndicatorTableViewCell.h; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorTableViewCell.h; sourceTree = ""; }; + D92805B1FFCFA09B998BB798CFFEEFF7 /* BFExecutor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFExecutor.h; path = Bolts/Common/BFExecutor.h; sourceTree = ""; }; + D98345F1E23E7A01AC789E1397E9CD5E /* PFImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFImage.h; path = ParseUI/Classes/Internal/Extensions/PFImage.h; sourceTree = ""; }; + D9AD49BAEA0F96BEDEDF75689E5E80A5 /* Empty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = Empty.m; sourceTree = ""; }; DAB550BFBDE25FD73B2CAF77A9F8FBBD /* SpringView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpringView.swift; path = Spring/SpringView.swift; sourceTree = ""; }; + DB24F8C7D8E68C58067814621FD731D4 /* Upload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Upload.swift; path = Source/Upload.swift; sourceTree = ""; }; DB44D45A9A34C20A034D0D004999B563 /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Source/LayoutConstraint.swift; sourceTree = ""; }; - DC48B0E3AA4A922AFE9B6D1A9C2B0D37 /* PFLogInViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFLogInViewController.m; path = ParseUI/Classes/LogInViewController/PFLogInViewController.m; sourceTree = ""; }; - DD3D276244CFAD2FD599BB2936EEE7F3 /* PFPurchaseTableViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFPurchaseTableViewCell.m; path = ParseUI/Classes/Cells/PFPurchaseTableViewCell.m; sourceTree = ""; }; + DDD544D69B1394A01990CECAA59CD501 /* PFDismissButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFDismissButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFDismissButton.m; sourceTree = ""; }; + DF8E508997C84C0C000C1278A94406DE /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = ""; }; E11A7B60D7208B393697E6DBAC0309DA /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Source/ConstraintMaker.swift; sourceTree = ""; }; - E130EDD8D847450BFD0CFBDCEA1C8B34 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = Source/Error.swift; sourceTree = ""; }; - E20A125CCB0E552FEF69171F2DEBB281 /* Bolts.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Bolts.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E400FE1997044A10576B564EF91BCAB7 /* BFCancellationTokenSource.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenSource.m; path = Bolts/Common/BFCancellationTokenSource.m; sourceTree = ""; }; - E56673E8C14F7BD870A9F24D8753B937 /* Parse-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Parse-dummy.m"; sourceTree = ""; }; - E596E2F08BAC9C808CD9ED1063B35CDB /* ParseUIConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ParseUIConstants.h; path = ParseUI/Other/ParseUIConstants.h; sourceTree = ""; }; + E2D5455D8B0CC48B6626F9A68701EAE9 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = ""; }; + E2DA6B24AAC4C76D5B4D70190AE510B9 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/CoreLocation.framework; sourceTree = DEVELOPER_DIR; }; + E309E5BB982F5B2A87F782B8D65E1919 /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E334CE3256D8270A8B07AB8E4D2D5841 /* PFObject+Subclass.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PFObject+Subclass.h"; sourceTree = ""; }; + E4435B9709FA8B9AAAB8E57D9CE42BCE /* PFLoadingView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFLoadingView.m; path = ParseUI/Classes/Internal/Views/PFLoadingView.m; sourceTree = ""; }; E5A10C62583F50B571B0FEE47047D3D8 /* DesignableButton.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DesignableButton.swift; path = Spring/DesignableButton.swift; sourceTree = ""; }; - E5BC513513FF38AFAD95384D7F395606 /* PFSignUpView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFSignUpView.m; path = ParseUI/Classes/SignUpViewController/PFSignUpView.m; sourceTree = ""; }; + E5B3EFFC2C782099B7FEE2A4794D0463 /* PFSignUpView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFSignUpView.h; path = ParseUI/Classes/SignUpViewController/PFSignUpView.h; sourceTree = ""; }; + E5C59F4C7765389F0BDD91C928C5DEC2 /* PFTwitterUtils.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFTwitterUtils.h; sourceTree = ""; }; + E5CDF921F4976DE32D33211CFBEEA4F3 /* libParseLib.a */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = archive.ar; path = libParseLib.a; sourceTree = ""; }; + E6543DF9BAF55392649FC54BFBE94099 /* PFResources.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFResources.h; path = ParseUI/Generated/PFResources.h; sourceTree = ""; }; E6F2691BBD99CF1196A45A047DB048B5 /* ImageLoader.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImageLoader.swift; path = Spring/ImageLoader.swift; sourceTree = ""; }; E7F21354943D9F42A70697D5A5EF72E9 /* Pods-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-frameworks.sh"; sourceTree = ""; }; + E8027916151AD902E0A43F33CE27B7E0 /* PFCloud.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFCloud.h; sourceTree = ""; }; E8446514FBAD26C0E18F24A5715AEF67 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E9F757AA266BB6CEAE9C2B172BEC4B99 /* BFTask.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFTask.h; path = Bolts/Common/BFTask.h; sourceTree = ""; }; - EB398476F13AEE3DADEBC00631033495 /* PFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFNetworkActivityIndicatorManager.h; sourceTree = ""; }; - EC3087349188253DC83CDA33DBAD661B /* PFSignUpView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFSignUpView.h; path = ParseUI/Classes/SignUpViewController/PFSignUpView.h; sourceTree = ""; }; - ECA3D18E57560A0BD36ACF68CC22F3FD /* BFCancellationTokenRegistration.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFCancellationTokenRegistration.m; path = Bolts/Common/BFCancellationTokenRegistration.m; sourceTree = ""; }; + EC55D06F0BAEFFAC23FB6338A2DF8A77 /* Bolts.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Bolts.modulemap; sourceTree = ""; }; + ED8D286893117F9D983C607CD1D8B741 /* PFActivityIndicatorCollectionReusableView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFActivityIndicatorCollectionReusableView.h; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.h; sourceTree = ""; }; EDC6726B2AA1DAAC6F94E1FF507AE34F /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Source/ConstraintDescription.swift; sourceTree = ""; }; - EE640882780ACCFF1076824B4FC7758D /* PFPurchase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFPurchase.h; sourceTree = ""; }; - EEA666FC7A8B91B7C482755E5B37B81C /* ParseUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ParseUI.h; path = ParseUI/Other/ParseUI.h; sourceTree = ""; }; - EEF5EC8407B7990895F2E392D345B47D /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = folder; name = en.lproj; path = ParseUI/Resources/Localization/en.lproj; sourceTree = ""; }; - F3B6F4E29F5CDC8F823CA749C3A3E566 /* PFActivityIndicatorCollectionReusableView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFActivityIndicatorCollectionReusableView.h; path = ParseUI/Classes/Internal/Cells/PFActivityIndicatorCollectionReusableView.h; sourceTree = ""; }; - F4C3F6C87F0A22310388CC179B8CF4CF /* BFExecutor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = BFExecutor.m; path = Bolts/Common/BFExecutor.m; sourceTree = ""; }; - F530822DE8A9ADDEBEF89A24C9601155 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/AudioToolbox.framework; sourceTree = DEVELOPER_DIR; }; + EF1ED1921DC38C56E4BA5D3FE8FEE0C7 /* PFPrimaryButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFPrimaryButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFPrimaryButton.m; sourceTree = ""; }; + F0A68535F08342A56A034EA610139152 /* PFProductTableViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFProductTableViewController.h; path = ParseUI/Classes/ProductTableViewController/PFProductTableViewController.h; sourceTree = ""; }; + F0C3B855D2D8CCAE7BB493BAEE0CA01E /* PFTextButton.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFTextButton.m; path = ParseUI/Classes/Internal/Views/Buttons/PFTextButton.m; sourceTree = ""; }; + F152DCFEEC242140DBF3C07E80AFCF3C /* ParseUI.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ParseUI.h; path = ParseUI/Other/ParseUI.h; sourceTree = ""; }; + F3FE358D559B290BBA7118DF205D9EA8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + F4E8E610AC534CA6C61D72D332E96EE3 /* PFLoadingView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = PFLoadingView.h; path = ParseUI/Classes/Internal/Views/PFLoadingView.h; sourceTree = ""; }; + F545D14D09725C4616C64E436D754B33 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = ""; }; + F618BADEA864A0619BBD9BE8B922BF52 /* ParseUIConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ParseUIConstants.h; path = ParseUI/Other/ParseUIConstants.h; sourceTree = ""; }; F79B446D865CE125AC740FDABBA29405 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Source/ConstraintItem.swift; sourceTree = ""; }; - F911BCC6753E39BE56A448117EFE583B /* PFConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFConfig.h; sourceTree = ""; }; FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - FCBE96F76693D9700A2C9259D9B62B5A /* ParseUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - FCEEF2DB125C3703869CE76C8246D3AF /* PFACL.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PFACL.h; sourceTree = ""; }; - FD0477B33BA3FB332089112B0DAEACC6 /* BFCancellationToken.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationToken.h; path = Bolts/Common/BFCancellationToken.h; sourceTree = ""; }; - FD1694CBA25501FEB67E949DDFAC5D96 /* Parse.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Parse.modulemap; sourceTree = ""; }; - FD8AA917755D9EF812676F9361CA1FBE /* PF_Twitter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PF_Twitter.h; sourceTree = ""; }; + FB46E75A0F3C4B73C59A27C96A5C2693 /* BFCancellationTokenSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = BFCancellationTokenSource.h; path = Bolts/Common/BFCancellationTokenSource.h; sourceTree = ""; }; + FCEE1F0EC99895204C2BC8D289D2AC23 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = SVProgressHUD.modulemap; sourceTree = ""; }; FE0B4A3C8430E8D9BAC52FE90BB00CF2 /* UnwindSegue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UnwindSegue.swift; path = Spring/UnwindSegue.swift; sourceTree = ""; }; FEBDC93BF2EA0E5739E26BF0D7BBF1DD /* SnapKit-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "SnapKit-Private.xcconfig"; sourceTree = ""; }; - FFCCD631834F2D9C6867BD1301AE5961 /* ParseUI-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ParseUI-dummy.m"; sourceTree = ""; }; + FF8DDF001C1D1231F42F1B40CE9A9282 /* PFImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PFImageCache.m; path = ParseUI/Classes/Internal/PFImageCache.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 08647492B6066149ABA8A594AE50E568 /* Frameworks */ = { + 023E83B9DE14C2314C9AD19682630DF8 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 7FADB9B205173D9E4B5D0C670EE4AC5B /* Foundation.framework in Frameworks */, + E280564CD24D14A05E08B8B69BACD922 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 50CF6B736D50128C4E5CFE912E79B7A1 /* Frameworks */ = { + 0F99D05C9B8F941A18E02E477CCEB8DB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F7DDAE900EED9ABD4430EAB819BBED9C /* Foundation.framework in Frameworks */, + 0D66D02CA253045DC24842B6E6E4C861 /* Foundation.framework in Frameworks */, + AD23E58221E07BBC5659AFA3569507E3 /* QuartzCore.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - 95BB79C4962F936EB8103C27982AA4AA /* Frameworks */ = { + 2C232310956C773C00EADE3683F7F6AE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 462CA69D87AF1AEF0C979ABE142148C0 /* CoreGraphics.framework in Frameworks */, - DF94E4D738B1FBB034A72F6A91F2DCD5 /* Foundation.framework in Frameworks */, - 52569F8D8D8FA2F81874B96B1AFF78B1 /* Parse.framework in Frameworks */, - 8FAE660447B0AB33DD5FCA96A7AC927C /* QuartzCore.framework in Frameworks */, - 7050A0D28E5552DC28E8CF30AC6AF5C4 /* UIKit.framework in Frameworks */, + 89EEE2F454C4F846BEED6FB2C9B60EF7 /* CoreGraphics.framework in Frameworks */, + F8C31B1845DFE777A6673434F0C2C675 /* Foundation.framework in Frameworks */, + 8BBFF920300DB22C9564838477DEB87B /* Parse.framework in Frameworks */, + 3F5CF742033477D6D60B533D19B74B93 /* QuartzCore.framework in Frameworks */, + C269906BAC6D5DD615A52F2681D53C96 /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - B009C832B94E59C07DA3F12DEDEA7E9F /* Frameworks */ = { + 50CF6B736D50128C4E5CFE912E79B7A1 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 42140907C0DFC912502AF225293FFF61 /* AudioToolbox.framework in Frameworks */, - 77B575EA089C02E8355ABC4749C0C2C7 /* Bolts.framework in Frameworks */, - 526AF42044845C6C006A001B7BB210FE /* CFNetwork.framework in Frameworks */, - 934C66048F06E4F560465931EB23910F /* CoreGraphics.framework in Frameworks */, - B94CBFBBC1F73912024B3EC3B3B7D78D /* CoreLocation.framework in Frameworks */, - 60C94CA5A2F73F65628C53B9F488FF2C /* Foundation.framework in Frameworks */, - 4A70489D8BE3265EA9D7E1F54C80FB91 /* QuartzCore.framework in Frameworks */, - EF9F51FE7E50A15079B409C103592F8A /* Security.framework in Frameworks */, - 7C40171BDC50F12387EC8D5BC0F20B21 /* StoreKit.framework in Frameworks */, - ADD31B1666632E810F7C45DD9A72CA13 /* SystemConfiguration.framework in Frameworks */, + F7DDAE900EED9ABD4430EAB819BBED9C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - BA7956F2792C1B62882F7A0B02BFC5FB /* Frameworks */ = { + 8385B5C5BD1897A3F21341F8BBC1083D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 276887C3869F383DA42BC7A4D2DBEF3C /* Foundation.framework in Frameworks */, + 1B8F58E879F698D32945E8931BE22EF8 /* AudioToolbox.framework in Frameworks */, + F7CCA099E97A320B450650CDDFF814C9 /* Bolts.framework in Frameworks */, + 022377F31220CE75F13824356C769D38 /* CFNetwork.framework in Frameworks */, + 672EDE90704EC79E84BF61A71870441E /* CoreGraphics.framework in Frameworks */, + C5A1B243339E2FA633462C7C24F63175 /* CoreLocation.framework in Frameworks */, + 6F77B8606662F066CCEA90BAC4982D7D /* Foundation.framework in Frameworks */, + F3F610506DF90617B6C9CF8B99674AEE /* QuartzCore.framework in Frameworks */, + 5F25AA2BA30FFEA0076EF52BA98FA6A3 /* Security.framework in Frameworks */, + 5606452FB7DF9F2A3B7B0A35A92FE92D /* StoreKit.framework in Frameworks */, + 34C70F218A58E0B477470A84299F98B5 /* SystemConfiguration.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 8A9E73BC13890969B366D91190263A3C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 79C35F9CD874927154030B9E70206083 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - D95879F8F27DF1E4386DD4358AC6005C /* Frameworks */ = { + 9E33B49EA32E177EDE38BED1A9139D79 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9A303852920496DCBD73475C68043768 /* Foundation.framework in Frameworks */, + 30E6963CA2071195AC67662F3540A933 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - FC19A6CADDE08DC35E56C4D238DD73EE /* Frameworks */ = { + BA7956F2792C1B62882F7A0B02BFC5FB /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - ED4630CDE874FB3466F8B6CAB7AB0F95 /* Foundation.framework in Frameworks */, + 276887C3869F383DA42BC7A4D2DBEF3C /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0026FE70C0904C98BD25BAF2543C7AB6 /* Support Files */ = { + 0587A7CE25943DDB2A226D0765846AF5 /* Resources */ = { isa = PBXGroup; children = ( - 6DA3F7D9BF1684804E8A97A7AA738E62 /* Info.plist */, - 07E661F3694EEBC209973EB8E5DAB670 /* ParseUI.modulemap */, - AA2EDC1D1CC3E22DC0EEB7336E08F868 /* ParseUI.xcconfig */, - 51909C7F1AD1EBABD6272372A4140053 /* ParseUI-Private.xcconfig */, - FFCCD631834F2D9C6867BD1301AE5961 /* ParseUI-dummy.m */, - 784252093BB669E51E962FA3A895C071 /* ParseUI-prefix.pch */, - A15C2126FDF4473D9BB99A0A673C34F6 /* ParseUI-umbrella.h */, + 8AE4453606003C10B246472F98990A7F /* SVProgressHUD.bundle */, ); - name = "Support Files"; - path = "../Target Support Files/ParseUI"; + name = Resources; sourceTree = ""; }; - 06A75C922608A90425C2D434DB2F1499 /* Spring */ = { + 0770F8BFD00317EC719713E51CF64EE8 /* Parse */ = { isa = PBXGroup; children = ( - C96B6E188B9C19B02F7A48882B460FF1 /* AsyncButton.swift */, - 644DF8F1DD47151F078FE505B9287BE4 /* AsyncImageView.swift */, - 91059726DC94563BC9E3159625138DBE /* AutoTextView.swift */, - 37F3D3BA73F633688D4B0A041AFDFEFF /* BlurView.swift */, - E5A10C62583F50B571B0FEE47047D3D8 /* DesignableButton.swift */, - 7B639C1CF665CE74FBD6494B9A6633AC /* DesignableImageView.swift */, - 714B835B557B3F72D89945095C23B1A4 /* DesignableLabel.swift */, - 243BD3D3C3D5BDAF745916587420D963 /* DesignableTabBarController.swift */, - 747EC9F42A32387A595E40BE8E658168 /* DesignableTextField.swift */, - C28517CF1749DF981B83A9F1D8542FF5 /* DesignableTextView.swift */, - 17786A103C8CD0AAB191C5A9353EBBFC /* DesignableView.swift */, - E6F2691BBD99CF1196A45A047DB048B5 /* ImageLoader.swift */, - 50AB8DC0029F616AC6A34A74FDAFD750 /* KeyboardLayoutConstraint.swift */, - 4DF1373004EE5CF38BDD54B6746887D0 /* LoadingView.swift */, - 108AA2994D7815017CD629C1646FFF61 /* Misc.swift */, - 21C0F51565A5346A442CC17CBFEE3FBD /* SoundPlayer.swift */, - 60B11326E117F16B77C4601D8FF6FC0B /* Spring.swift */, - 9F9876D10625C1E9006562055D3BF119 /* SpringAnimation.swift */, - 3F9CC2BB93470648CCEE42F06CF16EF1 /* SpringButton.swift */, - 017820BFEFFA04C8392724C5BE0810A8 /* SpringImageView.swift */, - 2834662A3665BDF7D2F61BA3631A66AD /* SpringLabel.swift */, - B47A46C4CDA26763F8A89977615BA750 /* SpringTextField.swift */, - 73DD0FB30CDB217927C27FE7D04F75EE /* SpringTextView.swift */, - DAB550BFBDE25FD73B2CAF77A9F8FBBD /* SpringView.swift */, - 83D313E70FABD3B63D31116FC62DDD68 /* TransitionManager.swift */, - 9E4A04412784B2B3A8735C7186E1AE16 /* TransitionZoom.swift */, - FE0B4A3C8430E8D9BAC52FE90BB00CF2 /* UnwindSegue.swift */, - DD1C95206EC650B518C2BF69FE1FB0F7 /* Resources */, - CB118812D42C86474AF505E547ACA98A /* Support Files */, + D9AD49BAEA0F96BEDEDF75689E5E80A5 /* Empty.m */, + A048B1BF5DCBF924412F6482CD927CDE /* PFACL.h */, + 43DBB1BEAFA6DC6E11DE1350BE6C9929 /* PFAnalytics.h */, + 60240177579FFF75A882FE7C92FE294E /* PFAnonymousUtils.h */, + E8027916151AD902E0A43F33CE27B7E0 /* PFCloud.h */, + 7FF8CFB8D4402E5960D141A0948269C8 /* PFConfig.h */, + 7C184939B6244BDD621865D1A38AE765 /* PFConstants.h */, + 2F28B38ADA21BADEFC96D97F8041A278 /* PFFile.h */, + 73839B2A8E1B09479C277ADF660E0007 /* PFGeoPoint.h */, + 5A1AB3293CE8E2847302D74F97634EC9 /* PFInstallation.h */, + 758F96886628277588E5FF023D967966 /* PFNetworkActivityIndicatorManager.h */, + 2CB33ED17B11C58A1FCA60100C9180DF /* PFNullability.h */, + 580BBB40693DD05A0D17909B61A28D49 /* PFObject.h */, + E334CE3256D8270A8B07AB8E4D2D5841 /* PFObject+Subclass.h */, + 103E5B334CEE3BB93F03F8CFD073C8EF /* PFProduct.h */, + 33BF98421E77DCEB4DF65DFC0462C62C /* PFPurchase.h */, + A5ECBAFFF053A6A15A5F57B72831BE1F /* PFPush.h */, + 94319398A39678774385D6CFCB352A28 /* PFQuery.h */, + 66599A0C11C7DF068DFE811FEE10B12F /* PFRelation.h */, + D876AEEF955131084C645A3B0B8BD887 /* PFRole.h */, + 393B79938ACB795322FFB8E7CFA4E94F /* PFSession.h */, + 764A7ACB5CEA95AAD604FD3E83E642C8 /* PFSubclassing.h */, + E5C59F4C7765389F0BDD91C928C5DEC2 /* PFTwitterUtils.h */, + 2A3F33596F52BFB16F902E40F305DAF5 /* PFUser.h */, + BFF13EF2BB4110FB1C597DCDFB3B8739 /* PF_Twitter.h */, + 34180C62239AE4F47CCB1C87BDB1E856 /* Parse.h */, + DC98582A96EDFA423A4B9CA34FE9A271 /* Frameworks */, + 854E58E5B8D264DEB1C246D49190E09B /* Support Files */, ); - path = Spring; + path = Parse; sourceTree = ""; }; - 08B93B379AE3D41EC1FB0659FDD5D57D /* Pods */ = { + 0AD351658AE46E9C7CBD78E2BF59F94F /* Alamofire */ = { isa = PBXGroup; children = ( - 355AE3B558F6797E41BAD7E3E1724936 /* Alamofire */, - 1361E924707DA7E1116AE79CCAFB532A /* Bolts */, - 2C551FF421392280CA6871649822F671 /* Parse */, - D140F84DA40CB8011F3596913C698030 /* ParseUI */, - A45934007A55457352EC579703E3EEAF /* SnapKit */, - 06A75C922608A90425C2D434DB2F1499 /* Spring */, + 58B84FCC85A22611DC2837E4FC73EEF8 /* Alamofire.swift */, + CA9A9FF1BE67E6F1D81A8AE234171004 /* Download.swift */, + B9C218EDD3D6766266752789E0C64270 /* Error.swift */, + 89F9035656D010E40C47CF4C678762FF /* Manager.swift */, + 5539396381995F75FED1503E91D2B3B6 /* MultipartFormData.swift */, + 57A6ABD3FCD0FB0C7D186A76E30CF307 /* ParameterEncoding.swift */, + 4A7246CE28A0DAEEF10FD13FB451EB51 /* Request.swift */, + 2B748C4E502CD0B31F51CCEBF5C8A726 /* ResponseSerialization.swift */, + 03E1300CD0F6178644BB14F654CB644D /* Result.swift */, + 3F32D03A88F4C9F5D894D3B884BB4F28 /* ServerTrustPolicy.swift */, + 2490F7DAD75BF7DFC20AB48290DF7423 /* Stream.swift */, + DB24F8C7D8E68C58067814621FD731D4 /* Upload.swift */, + 361CCB3153F3E0B7B7F5B394C3959DA3 /* Validation.swift */, + 9B4AED851A314F97FD141AFB8AD451F2 /* Support Files */, ); - name = Pods; + path = Alamofire; sourceTree = ""; }; - 12BC83B5B4F4BC44B6CA6923734AF9D6 /* Support Files */ = { + 14C86453E44793D03A4F0F0AF5546410 /* Bolts */ = { isa = PBXGroup; children = ( - 023223DDDF248415F863542228D653AC /* Info.plist */, - FD1694CBA25501FEB67E949DDFAC5D96 /* Parse.modulemap */, - 50F8C96A23850452A0CFDCB06D2F55D2 /* Parse.xcconfig */, - 3BA75C13F675948CCDEFF6EFE449CD18 /* Parse-Private.xcconfig */, - E56673E8C14F7BD870A9F24D8753B937 /* Parse-dummy.m */, - 2980DE99020EB37F71A94BB7D9E83ECB /* Parse-prefix.pch */, - 329A7719D2CBCFE9200E3E3CFDB83E99 /* Parse-umbrella.h */, + 4807092CFFFBC1F804B5CDD9A2B4F3C8 /* Support Files */, + 954495CE856B317F06BA45566FAD8BDF /* Tasks */, ); - name = "Support Files"; - path = "../Target Support Files/Parse"; + path = Bolts; sourceTree = ""; }; - 1361E924707DA7E1116AE79CCAFB532A /* Bolts */ = { + 17731C574FA6EF8205A56185D08AFDCE /* SVProgressHUD */ = { isa = PBXGroup; children = ( - A3A013F8AB3FE49D02DDC40F2B6E8264 /* Support Files */, - 761D1697CD828A2399BF9E961E96091B /* Tasks */, - ); - path = Bolts; + E2D5455D8B0CC48B6626F9A68701EAE9 /* SVIndefiniteAnimatedView.h */, + F545D14D09725C4616C64E436D754B33 /* SVIndefiniteAnimatedView.m */, + D16DB5B5AECAA4767402AED1142C6FEA /* SVProgressHUD.h */, + D5A224DBD1851D9A7E3290BDEC07AD17 /* SVProgressHUD.m */, + 26DAB12DDABFD4511181F007C98C61B8 /* SVRadialGradientLayer.h */, + 6DD4947BED6E6A5E9149DD5163F19B39 /* SVRadialGradientLayer.m */, + 0587A7CE25943DDB2A226D0765846AF5 /* Resources */, + 9AFF2B3C1C2091D2FFCE786F08A8C681 /* Support Files */, + ); + path = SVProgressHUD; sourceTree = ""; }; - 1E466D4275AA1B5D2C53DA4B161FC936 /* Support Files */ = { + 2A1E17E5720AF6B2248F90855609C69D /* Support Files */ = { isa = PBXGroup; children = ( - 500182D1D79F038B835937E6DE83DE75 /* Info.plist */, - 4227AAB17CD9D4CEF8AE341A7D04B748 /* SnapKit.modulemap */, - 17B2F479990AF0E56D9793614EAA3EB8 /* SnapKit.xcconfig */, + 6EF89611E10DF1324285A32294D1E52B /* Info.plist */, + A937B72EFE45FCFB236A6081E5E742CE /* SnapKit.modulemap */, + 54CAE8C301393C47EB390B9074376B1C /* SnapKit.xcconfig */, FEBDC93BF2EA0E5739E26BF0D7BBF1DD /* SnapKit-Private.xcconfig */, D367D337E0670CA623B6F343C738D610 /* SnapKit-dummy.m */, - 36E1BE52952D79B058C7BE0DFA36EC46 /* SnapKit-prefix.pch */, + 2FC013551073BD0AD5E061F682C410DA /* SnapKit-prefix.pch */, 413D4C68BCDED964834146EFB422C3B3 /* SnapKit-umbrella.h */, ); name = "Support Files"; path = "../Target Support Files/SnapKit"; sourceTree = ""; }; - 29C2D8872274FAE74D231D293A0CD61E /* Support Files */ = { + 321860A3A7948DF19B601E7EC861DB96 /* Support Files */ = { isa = PBXGroup; children = ( - 2718FE194388BF00B40644A37BA12500 /* Alamofire.modulemap */, - 6B3767E0B6C96A11BA344206F79A0501 /* Alamofire.xcconfig */, - 7B6643B0DA0A5E02F0020A3FF33B7346 /* Alamofire-Private.xcconfig */, - D93BFC186680649D781B3FA74C419509 /* Alamofire-dummy.m */, - 459753A28F648AD1C23AEA099281663F /* Alamofire-prefix.pch */, - 5686FB083709538D706C4D268762D6CB /* Alamofire-umbrella.h */, - 9E31572980E14568528FF85DF2F5530A /* Info.plist */, + 4A094507A53DF403A0A95F04F593F90B /* Info.plist */, + 8CF6C6C4FB470F1171F45C2EC9165A80 /* ParseUI.modulemap */, + 3FE434FC71E0D089BEB8336E256F09A4 /* ParseUI.xcconfig */, + 3ACBC43B508943DB8829B56E0FFEFCDB /* ParseUI-Private.xcconfig */, + 9FAF50DB4863046581B97E4A9EBA539F /* ParseUI-dummy.m */, + 05A9D7231AC21BEA3ECEBAA3F41B0BE8 /* ParseUI-prefix.pch */, + 251EEBE45B1DFC7FE457A7CE05D10C84 /* ParseUI-umbrella.h */, ); name = "Support Files"; - path = "../Target Support Files/Alamofire"; - sourceTree = ""; - }; - 2C551FF421392280CA6871649822F671 /* Parse */ = { - isa = PBXGroup; - children = ( - B72A9030BB75EDC7C949460E09DFFC34 /* Empty.m */, - FCEEF2DB125C3703869CE76C8246D3AF /* PFACL.h */, - 1503DE3EFC1DCE057C52116224894B78 /* PFAnalytics.h */, - 078135ED9ADED2F1A1D2215F18436B0E /* PFAnonymousUtils.h */, - 3774BC83FF5F45C194A097082834BC59 /* PFCloud.h */, - F911BCC6753E39BE56A448117EFE583B /* PFConfig.h */, - 5F9D70004C3C93742BE50B92B574BA85 /* PFConstants.h */, - 42451D5EFB5EF882B747D212A3E99173 /* PFFile.h */, - 2C32CA54485DF0532765D86DFED06985 /* PFGeoPoint.h */, - C3CC1F31D0EE6E4E95F4A54BEBD94105 /* PFInstallation.h */, - EB398476F13AEE3DADEBC00631033495 /* PFNetworkActivityIndicatorManager.h */, - 1E68F776BD8C564CF76865F60E2D7338 /* PFNullability.h */, - C593C67ED65005EBD07E350C9D1EEEAD /* PFObject.h */, - 49E84A74508C9E0B0216D2077A293601 /* PFObject+Subclass.h */, - 3B4401440DB72F77A0EE1F7DD76DD0F8 /* PFProduct.h */, - EE640882780ACCFF1076824B4FC7758D /* PFPurchase.h */, - A03272D0EBBFA0A4B6F3F592AF579D10 /* PFPush.h */, - 218BBDF1ADF497140951BF702196AD8A /* PFQuery.h */, - 41F1FCAF1DC8F8DA0B8C4816C29AF149 /* PFRelation.h */, - 996CD86C6B353E7971E1801581C7687E /* PFRole.h */, - 33060C546CC3A12A34E4DC4F1BEBEA13 /* PFSession.h */, - 037B68012E4AA306ECE53D0465ED5231 /* PFSubclassing.h */, - C0FD247C315187490BD81A1DD97F1E7E /* PFTwitterUtils.h */, - D8FE715741A6CACA712C2DDAD4741342 /* PFUser.h */, - FD8AA917755D9EF812676F9361CA1FBE /* PF_Twitter.h */, - 6365DB4F685EE8AA8EA5C24C0D0D1285 /* Parse.h */, - 4D0242273D4A2CD991806A21EB0152D3 /* Frameworks */, - 12BC83B5B4F4BC44B6CA6923734AF9D6 /* Support Files */, - ); - path = Parse; + path = "../Target Support Files/ParseUI"; sourceTree = ""; }; - 355AE3B558F6797E41BAD7E3E1724936 /* Alamofire */ = { + 3EBE8610096F1821B22E6B547F62898B /* ParseUI */ = { isa = PBXGroup; children = ( - D0C981B189C7B5FAD2129888F960302F /* Alamofire.swift */, - DA38F77C56A772D55C417E71256CD3B0 /* Download.swift */, - E130EDD8D847450BFD0CFBDCEA1C8B34 /* Error.swift */, - 0B9CC111A606AA1E4C02A5C9016E6DAA /* Manager.swift */, - A4787BEA987B200817A79F0029183243 /* MultipartFormData.swift */, - 654163298B34355180357BD7202005E8 /* ParameterEncoding.swift */, - 88D6940C6BC089F231E8F64EF7B55D2B /* Request.swift */, - 94F47B0A77561D770A81AB69BB0D18BD /* ResponseSerialization.swift */, - 2244210AE6E65C8DC1D9E1DC7D61576C /* Result.swift */, - 5398C34213A73B844438E6B71AA0BCED /* ServerTrustPolicy.swift */, - B24120BF8EC11CBA67082CE3CA86552B /* Stream.swift */, - 4EA213B03487BDD4FB41013E76DC09BD /* Upload.swift */, - 6BF41205D5F55CF1390FF22F32596A83 /* Validation.swift */, - 29C2D8872274FAE74D231D293A0CD61E /* Support Files */, + 9DE37557D9AE8CF09267DEAE8E6A680A /* PFActionButton.h */, + AE363BE2712AC08ED24167DE8B2CB441 /* PFActionButton.m */, + ED8D286893117F9D983C607CD1D8B741 /* PFActivityIndicatorCollectionReusableView.h */, + 98717A9D86302BD9634E2238C4396C22 /* PFActivityIndicatorCollectionReusableView.m */, + D89EA957697F1D1474A399583AF1D5FD /* PFActivityIndicatorTableViewCell.h */, + A98FE1CBBD63800685546A1781C7DA16 /* PFActivityIndicatorTableViewCell.m */, + 3185718E27DC8A81E079E142B7D32ACE /* PFAlertView.h */, + 49E8B5BC6CBC055DEAF397C5CB7B7EF3 /* PFAlertView.m */, + 5F5B9A0BE0E6F9C012C548E4FEC305DE /* PFCollectionViewCell.h */, + 39119B303358B59CA3AEED3CCB2CD300 /* PFCollectionViewCell.m */, + 9FDFE426B21728242B5E57E6BC095106 /* PFColor.h */, + B06C4A1F0FEB3928451E0B19164C2458 /* PFColor.m */, + 46F6C000C5DAF9A479F512AB77E75534 /* PFDismissButton.h */, + DDD544D69B1394A01990CECAA59CD501 /* PFDismissButton.m */, + D98345F1E23E7A01AC789E1397E9CD5E /* PFImage.h */, + 59A73E110ED76AF3934F053161974C9D /* PFImage.m */, + A6842DE3ED0513931D3916952F3A3E51 /* PFImageCache.h */, + FF8DDF001C1D1231F42F1B40CE9A9282 /* PFImageCache.m */, + 38232F71D881443850F7C61339A90F07 /* PFImageView.h */, + CDE8C59AE734C3CB9FBF86DD3A73A3B1 /* PFImageView.m */, + F4E8E610AC534CA6C61D72D332E96EE3 /* PFLoadingView.h */, + E4435B9709FA8B9AAAB8E57D9CE42BCE /* PFLoadingView.m */, + CA37B3BF8163FC1B2564F1ED3AB4064C /* PFLocalization.h */, + 287F2E1B0538CFE3329A3D1391FC26AA /* PFLogInView.h */, + 0074F797C94992E9AF2E518942B7BDD3 /* PFLogInView.m */, + 06236DA604D6EDF3778666A5F897B1C9 /* PFLogInViewController.h */, + 8D4953D83FB9DEA59D16F16B0771382F /* PFLogInViewController.m */, + 9849C347117249E71063E2F2ECD55E7E /* PFPrimaryButton.h */, + EF1ED1921DC38C56E4BA5D3FE8FEE0C7 /* PFPrimaryButton.m */, + F0A68535F08342A56A034EA610139152 /* PFProductTableViewController.h */, + 17FAD471627A4D869995BE055AA63801 /* PFProductTableViewController.m */, + 60D28430C5C6A43297B289461DFE76C5 /* PFPurchaseTableViewCell.h */, + 649C270409F15243E795A445A0FF6FF3 /* PFPurchaseTableViewCell.m */, + D5C64F6E8F39ABB3FA04C92A2AC029EC /* PFQueryCollectionViewController.h */, + 587F78E603C59E2CA76F1F87E9290AC8 /* PFQueryCollectionViewController.m */, + C58634FA13A6634E61C5B04D59A8DAA8 /* PFQueryTableViewController.h */, + 1E52B6FDFE7367B8CB16245024DA0524 /* PFQueryTableViewController.m */, + A0985500DFF9DA15F13E1202ED5A30B4 /* PFRect.h */, + 3E1CEBC0D4DD95983BCBDA3225FEB8ED /* PFRect.m */, + E6543DF9BAF55392649FC54BFBE94099 /* PFResources.h */, + A3FE2C4B23714CFA2B84BE045055D140 /* PFResources.m */, + E5B3EFFC2C782099B7FEE2A4794D0463 /* PFSignUpView.h */, + 1E82555FF3BCB2F60800EF4601D379BF /* PFSignUpView.m */, + 88A9999091877EA5951B69EDFEE2FD28 /* PFSignUpViewController.h */, + 10A4E3F02F7C36F8CE94434F465BD9BD /* PFSignUpViewController.m */, + 361AE4BA7BBCA5B9BE1E48BC4C58EF0A /* PFTableViewCell.h */, + C8AF90FFDF0E29A47B4C8FCC52D467B9 /* PFTableViewCell.m */, + C1C59DE2E0089E70C3193D405C3FD899 /* PFTextButton.h */, + F0C3B855D2D8CCAE7BB493BAEE0CA01E /* PFTextButton.m */, + 4653940AC5534DC8D14E82222B585277 /* PFTextField.h */, + 08E432805E6A901FEB2070240505A1FD /* PFTextField.m */, + F152DCFEEC242140DBF3C07E80AFCF3C /* ParseUI.h */, + F618BADEA864A0619BBD9BE8B922BF52 /* ParseUIConstants.h */, + F441B9AB5A807C262AD57BB0312FD0F4 /* Resources */, + 321860A3A7948DF19B601E7EC861DB96 /* Support Files */, ); - path = Alamofire; + path = ParseUI; sourceTree = ""; }; - 4D0242273D4A2CD991806A21EB0152D3 /* Frameworks */ = { + 4807092CFFFBC1F804B5CDD9A2B4F3C8 /* Support Files */ = { isa = PBXGroup; children = ( - AF0BC9C185347166C89926CDEBE24DD9 /* libParseLib.a */, + EC55D06F0BAEFFAC23FB6338A2DF8A77 /* Bolts.modulemap */, + A63D66E105FAB952F2B231E32A6C45D9 /* Bolts.xcconfig */, + 11A7BE4205C5FABE76951CAC019CAD5D /* Bolts-Private.xcconfig */, + AEF410AC64C0A37F9B5760AAC51EC79F /* Bolts-dummy.m */, + 4A7F748596AE965EB0E37E3671A4E832 /* Bolts-prefix.pch */, + AA4CD17C753943BD57F738C6F2969DF4 /* Bolts-umbrella.h */, + 94AD46168A063C7E554F8044577161EB /* Info.plist */, ); - name = Frameworks; + name = "Support Files"; + path = "../Target Support Files/Bolts"; sourceTree = ""; }; - 4D4B530B859324B36505923E0DB03DC1 /* Resources */ = { + 70B73C571FB4FF6E4AE6ED9584B81739 /* Spring */ = { isa = PBXGroup; children = ( - EEF5EC8407B7990895F2E392D345B47D /* en.lproj */, + C96B6E188B9C19B02F7A48882B460FF1 /* AsyncButton.swift */, + 644DF8F1DD47151F078FE505B9287BE4 /* AsyncImageView.swift */, + 91059726DC94563BC9E3159625138DBE /* AutoTextView.swift */, + 37F3D3BA73F633688D4B0A041AFDFEFF /* BlurView.swift */, + E5A10C62583F50B571B0FEE47047D3D8 /* DesignableButton.swift */, + 7B639C1CF665CE74FBD6494B9A6633AC /* DesignableImageView.swift */, + 714B835B557B3F72D89945095C23B1A4 /* DesignableLabel.swift */, + 243BD3D3C3D5BDAF745916587420D963 /* DesignableTabBarController.swift */, + 747EC9F42A32387A595E40BE8E658168 /* DesignableTextField.swift */, + C28517CF1749DF981B83A9F1D8542FF5 /* DesignableTextView.swift */, + 17786A103C8CD0AAB191C5A9353EBBFC /* DesignableView.swift */, + E6F2691BBD99CF1196A45A047DB048B5 /* ImageLoader.swift */, + 50AB8DC0029F616AC6A34A74FDAFD750 /* KeyboardLayoutConstraint.swift */, + 4DF1373004EE5CF38BDD54B6746887D0 /* LoadingView.swift */, + 108AA2994D7815017CD629C1646FFF61 /* Misc.swift */, + 21C0F51565A5346A442CC17CBFEE3FBD /* SoundPlayer.swift */, + 60B11326E117F16B77C4601D8FF6FC0B /* Spring.swift */, + 9F9876D10625C1E9006562055D3BF119 /* SpringAnimation.swift */, + 3F9CC2BB93470648CCEE42F06CF16EF1 /* SpringButton.swift */, + 017820BFEFFA04C8392724C5BE0810A8 /* SpringImageView.swift */, + 2834662A3665BDF7D2F61BA3631A66AD /* SpringLabel.swift */, + B47A46C4CDA26763F8A89977615BA750 /* SpringTextField.swift */, + 73DD0FB30CDB217927C27FE7D04F75EE /* SpringTextView.swift */, + DAB550BFBDE25FD73B2CAF77A9F8FBBD /* SpringView.swift */, + 83D313E70FABD3B63D31116FC62DDD68 /* TransitionManager.swift */, + 9E4A04412784B2B3A8735C7186E1AE16 /* TransitionZoom.swift */, + FE0B4A3C8430E8D9BAC52FE90BB00CF2 /* UnwindSegue.swift */, + E5443CCCFA21ECBC4D1AD6FF3D344E18 /* Resources */, + E0E27334C89AC821CCA6113D285A3249 /* Support Files */, ); - name = Resources; + path = Spring; sourceTree = ""; }; 75D98FF52E597A11900E131B6C4E1ADA /* Pods */ = { @@ -748,67 +831,111 @@ 79A9DEDC89FE8336BF5FEDAAF75BF7FC /* Pods.modulemap */, D0405803033A2A777B8E4DFA0C1800ED /* Pods-acknowledgements.markdown */, 87B213035BAC5F75386F62D3C75D2342 /* Pods-acknowledgements.plist */, - 2315AB3B41F08F5D357FE042565C2D29 /* Pods-dummy.m */, + 5D6738B20E7D15C17765999C766CE414 /* Pods-dummy.m */, E7F21354943D9F42A70697D5A5EF72E9 /* Pods-frameworks.sh */, CBC0F7C552B739C909B650A0F42F7F38 /* Pods-resources.sh */, - 2E68507C083F44B56EED5B989CA4F69B /* Pods-umbrella.h */, - 66EA5941F2B36360103507DAB9E6258D /* Pods.debug.xcconfig */, - A80B5C0BF5D2CDCBA1B8EABCBAD8D729 /* Pods.release.xcconfig */, + B6934BA8B55F3743F804D6BAEB21CD6C /* Pods-umbrella.h */, + A65101DC9EB52DC9111DF0C0601F5128 /* Pods.debug.xcconfig */, + 5B91690FAC44BB238E55220E574A4A1F /* Pods.release.xcconfig */, ); name = Pods; path = "Target Support Files/Pods"; sourceTree = ""; }; - 761D1697CD828A2399BF9E961E96091B /* Tasks */ = { + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, + D5321D6DF498C44862509115A1223752 /* Frameworks */, + 895EBD890ED30117C3190032B3857580 /* Pods */, + CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, + B7B80995527643776607AFFA75B91E24 /* Targets Support Files */, + ); + sourceTree = ""; + }; + 854E58E5B8D264DEB1C246D49190E09B /* Support Files */ = { isa = PBXGroup; children = ( - FD0477B33BA3FB332089112B0DAEACC6 /* BFCancellationToken.h */, - 07416852D19B502C824B2215E599E3E2 /* BFCancellationToken.m */, - ADE720C9B4B640594229F580C98F6B17 /* BFCancellationTokenRegistration.h */, - ECA3D18E57560A0BD36ACF68CC22F3FD /* BFCancellationTokenRegistration.m */, - C302836E12DD36986981D7278F790E48 /* BFCancellationTokenSource.h */, - E400FE1997044A10576B564EF91BCAB7 /* BFCancellationTokenSource.m */, - A9EE46757E86ED5193A14869F17EC76F /* BFDefines.h */, - 8AD6A19BAC94D423253666DE63A53BBD /* BFExecutor.h */, - F4C3F6C87F0A22310388CC179B8CF4CF /* BFExecutor.m */, - E9F757AA266BB6CEAE9C2B172BEC4B99 /* BFTask.h */, - AFB8F09E68527ED0E4AC084DCAED6738 /* BFTask.m */, - 0D7A0776F5C6A9EDA06958A838234B58 /* BFTaskCompletionSource.h */, - 85FC6B815CCEAABA71054B628DF69A90 /* BFTaskCompletionSource.m */, - 89A3850622568B464722BDD8E48AE401 /* Bolts.h */, - 2EBE38E5067AE5D9C22F593A2666DC49 /* Bolts.m */, - 06B3538BB4105909804BF7C2D3B76536 /* BoltsVersion.h */, + 3D91B922667273EA65C1C147B5BFC61C /* Info.plist */, + AE710F8773C9553F950D376DC3AAACAC /* Parse.modulemap */, + D48112844885EDAF5448F14A700892D2 /* Parse.xcconfig */, + 16750CC5D92DB8C6C526741A011C5B91 /* Parse-Private.xcconfig */, + 9E4FCBCFBF362B9CE50CC3A550C206F8 /* Parse-dummy.m */, + 8DF048DA12B53C2BDFD683E1A1826550 /* Parse-prefix.pch */, + 27A6C1C38D3E5DE37F31CC95DBF14527 /* Parse-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Parse"; + sourceTree = ""; + }; + 895EBD890ED30117C3190032B3857580 /* Pods */ = { + isa = PBXGroup; + children = ( + 0AD351658AE46E9C7CBD78E2BF59F94F /* Alamofire */, + 14C86453E44793D03A4F0F0AF5546410 /* Bolts */, + 0770F8BFD00317EC719713E51CF64EE8 /* Parse */, + 3EBE8610096F1821B22E6B547F62898B /* ParseUI */, + 17731C574FA6EF8205A56185D08AFDCE /* SVProgressHUD */, + AF8AD6F84A46BEE9D0747E87BCE7DF3E /* SnapKit */, + 70B73C571FB4FF6E4AE6ED9584B81739 /* Spring */, + ); + name = Pods; + sourceTree = ""; + }; + 954495CE856B317F06BA45566FAD8BDF /* Tasks */ = { + isa = PBXGroup; + children = ( + AD6DD3C95F055B9583AACA7C250FCD2F /* BFCancellationToken.h */, + 30EAFCF691EA32F049B27A68363A1804 /* BFCancellationToken.m */, + D556F6BA06CBFD0CC18F6433222525A5 /* BFCancellationTokenRegistration.h */, + 3001B71F3724D4037E90DEE08F56F12F /* BFCancellationTokenRegistration.m */, + FB46E75A0F3C4B73C59A27C96A5C2693 /* BFCancellationTokenSource.h */, + 62D8DFDFFFC08DF7611DB6BD4E32F0E8 /* BFCancellationTokenSource.m */, + C21DCF345E330EE72957CA2945D9E320 /* BFDefines.h */, + D92805B1FFCFA09B998BB798CFFEEFF7 /* BFExecutor.h */, + 40AA194BEE16DE1048660D180335E1F3 /* BFExecutor.m */, + 9731F663579CFEE575FAD61109772AA6 /* BFTask.h */, + 8FFAE60111F4E1BE0FCEBF43495DA498 /* BFTask.m */, + 3854AECC1465D66E5D45DD77183F8C60 /* BFTaskCompletionSource.h */, + A41FE48E86FB615385D9E58F2A46C197 /* BFTaskCompletionSource.m */, + 7F3BDBDFC00CF6E0DF16B39FD8C63932 /* Bolts.h */, + 0309020ABB0E6B6B641E4D1AB0E8E988 /* Bolts.m */, + 3A45568AD0D13EB41FA696A0E1B9C5EC /* BoltsVersion.h */, ); name = Tasks; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + 9AFF2B3C1C2091D2FFCE786F08A8C681 /* Support Files */ = { isa = PBXGroup; children = ( - BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, - D5321D6DF498C44862509115A1223752 /* Frameworks */, - 08B93B379AE3D41EC1FB0659FDD5D57D /* Pods */, - CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, - B7B80995527643776607AFFA75B91E24 /* Targets Support Files */, + 35503964B683B866056E0E48C1C86E5B /* Info.plist */, + FCEE1F0EC99895204C2BC8D289D2AC23 /* SVProgressHUD.modulemap */, + 2AD215A6C42AB54F2861297DF3FD37C9 /* SVProgressHUD.xcconfig */, + 9DBF5386BD59DD908C3BBB66F313924C /* SVProgressHUD-Private.xcconfig */, + B369AF375B9E55D80FE78521D07277C9 /* SVProgressHUD-dummy.m */, + DF8E508997C84C0C000C1278A94406DE /* SVProgressHUD-prefix.pch */, + B4FCFF441BC88C3C93440C8AB5AC4D4F /* SVProgressHUD-umbrella.h */, ); + name = "Support Files"; + path = "../Target Support Files/SVProgressHUD"; sourceTree = ""; }; - A3A013F8AB3FE49D02DDC40F2B6E8264 /* Support Files */ = { + 9B4AED851A314F97FD141AFB8AD451F2 /* Support Files */ = { isa = PBXGroup; children = ( - 2D41E40E2524D17BE799BCA3C3247B33 /* Bolts.modulemap */, - 56F0C1D85586744FA2BFCA00EF37E6E0 /* Bolts.xcconfig */, - 2D4F759353A8957B54E7F1FA28611B2B /* Bolts-Private.xcconfig */, - 4165840F4852501AC5A7E661580C375E /* Bolts-dummy.m */, - B7FB992F77D278FC791010D485641B31 /* Bolts-prefix.pch */, - 5D1D96B881F470CF00BD5285A198D730 /* Bolts-umbrella.h */, - 01972408950E50752263871774688AAE /* Info.plist */, + B47D4A862DA291B637244015E9A747F3 /* Alamofire.modulemap */, + 419B65045CFC7415BFC7F9ADCEFDA5DA /* Alamofire.xcconfig */, + 5F5388130D37843645ADF5DCA408FB72 /* Alamofire-Private.xcconfig */, + 0412020A7D3E2B0D70C752343F1DB4AB /* Alamofire-dummy.m */, + 3AE26F23E78236AF895151F7AFE72677 /* Alamofire-prefix.pch */, + 4D3A264E34E686C9B6455DF0F4D7D0AA /* Alamofire-umbrella.h */, + F3FE358D559B290BBA7118DF205D9EA8 /* Info.plist */, ); name = "Support Files"; - path = "../Target Support Files/Bolts"; + path = "../Target Support Files/Alamofire"; sourceTree = ""; }; - A45934007A55457352EC579703E3EEAF /* SnapKit */ = { + AF8AD6F84A46BEE9D0747E87BCE7DF3E /* SnapKit */ = { isa = PBXGroup; children = ( 2B0270ACC0A1AAAC0088467BF0131477 /* Constraint.swift */, @@ -823,7 +950,7 @@ 6E13811703F4D15A85A9D2260B00A6A8 /* SnapKit.swift */, 2A5B605BCB86C161823225245B5EDBB7 /* View+SnapKit.swift */, A00F6A7822756001C1AC412B0A1751A8 /* ViewController+SnapKit.swift */, - 1E466D4275AA1B5D2C53DA4B161FC936 /* Support Files */, + 2A1E17E5720AF6B2248F90855609C69D /* Support Files */, ); path = SnapKit; sourceTree = ""; @@ -836,34 +963,19 @@ name = "Targets Support Files"; sourceTree = ""; }; - CB118812D42C86474AF505E547ACA98A /* Support Files */ = { - isa = PBXGroup; - children = ( - 3D0E67B2901EB5C44772E4815027EA15 /* Info.plist */, - 7A1F24548E146566C61A6DAED05EEE17 /* Spring.modulemap */, - 76DF3B10F049D7F6816FAA620502C379 /* Spring.xcconfig */, - 936EA872CF8E0965EED1956E3083186F /* Spring-Private.xcconfig */, - 6F5FA4219C27344F5A01D3CDD86C3EAB /* Spring-dummy.m */, - B754C8C2763C267AB8D2F38C50C413F4 /* Spring-prefix.pch */, - 4ACF5E472382B95FBDED0550E24C18DB /* Spring-umbrella.h */, - ); - name = "Support Files"; - path = "../Target Support Files/Spring"; - sourceTree = ""; - }; CBE67CAB38BEC5115D0799ABF61E1163 /* iOS */ = { isa = PBXGroup; children = ( - F530822DE8A9ADDEBEF89A24C9601155 /* AudioToolbox.framework */, - A7FD3B441184263DF43CB5142A4A8B68 /* CFNetwork.framework */, - 9AEE8FA20AB847F641C7E19D78474281 /* CoreGraphics.framework */, - 334C27B878CB55A2E533EEB5FEFAF669 /* CoreLocation.framework */, + 8CA2993073BEF1F00E8E948D6F17C0FF /* AudioToolbox.framework */, + BFDA6A3801715C48196AD0B41E0D706E /* CFNetwork.framework */, + B4E7832EE809C6BEC9E007BBEA7E0278 /* CoreGraphics.framework */, + E2DA6B24AAC4C76D5B4D70190AE510B9 /* CoreLocation.framework */, FB15F19ED9C1E6AF23DABA462D9E3D0D /* Foundation.framework */, - 1C6A0B3B36B82A17E757EB2384F69E7D /* QuartzCore.framework */, - C307288668C20E0C1AC8C4F54C1F794A /* Security.framework */, - A90D90B3C40658B1618985F4AE5619A2 /* StoreKit.framework */, - 86B3B2F11837A37D812CE9BF9D034517 /* SystemConfiguration.framework */, - A09E2048281B47F3A22B7A84C7B22F3D /* UIKit.framework */, + 452DC8A60EA82130BC0456AE720EFECD /* QuartzCore.framework */, + 4D5BABFE5290CD0BEBCDBC63FA523652 /* Security.framework */, + 9EDE0C8044AC622910A88EAC11D6BEB1 /* StoreKit.framework */, + B03B94162B852FAF229D6CB4D1FC0BBA /* SystemConfiguration.framework */, + CBB868387C6F0F3FCA32935DB61D9E54 /* UIKit.framework */, ); name = iOS; sourceTree = ""; @@ -871,90 +983,52 @@ CCA510CFBEA2D207524CDA0D73C3B561 /* Products */ = { isa = PBXGroup; children = ( - 8287E9D17815F27FF2B1FB1C05F6BAFC /* Alamofire.framework */, - 48F44658EFCC9D962C723EF00D444C88 /* Bolts.framework */, - C6297B2E3EADBDD08EEBADBD52B97D2B /* Parse.framework */, - FCBE96F76693D9700A2C9259D9B62B5A /* ParseUI.framework */, - 0403E497A9AFCB1B8E34FD5472ADCE6E /* Pods.framework */, + 17C0431787B6202B2A87A216D86980E4 /* Alamofire.framework */, + 255A0F85905C132A66880AEAC56B913C /* Bolts.framework */, + 74E0F2B09B2747B927DC8FDCE9A2802B /* Parse.framework */, + 787CDA821FFDFB2F042AC9C6CA614F0D /* ParseUI.framework */, + B01EE46937CA861B9BC5A7EF186D5A6E /* Pods.framework */, + E309E5BB982F5B2A87F782B8D65E1919 /* SVProgressHUD.framework */, 3DBD3F68F708AA6E6115CA4B4FCA0258 /* SnapKit.framework */, 451746300E823F97EB2F05F955A14B46 /* Spring.framework */, ); name = Products; sourceTree = ""; }; - D140F84DA40CB8011F3596913C698030 /* ParseUI */ = { + D5321D6DF498C44862509115A1223752 /* Frameworks */ = { isa = PBXGroup; children = ( - 061269ECCAC33FCB30DCD94C7E3C8179 /* PFActionButton.h */, - 6B677FC715FDBCE4406BD1EB97AF508E /* PFActionButton.m */, - F3B6F4E29F5CDC8F823CA749C3A3E566 /* PFActivityIndicatorCollectionReusableView.h */, - 473927365B9FCAEE40A98098760F529E /* PFActivityIndicatorCollectionReusableView.m */, - A91973A30FFA50DA9B85027FD1FF3FB4 /* PFActivityIndicatorTableViewCell.h */, - 90BC08A82FA5C4B953FD4C7514080F33 /* PFActivityIndicatorTableViewCell.m */, - A074C71E41494C35BFEA474B0CB0387B /* PFAlertView.h */, - BB6CDDB8B7D0F8F3AEA0B9B417D8EE65 /* PFAlertView.m */, - BE6DBD9263E4AAB7DEEA032905A4FBCC /* PFCollectionViewCell.h */, - 74644F56B2B1BF51955065D573BCAFFF /* PFCollectionViewCell.m */, - 89269306E96C93939F7F0150C232F262 /* PFColor.h */, - CC33F7917F30F0D128EB4597C33A850A /* PFColor.m */, - 8E08206DCF1412A04160C2A026B636E0 /* PFDismissButton.h */, - 6CD17B0D501488D7E11F7ED3E18444DF /* PFDismissButton.m */, - 17C4A07234837C6CA7292DCE78515E8E /* PFImage.h */, - 06C7B7564D072ADC32E4F931099E2D08 /* PFImage.m */, - ACD95C6A17107D7B0D4151CA092A2DC2 /* PFImageCache.h */, - 726340FD7A6DA30E8F9C818792479A74 /* PFImageCache.m */, - B02835E66DD9F8CD48090DE4A146B58B /* PFImageView.h */, - D21B5F4DF182266FD1A2E7A3CC2C9380 /* PFImageView.m */, - 076939F207BBC37D59D8E99D11C7C22B /* PFLoadingView.h */, - 3D9FCF401A907593B351131A977C75EA /* PFLoadingView.m */, - 9B5DB94AC2832BA38609FBB4A1FDA55B /* PFLocalization.h */, - 7CFAA8ECCA0D31547511C97AE749943D /* PFLogInView.h */, - DA65C47034D64F26A07A53F5D6A60A74 /* PFLogInView.m */, - 0AEB5FC45C9F39E323904CCEFBF1CDBA /* PFLogInViewController.h */, - DC48B0E3AA4A922AFE9B6D1A9C2B0D37 /* PFLogInViewController.m */, - 21930B8F5A2E3A4B419F4BA539177AB7 /* PFPrimaryButton.h */, - 1707E5D9518DEC7F116929A71CADFFDF /* PFPrimaryButton.m */, - 17274A6F722931352B127DDD52D5FFA3 /* PFProductTableViewController.h */, - 43DD19A7937FD56AEF4B9B78D9296E32 /* PFProductTableViewController.m */, - 5E9CCFAB17FA3A760D0191E1338C5397 /* PFPurchaseTableViewCell.h */, - DD3D276244CFAD2FD599BB2936EEE7F3 /* PFPurchaseTableViewCell.m */, - B0F8719E85935AC69D18E6940DA61A3B /* PFQueryCollectionViewController.h */, - B61F5ED2D9D993BCDEFA59B7D363A3E2 /* PFQueryCollectionViewController.m */, - 66DEEA830E416518FC457F0BCE0415DC /* PFQueryTableViewController.h */, - 7D84902042741975B690B3ED3FE6A531 /* PFQueryTableViewController.m */, - 7043FB2241DD3BFD163B10202318FBD5 /* PFRect.h */, - 8B30A225F9EB005CF64C491C590F7507 /* PFRect.m */, - 02152B278C4453D07DE372BA1878980B /* PFResources.h */, - A7EC8D261DE19EA24B57B2217D46056C /* PFResources.m */, - EC3087349188253DC83CDA33DBAD661B /* PFSignUpView.h */, - E5BC513513FF38AFAD95384D7F395606 /* PFSignUpView.m */, - D0ADFD5CDCB8C9CEE2DB0BBBD014FE2B /* PFSignUpViewController.h */, - 20E254CA0E4387DF2EB950F56CFD848A /* PFSignUpViewController.m */, - 05108789326C8A881E5B707AFAF6AA7E /* PFTableViewCell.h */, - 3102047A87F834152B0127E2007B94F2 /* PFTableViewCell.m */, - C3AFF7B7B40645594019B3C0D7E3C17B /* PFTextButton.h */, - 33F10576660B378B4CFC07528FF421DB /* PFTextButton.m */, - B2F0FC66388874B19F7B6FCC59571B45 /* PFTextField.h */, - 37466D05C28946491C8B6F92E1AF34F0 /* PFTextField.m */, - EEA666FC7A8B91B7C482755E5B37B81C /* ParseUI.h */, - E596E2F08BAC9C808CD9ED1063B35CDB /* ParseUIConstants.h */, - 4D4B530B859324B36505923E0DB03DC1 /* Resources */, - 0026FE70C0904C98BD25BAF2543C7AB6 /* Support Files */, + 0FF1064C49918490D4466B434376596B /* Bolts.framework */, + 9A3B5511329E515AC93B77B0CD4A74E0 /* Parse.framework */, + CBE67CAB38BEC5115D0799ABF61E1163 /* iOS */, ); - path = ParseUI; + name = Frameworks; sourceTree = ""; }; - D5321D6DF498C44862509115A1223752 /* Frameworks */ = { + DC98582A96EDFA423A4B9CA34FE9A271 /* Frameworks */ = { isa = PBXGroup; children = ( - E20A125CCB0E552FEF69171F2DEBB281 /* Bolts.framework */, - AD09D8CAABCAADEE168B585A7AC3484A /* Parse.framework */, - CBE67CAB38BEC5115D0799ABF61E1163 /* iOS */, + E5CDF921F4976DE32D33211CFBEEA4F3 /* libParseLib.a */, ); name = Frameworks; sourceTree = ""; }; - DD1C95206EC650B518C2BF69FE1FB0F7 /* Resources */ = { + E0E27334C89AC821CCA6113D285A3249 /* Support Files */ = { + isa = PBXGroup; + children = ( + 82F797AA556F23E825A45094B4EB475D /* Info.plist */, + 071B15E0027F5EBEA7E278BFDD90713C /* Spring.modulemap */, + 3F8C79A2B090D23F858817C6E00CDE75 /* Spring.xcconfig */, + 936EA872CF8E0965EED1956E3083186F /* Spring-Private.xcconfig */, + 6F5FA4219C27344F5A01D3CDD86C3EAB /* Spring-dummy.m */, + 2367F80CD9F7C71DA4C63D30FBBADCE8 /* Spring-prefix.pch */, + 4ACF5E472382B95FBDED0550E24C18DB /* Spring-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/Spring"; + sourceTree = ""; + }; + E5443CCCFA21ECBC4D1AD6FF3D344E18 /* Resources */ = { isa = PBXGroup; children = ( 6106FA0626AF6849CC0B8FA5321C5814 /* Images.xcassets */, @@ -963,6 +1037,14 @@ name = Resources; sourceTree = ""; }; + F441B9AB5A807C262AD57BB0312FD0F4 /* Resources */ = { + isa = PBXGroup; + children = ( + B53D33994CE2FBCF8BF2FD438BD01156 /* en.lproj */, + ); + name = Resources; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -974,153 +1056,164 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 5447A2C2F4A4781E0F122BF01FAD06D3 /* Headers */ = { + 42D92F20B29E3A1D498743ACD334D8E9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 69C450E747831FE0E7B7359647458614 /* PFActionButton.h in Headers */, - CCD46EC511BCCF0AE3B616D846C10878 /* PFActivityIndicatorCollectionReusableView.h in Headers */, - 4D16F7E70CA7A87FDFC72EC9075BCB29 /* PFActivityIndicatorTableViewCell.h in Headers */, - C6F3D6D623AA94D2C75F9CF1EAE556B9 /* PFAlertView.h in Headers */, - 3D5EE5E1A310CABF653D85A19E1BA989 /* PFCollectionViewCell.h in Headers */, - 85530926A731AD3A898D4A3EEF47E2F0 /* PFColor.h in Headers */, - B6745CFB4C3897C5C36CEE1B2D82DEA6 /* PFDismissButton.h in Headers */, - FA2224BE68772766C33D1C14AA9AE9B1 /* PFImage.h in Headers */, - 9F6480E139693689C0F8506F28EDEA2E /* PFImageCache.h in Headers */, - AF492F87C4072C4D4289E29457897E97 /* PFImageView.h in Headers */, - 56D16F568426CCAA5085520E13C3A1C6 /* PFLoadingView.h in Headers */, - 2B78486CBC75FF3E3182A6EA6FBF8BD3 /* PFLocalization.h in Headers */, - C7AE60F557E3003FAF2F01AE41C295AF /* PFLogInView.h in Headers */, - 28C557AAEC038370EB9324BD7EC69E3D /* PFLogInViewController.h in Headers */, - 069DCFF6F357AF739ABE21F1CA61C965 /* PFPrimaryButton.h in Headers */, - D50BC1D5B12EA5E6D087E96D5980C127 /* PFProductTableViewController.h in Headers */, - FF25769D96ED459BD66F1C3E7A8F1EE8 /* PFPurchaseTableViewCell.h in Headers */, - DFECD3DCFFC2475C846B578E51BA1FB2 /* PFQueryCollectionViewController.h in Headers */, - BECE90E288C76FC1149331156688DE0B /* PFQueryTableViewController.h in Headers */, - 10549903261B5C7AFB0E03BF5854949D /* PFRect.h in Headers */, - 0A73CB1ADD3B3C15343E2CDCDBCE2DC2 /* PFResources.h in Headers */, - 41B8F35C9C65B8B30B9F6C665BC39FC4 /* PFSignUpView.h in Headers */, - A4DBEC57E9EB55FD21358656224434C1 /* PFSignUpViewController.h in Headers */, - 0B9A5BDF04D2007E2ED35E04D02B8D06 /* PFTableViewCell.h in Headers */, - 072942E811E6C9100B1676766793F4B3 /* PFTextButton.h in Headers */, - 6CB1BEE715BFED05A71038A3A0747387 /* PFTextField.h in Headers */, - 889FB791C27A4C294058BBDE1E6022C2 /* ParseUI-umbrella.h in Headers */, - 48BB90D14AA949E0E1F31F29C738E912 /* ParseUI.h in Headers */, - B1BF0F846FF33D04397EA9047E25EFD8 /* ParseUIConstants.h in Headers */, + 3EB882DC3BE6A7E4CFA879BC4B31E449 /* BFCancellationToken.h in Headers */, + B58BA04269EA4002E513113DCA1F4988 /* BFCancellationTokenRegistration.h in Headers */, + 0387597031644C77CDAD71E7F48DF5EE /* BFCancellationTokenSource.h in Headers */, + 036EF8F81CFF50788C098069C8C30A39 /* BFDefines.h in Headers */, + 1F94518F62FFEF6DD9D6618D28EBE136 /* BFExecutor.h in Headers */, + AE1E1DF3C60983FD0E91C38437B6D637 /* BFTask.h in Headers */, + C2F38D10F2632283EBF13B925DCA372E /* BFTaskCompletionSource.h in Headers */, + E88993ADBF55D591D24C375D021EA375 /* Bolts-umbrella.h in Headers */, + CE6440B2339C05DA99776A76ADE4E7AA /* Bolts.h in Headers */, + 2E6F023908C55E78A8860126C56768BA /* BoltsVersion.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - 98DC239BCE4043C788B606F584C2E747 /* Headers */ = { + 5F5DEAC899AA0A3ADE0A2D8E4F26CD1A /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - DDF575AD6B47BCAFEB4BE7BF8B8F498D /* Spring-umbrella.h in Headers */, + CED19FF0568CF8F91378CA00576B48BE /* PFACL.h in Headers */, + 4EF849886BC37542888E82D736ABB350 /* PFAnalytics.h in Headers */, + 3EDC5D78EF81840A3518DA3A775657AA /* PFAnonymousUtils.h in Headers */, + 9A034B6A37CFA7F13EC6412F627AF13A /* PFCloud.h in Headers */, + CE91E809940E967B9AEDC8A3BB1D6372 /* PFConfig.h in Headers */, + 640FA1D873A103D35DE7F3D829453FE8 /* PFConstants.h in Headers */, + C17EA9D4CAC3C4A4A08E0A612A87CFB0 /* PFFile.h in Headers */, + 586B63CD22AA1E7CF5B79D91096A4002 /* PFGeoPoint.h in Headers */, + FB9F4B54305BE8F03FF8A25867A2BD69 /* PFInstallation.h in Headers */, + 4DBB69AA0815D2DC906A46AC35F920C8 /* PFNetworkActivityIndicatorManager.h in Headers */, + CBD7F8F8D123D647F3185AC0C75DB937 /* PFNullability.h in Headers */, + D58BBFD3150F77C2271FA15F678D2366 /* PFObject+Subclass.h in Headers */, + 6D49801E7C64CBC11380228DDEB31571 /* PFObject.h in Headers */, + 6E5562155E06E914EF7A627801E14565 /* PFProduct.h in Headers */, + F3431EB47D159524821969C8B695E141 /* PFPurchase.h in Headers */, + 4154A12EACF279F47EA694072A5EEFC5 /* PFPush.h in Headers */, + FAF8C60CEA6A6D9CDC82E172D894E300 /* PFQuery.h in Headers */, + B7C6F773EDC2E0EF5AEA448711E1ED47 /* PFRelation.h in Headers */, + 927826DD13A0952EFDB246EC3CCCDBED /* PFRole.h in Headers */, + 357818DAA624FE16454DC5F90B63B559 /* PFSession.h in Headers */, + ABD686A74099679780357C536CBBC6BC /* PFSubclassing.h in Headers */, + C362D5061FC52EA33FCC2A1F1C9253A7 /* PFTwitterUtils.h in Headers */, + 8B28FCF1CE459134934DFCB648EF79F5 /* PFUser.h in Headers */, + D9D16EACD61783FBEB383A4799E867E9 /* PF_Twitter.h in Headers */, + E7371ECC7586209051E37456F1A75191 /* Parse-umbrella.h in Headers */, + EB8D2F85232E124393A498CA73F07999 /* Parse.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - A46133287A96E7909AB5A6C8A6C5068B /* Headers */ = { + 867BE1B2E2FC409B169898791323EF79 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3CCF4CE0D330B2DC61359CD00FD7D87A /* Alamofire-umbrella.h in Headers */, + DB3B33C491B0A042CCD83EF00E73F06E /* Alamofire-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - D8BBB977B787A13A4D22BAEBBB96C04E /* Headers */ = { + 98DC239BCE4043C788B606F584C2E747 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + DDF575AD6B47BCAFEB4BE7BF8B8F498D /* Spring-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9D6ED88222CE8B3C7BED75F1CDAC5B5F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - A512D23B7F5E0B298F19280B9B0D44E3 /* PFACL.h in Headers */, - 4B22DFBB08C1DAA841F2E2A90983900C /* PFAnalytics.h in Headers */, - 31CEE4D47A07324201BF363110A88B7A /* PFAnonymousUtils.h in Headers */, - 9E951C5A963D508AC48ECCD4A69720D0 /* PFCloud.h in Headers */, - 1F7BD9A8EA0D7D3302281F418225B24D /* PFConfig.h in Headers */, - 0AAAA58D8DB041B4008942524225CB7A /* PFConstants.h in Headers */, - 6AB03A8697AB2C745D134A3314B15ECE /* PFFile.h in Headers */, - 0D1914603AA6A50213D6A3C45939F6F9 /* PFGeoPoint.h in Headers */, - E08A71BF43F93E2E40B711CC15745A93 /* PFInstallation.h in Headers */, - A969D1297DCD7E7626527888642356C2 /* PFNetworkActivityIndicatorManager.h in Headers */, - D516FF90C0B3806624CBC54B42AE3A3B /* PFNullability.h in Headers */, - 539BE27FF7E32477145F1989AF1AF07C /* PFObject+Subclass.h in Headers */, - 3910B25339DC47C320AE459EA34F3A33 /* PFObject.h in Headers */, - 7FB99F92C7F6DEEC58A07CEDEA1E3D97 /* PFProduct.h in Headers */, - E4F32A3FFA80F83585B306D991020B09 /* PFPurchase.h in Headers */, - D85B61A0FB7F2E630ED3FF39C5C9FB08 /* PFPush.h in Headers */, - EA4BE9EED53C55B3EE7E1E784CD639C9 /* PFQuery.h in Headers */, - 594E1BA3B3D7D7B0E8B0EA768A32F016 /* PFRelation.h in Headers */, - 6658AF09FA3B2A432167718AB274B361 /* PFRole.h in Headers */, - BB70EA35A1A916E574F7FACA7D462E1B /* PFSession.h in Headers */, - D6DA99A41E45D88514FEA4A781E42DF8 /* PFSubclassing.h in Headers */, - 0D2CCA0E49298A2560FCB82D4355124C /* PFTwitterUtils.h in Headers */, - 7873E85085A754312B5B2468DC040CBD /* PFUser.h in Headers */, - DFBEB9FA80B8BCCCF02B052CC1ECDBC2 /* PF_Twitter.h in Headers */, - A72EF0BFFA4BC03F402307ECE2DF616D /* Parse-umbrella.h in Headers */, - 91B0B19B00086AC28AD6187396DD84CB /* Parse.h in Headers */, + 5BBCCE4C7B6BABC5E0D9125D4F8FC92F /* Pods-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - EA526C034158E85ED23C7716075683C1 /* Headers */ = { + A6FE7148A741E639D5F41164A37C3B6F /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7AFB986891F3062A12F3B44BFC1CA030 /* Pods-umbrella.h in Headers */, + 48A7255B01E3398C32E3105B3F92A1A0 /* SVIndefiniteAnimatedView.h in Headers */, + 4D6617AA5A8DCA13BC8E11D6E173A5B5 /* SVProgressHUD-umbrella.h in Headers */, + 5C32FA556B16C58686C726CB57DB28CE /* SVProgressHUD.h in Headers */, + 73EB44DF2DBADDFA88E6119E031F2A57 /* SVRadialGradientLayer.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - F4C1BFE3CE29105C027C7F5811E7E830 /* Headers */ = { + E7A4A6E21F2BF19D2802316D050C64EF /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 3494DA5EB57B4BA1E02C5FBA99D4FCAF /* BFCancellationToken.h in Headers */, - 6171C4A567AF119DBF5A9828642C305A /* BFCancellationTokenRegistration.h in Headers */, - 2D1FFDEE41DA10935886D97C85D028AE /* BFCancellationTokenSource.h in Headers */, - 8B374FB1F37181FD3E9B63C710A3F3A1 /* BFDefines.h in Headers */, - FC6074D7116A1E85EC82FB502C38BB15 /* BFExecutor.h in Headers */, - 61A3F4234A9B7E66A6EED86EF4000CF6 /* BFTask.h in Headers */, - D2F0923E072647C05807A0C4A2EE1D9B /* BFTaskCompletionSource.h in Headers */, - B789D911CC144440C272F51E01DB397D /* Bolts-umbrella.h in Headers */, - EE054CB64D25D4EC707EE2EF0688374C /* Bolts.h in Headers */, - 2D1C626A61E89D8EB6A6C53E5F35F42A /* BoltsVersion.h in Headers */, + DA2957FBAFEB8B5CB6B279A3373F9249 /* PFActionButton.h in Headers */, + 78772AF4269486ACC41C0B0BC47F3859 /* PFActivityIndicatorCollectionReusableView.h in Headers */, + BEE888C2965FBDBD3AF49A1C0E784D38 /* PFActivityIndicatorTableViewCell.h in Headers */, + 8F5880D02EC1429D731E8CB5DE6FBA62 /* PFAlertView.h in Headers */, + B87BC6AFA2F15F6C06E7B2080ECE341E /* PFCollectionViewCell.h in Headers */, + 7E93CAA9F6D292E7BFE886723EF11B04 /* PFColor.h in Headers */, + A5FB4FC9341AF54DDBC6F0E259BF5751 /* PFDismissButton.h in Headers */, + 71C076FDDBE1B7C862C75D4FFFC8A4F7 /* PFImage.h in Headers */, + 9888832F68C42C098818FE81B4E56C93 /* PFImageCache.h in Headers */, + F271248AF8E239B1F0FB662E2525C66E /* PFImageView.h in Headers */, + 5A2966D2385AD004D3C566729CC4909A /* PFLoadingView.h in Headers */, + 7D7FBA0B5CE0ED500738FC0ACE4B5E60 /* PFLocalization.h in Headers */, + 00542154935409B6E0F7216646D9B2A0 /* PFLogInView.h in Headers */, + 1F046BCDB89C073112BE882DF60ED712 /* PFLogInViewController.h in Headers */, + 27069DFD47FAC7A6A27AB4C62F9EE44F /* PFPrimaryButton.h in Headers */, + DFF2A1EDD7E9D5FB66C276959E0D0712 /* PFProductTableViewController.h in Headers */, + 46B3F3ABECEB4E81857EC5A0F2467136 /* PFPurchaseTableViewCell.h in Headers */, + FC2C3C6063FE39968B7613B0F88F5AB3 /* PFQueryCollectionViewController.h in Headers */, + AE00736E85E3AEE07BB77BBAAFA73F62 /* PFQueryTableViewController.h in Headers */, + 56AB4535244D5D5C3A5D7B706F36D727 /* PFRect.h in Headers */, + 2DBD001AAADA4542C8EFFF6F52630A22 /* PFResources.h in Headers */, + E31045ABA8961A34400D284F1B54C948 /* PFSignUpView.h in Headers */, + 76E443A1A0349619B388D2555A925882 /* PFSignUpViewController.h in Headers */, + 0804FDC25E2FC24FCB3FCA153273134C /* PFTableViewCell.h in Headers */, + 261D8207E3D16403BAB0D7953350A39F /* PFTextButton.h in Headers */, + 8E9F9BE43A783CC74A1EF6CFDFA0D505 /* PFTextField.h in Headers */, + 462B6D0E9C8E5A6949AEC0AC6A27D394 /* ParseUI-umbrella.h in Headers */, + 50C82437DA072084E673762C9D8925F3 /* ParseUI.h in Headers */, + 01B3A67869930615807D407D0AB86CFE /* ParseUIConstants.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 1091688AA925600943826D4E240A451A /* ParseUI */ = { + 235C5CA5D82C2DD787A19D63A785CABA /* Parse */ = { isa = PBXNativeTarget; - buildConfigurationList = 2EF5408FA251FFFAAD3C4AF20A1466F6 /* Build configuration list for PBXNativeTarget "ParseUI" */; + buildConfigurationList = B14337B988305938196ECF7464D50BA9 /* Build configuration list for PBXNativeTarget "Parse" */; buildPhases = ( - B4E03B8D06942B0947FD77A62A456C5C /* Sources */, - 95BB79C4962F936EB8103C27982AA4AA /* Frameworks */, - 5447A2C2F4A4781E0F122BF01FAD06D3 /* Headers */, - 63F35BF759D6215FBBC85A0B593236B5 /* Resources */, + 3F23D5C61353A3DD5F35922A121ADA0A /* Sources */, + 8385B5C5BD1897A3F21341F8BBC1083D /* Frameworks */, + 5F5DEAC899AA0A3ADE0A2D8E4F26CD1A /* Headers */, ); buildRules = ( ); dependencies = ( - 24D13B2D4A0FFEDA20E3F91355F887ED /* PBXTargetDependency */, + 7D1018159696E72DE0316CCDC38685F6 /* PBXTargetDependency */, ); - name = ParseUI; - productName = ParseUI; - productReference = FCBE96F76693D9700A2C9259D9B62B5A /* ParseUI.framework */; + name = Parse; + productName = Parse; + productReference = 74E0F2B09B2747B927DC8FDCE9A2802B /* Parse.framework */; productType = "com.apple.product-type.framework"; }; - 10FC5CE2B571075A620708ACED6A2623 /* Bolts */ = { + 3CD6A168CBF3B631BB2C2F0BE2952A1C /* SVProgressHUD */ = { isa = PBXNativeTarget; - buildConfigurationList = E1480EE833DE42CEDCCBC5D64E524AC0 /* Build configuration list for PBXNativeTarget "Bolts" */; + buildConfigurationList = AD1D238F5E67D012535A251B52B51E90 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */; buildPhases = ( - 67181E9F42B5D7A5BF903D7E6645D156 /* Sources */, - D95879F8F27DF1E4386DD4358AC6005C /* Frameworks */, - F4C1BFE3CE29105C027C7F5811E7E830 /* Headers */, + C3C7C7250D18FF994BF65B322A9C97A9 /* Sources */, + 0F99D05C9B8F941A18E02E477CCEB8DB /* Frameworks */, + A6FE7148A741E639D5F41164A37C3B6F /* Headers */, + 0FDE7150A5458E50867AC2A894E02E5B /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = Bolts; - productName = Bolts; - productReference = 48F44658EFCC9D962C723EF00D444C88 /* Bolts.framework */; + name = SVProgressHUD; + productName = SVProgressHUD; + productReference = E309E5BB982F5B2A87F782B8D65E1919 /* SVProgressHUD.framework */; productType = "com.apple.product-type.framework"; }; 4ADDC830F1F3957A877DC0A28F0CBD4E /* Spring */ = { @@ -1158,31 +1251,32 @@ productReference = 3DBD3F68F708AA6E6115CA4B4FCA0258 /* SnapKit.framework */; productType = "com.apple.product-type.framework"; }; - 77545C60DD00C9F792CEEC9995290A1C /* Parse */ = { + 61A52E32A13FD38217F820D4B11E57B1 /* ParseUI */ = { isa = PBXNativeTarget; - buildConfigurationList = D0A81189E3090AF797E260E0AA5A7909 /* Build configuration list for PBXNativeTarget "Parse" */; + buildConfigurationList = AC1C1C3D1D3FF1284B83FBE577CD3AC6 /* Build configuration list for PBXNativeTarget "ParseUI" */; buildPhases = ( - 725501BD6B01EE6978994096E358A4B0 /* Sources */, - B009C832B94E59C07DA3F12DEDEA7E9F /* Frameworks */, - D8BBB977B787A13A4D22BAEBBB96C04E /* Headers */, + 98C777E72BFE06B4C6B0C20E3AF63890 /* Sources */, + 2C232310956C773C00EADE3683F7F6AE /* Frameworks */, + E7A4A6E21F2BF19D2802316D050C64EF /* Headers */, + 4AEFA7D8F6664612CFA7E4D04B3F472F /* Resources */, ); buildRules = ( ); dependencies = ( - 4F06BCC5FCCE2E4DCA85396D37BC1B65 /* PBXTargetDependency */, + DDA731DBB051F7638504C9AE61AEDAAB /* PBXTargetDependency */, ); - name = Parse; - productName = Parse; - productReference = C6297B2E3EADBDD08EEBADBD52B97D2B /* Parse.framework */; + name = ParseUI; + productName = ParseUI; + productReference = 787CDA821FFDFB2F042AC9C6CA614F0D /* ParseUI.framework */; productType = "com.apple.product-type.framework"; }; - BB49AA45405B3C29158A457C15B32CB8 /* Alamofire */ = { + 85C0FAEA03C3F706077F691B3555AD88 /* Alamofire */ = { isa = PBXNativeTarget; - buildConfigurationList = 97647631F302732AB7A25809055D32A4 /* Build configuration list for PBXNativeTarget "Alamofire" */; + buildConfigurationList = F8B4D4B5951956E02146591824213E9B /* Build configuration list for PBXNativeTarget "Alamofire" */; buildPhases = ( - DDC28D2424073158D26ACE736D046AE3 /* Sources */, - 08647492B6066149ABA8A594AE50E568 /* Frameworks */, - A46133287A96E7909AB5A6C8A6C5068B /* Headers */, + 37D1A700CCA72F5B3A601AE3480DD782 /* Sources */, + 023E83B9DE14C2314C9AD19682630DF8 /* Frameworks */, + 867BE1B2E2FC409B169898791323EF79 /* Headers */, ); buildRules = ( ); @@ -1190,30 +1284,48 @@ ); name = Alamofire; productName = Alamofire; - productReference = 8287E9D17815F27FF2B1FB1C05F6BAFC /* Alamofire.framework */; + productReference = 17C0431787B6202B2A87A216D86980E4 /* Alamofire.framework */; productType = "com.apple.product-type.framework"; }; - C5441A043671A407F5F8CDE2FC6859EF /* Pods */ = { + 8D88C1D9673E5D48828AE5F0FB9A083C /* Bolts */ = { isa = PBXNativeTarget; - buildConfigurationList = E6FAFC61EBF1AE7D0DC84EE8D3FFBE06 /* Build configuration list for PBXNativeTarget "Pods" */; + buildConfigurationList = 24EFFB441B0D023E76F682EB24A0A43A /* Build configuration list for PBXNativeTarget "Bolts" */; buildPhases = ( - 04EF884EED66DAC9F3736DAC167CC806 /* Sources */, - FC19A6CADDE08DC35E56C4D238DD73EE /* Frameworks */, - EA526C034158E85ED23C7716075683C1 /* Headers */, + 3E417A282EF02DE9B171FAA5694786CF /* Sources */, + 9E33B49EA32E177EDE38BED1A9139D79 /* Frameworks */, + 42D92F20B29E3A1D498743ACD334D8E9 /* Headers */, ); buildRules = ( ); dependencies = ( - 25B6CD0FC9F979DC0CC6CE1C2684E6D7 /* PBXTargetDependency */, - 69882778577A691FFABB27A0541886B5 /* PBXTargetDependency */, - D7F9C43DFBA669784EF4196C6E7FC8F1 /* PBXTargetDependency */, - 68031510DD11D85FA2FB46A5D81D7A5C /* PBXTargetDependency */, - 045469CA6BEF22AB85CCCEC3EA3F7AA3 /* PBXTargetDependency */, - 309FBAB047320B2C149540842AB6867F /* PBXTargetDependency */, + ); + name = Bolts; + productName = Bolts; + productReference = 255A0F85905C132A66880AEAC56B913C /* Bolts.framework */; + productType = "com.apple.product-type.framework"; + }; + D8A0CB5D0264B3807A246C5F16C45FE9 /* Pods */ = { + isa = PBXNativeTarget; + buildConfigurationList = CF4FB936E6BE741310FD60CA946BB279 /* Build configuration list for PBXNativeTarget "Pods" */; + buildPhases = ( + 72EB96743D420DDF98718833F39C7ED9 /* Sources */, + 8A9E73BC13890969B366D91190263A3C /* Frameworks */, + 9D6ED88222CE8B3C7BED75F1CDAC5B5F /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + F78E5964AA2A88015E7C42CCFCF24547 /* PBXTargetDependency */, + 91CDA20A79BFCC401F6B5692573ECDEF /* PBXTargetDependency */, + C0DCA4E03EC0A774363C24B1FC1A49F1 /* PBXTargetDependency */, + C4DF196A06BC5BCA90714126A1AC10F9 /* PBXTargetDependency */, + 12F8B66633D6769A378FA5E1270BB9DF /* PBXTargetDependency */, + FFB24355E705D2E1926BB45A4085B31C /* PBXTargetDependency */, + C2DE90DEE7CB6D5E22C02BDF88C27946 /* PBXTargetDependency */, ); name = Pods; productName = Pods; - productReference = 0403E497A9AFCB1B8E34FD5472ADCE6E /* Pods.framework */; + productReference = B01EE46937CA861B9BC5A7EF186D5A6E /* Pods.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -1237,11 +1349,12 @@ projectDirPath = ""; projectRoot = ""; targets = ( - BB49AA45405B3C29158A457C15B32CB8 /* Alamofire */, - 10FC5CE2B571075A620708ACED6A2623 /* Bolts */, - 77545C60DD00C9F792CEEC9995290A1C /* Parse */, - 1091688AA925600943826D4E240A451A /* ParseUI */, - C5441A043671A407F5F8CDE2FC6859EF /* Pods */, + 85C0FAEA03C3F706077F691B3555AD88 /* Alamofire */, + 8D88C1D9673E5D48828AE5F0FB9A083C /* Bolts */, + 235C5CA5D82C2DD787A19D63A785CABA /* Parse */, + 61A52E32A13FD38217F820D4B11E57B1 /* ParseUI */, + D8A0CB5D0264B3807A246C5F16C45FE9 /* Pods */, + 3CD6A168CBF3B631BB2C2F0BE2952A1C /* SVProgressHUD */, 4EDA452517A913B556C7860F490D5FD3 /* SnapKit */, 4ADDC830F1F3957A877DC0A28F0CBD4E /* Spring */, ); @@ -1249,6 +1362,14 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 0FDE7150A5458E50867AC2A894E02E5B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5320E8F68466C033ECD689829B9AF0D6 /* SVProgressHUD.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 21F0D8FA20A0BFC40C66582B29294976 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1258,79 +1379,111 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 63F35BF759D6215FBBC85A0B593236B5 /* Resources */ = { + 4AEFA7D8F6664612CFA7E4D04B3F472F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 4A171D4857AF49F74337F53B6764B653 /* en.lproj in Resources */, + 3A411C8BBDB755C980A8CA64106B9743 /* en.lproj in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 04EF884EED66DAC9F3736DAC167CC806 /* Sources */ = { + 37D1A700CCA72F5B3A601AE3480DD782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C357BEF62A1B64BC642AD7ACAB5E2D1C /* Alamofire-dummy.m in Sources */, + 9E4523F9AD635FFA505D93852A4725AA /* Alamofire.swift in Sources */, + 837C018C8935D259B378D2D3AA746118 /* Download.swift in Sources */, + 60F08273F56AB927524464832F3033A5 /* Error.swift in Sources */, + E96B6C7AE4A6D521EC8D7EF8C41D083A /* Manager.swift in Sources */, + 39017DF418957A8AC7C562DD8CE77E09 /* MultipartFormData.swift in Sources */, + C75C3966653ABAFF635C8B76F577DA88 /* ParameterEncoding.swift in Sources */, + 15150C73965ADEE5A751CEE39C5CB8CD /* Request.swift in Sources */, + 21F8DC886788ECAE6C24E819922134A3 /* ResponseSerialization.swift in Sources */, + DF3F5FA80C168BD40810EF241B024A16 /* Result.swift in Sources */, + E90143FE21009D78D8455E9F6FAAEBF3 /* ServerTrustPolicy.swift in Sources */, + 11B82CDBABB4133910945083B140E6B3 /* Stream.swift in Sources */, + 2B9C4851706AB469708026633229E81F /* Upload.swift in Sources */, + 6F2AB5AA862ECAE194284D94234A1C98 /* Validation.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3E417A282EF02DE9B171FAA5694786CF /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - A22767F2F0711E5BA446582DFF8AD6B2 /* Pods-dummy.m in Sources */, + 7DD3931B15B8AD69D0B3482DABB199B4 /* BFCancellationToken.m in Sources */, + 79F1B78A0ABCA80A286CA88C47C06A3F /* BFCancellationTokenRegistration.m in Sources */, + E2CD38897547A273E88DE2281590149A /* BFCancellationTokenSource.m in Sources */, + 4B00E0B04DB9FEC43102CAA8448B1BF1 /* BFExecutor.m in Sources */, + 8D2299BA9A7F1E615DDD45369689B26E /* BFTask.m in Sources */, + 376CFC345181340679CC9B14D2F29FED /* BFTaskCompletionSource.m in Sources */, + E7D9D26AB80C32AAC77C9D08000A0AA8 /* Bolts-dummy.m in Sources */, + 92AD7EE01191C38E06D286E317CAE066 /* Bolts.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 67181E9F42B5D7A5BF903D7E6645D156 /* Sources */ = { + 3F23D5C61353A3DD5F35922A121ADA0A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5B78BFB3D8108F47E893630BFCA9BF9C /* BFCancellationToken.m in Sources */, - B34E814739F72988E68281C16866A026 /* BFCancellationTokenRegistration.m in Sources */, - FE5600F80309C0D314ECB21D032C2782 /* BFCancellationTokenSource.m in Sources */, - FEAFA6E5ED98D2C85A2BE0875A444C38 /* BFExecutor.m in Sources */, - 8AC235CBE26851B2896AFE4DAB7FB7F7 /* BFTask.m in Sources */, - 5D5C27ECB8CEB5148D95EB3A9359D41A /* BFTaskCompletionSource.m in Sources */, - 8D0B4246EB6DCBE5341094235A1A4101 /* Bolts-dummy.m in Sources */, - 94128477785758DC1215D0BF99F5A4E0 /* Bolts.m in Sources */, + 4B565647E4CE2866BB776844F5125965 /* Empty.m in Sources */, + E63D2178263649942FA15921B439E898 /* Parse-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - 725501BD6B01EE6978994096E358A4B0 /* Sources */ = { + 72EB96743D420DDF98718833F39C7ED9 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 7A7BF1A47974A6A1DFABDACEDB04BFFF /* Empty.m in Sources */, - FD60E5C4A9526A38D9AD81937528FDA8 /* Parse-dummy.m in Sources */, + 9AC2822452FF90EF30FBA616C28A7725 /* Pods-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - B4E03B8D06942B0947FD77A62A456C5C /* Sources */ = { + 98C777E72BFE06B4C6B0C20E3AF63890 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C80DBBA97B4422DF4D1BE50E563C7741 /* PFActionButton.m in Sources */, - AD40077A1966D9D3583BE9DA4B198587 /* PFActivityIndicatorCollectionReusableView.m in Sources */, - F786F5BE99346FE26924CB1AAE792059 /* PFActivityIndicatorTableViewCell.m in Sources */, - 1A2FD81B6F57264FFE591C59C48DCD96 /* PFAlertView.m in Sources */, - FD625E4BF7141086F2E18867866CEB05 /* PFCollectionViewCell.m in Sources */, - 41F70FC034C180D8FCA89D547B12D40C /* PFColor.m in Sources */, - B6C9E45062DAD2A3F334B4D4C5B68879 /* PFDismissButton.m in Sources */, - C647263ABFD3E2F396CED0B302BE628A /* PFImage.m in Sources */, - 70FE6B4F8CC6539B8EC79CC74FFB52F1 /* PFImageCache.m in Sources */, - 69655D0FBC29299F9826728F90A62B0A /* PFImageView.m in Sources */, - 73AA26D2C8A7981D0D8213EE64E53649 /* PFLoadingView.m in Sources */, - 0E739B8AED070BC72A746FC43F67724F /* PFLogInView.m in Sources */, - A70DE4B544BA1BFA70712ED070859312 /* PFLogInViewController.m in Sources */, - 07992CB93B76BBBD3A7C7B606559DFFB /* PFPrimaryButton.m in Sources */, - 1D256E7932C2EDE1147B7779AE7C846E /* PFProductTableViewController.m in Sources */, - 103BD05F091C19AC0A657376A24C5DEE /* PFPurchaseTableViewCell.m in Sources */, - 9337EED969067181016FC60CC91D0A25 /* PFQueryCollectionViewController.m in Sources */, - B5EC7BD68B23662B134F23A5711F5F18 /* PFQueryTableViewController.m in Sources */, - 82E5002F2CA571805B184403F7B88F67 /* PFRect.m in Sources */, - DE14523DFEB00D26207482AF9154A08A /* PFResources.m in Sources */, - F7C44B88B46C865A9830777F246563C3 /* PFSignUpView.m in Sources */, - B2FA995DC707053FCC8907AE9146A820 /* PFSignUpViewController.m in Sources */, - E8CFBA421710EF479C84DEFF028B859C /* PFTableViewCell.m in Sources */, - 2C811D9D9F74025612B3E5BB86F33A0D /* PFTextButton.m in Sources */, - DC7398C7C0B9258DDF3104CEF9056AF7 /* PFTextField.m in Sources */, - 337262395403AE7B94F06B3D16EB1F43 /* ParseUI-dummy.m in Sources */, + 9891149AAC68F87AF4DA22877094521B /* PFActionButton.m in Sources */, + 61FB58415A85514CD7366370E081ACC7 /* PFActivityIndicatorCollectionReusableView.m in Sources */, + A45D9D17328D1AAAA7222313318C3831 /* PFActivityIndicatorTableViewCell.m in Sources */, + 7BA5D269E28371444E60DF07C1EC894D /* PFAlertView.m in Sources */, + 05FE27011DE54090E4BE4029429D8427 /* PFCollectionViewCell.m in Sources */, + 3949FEBF3BF079829A622434619D4D7C /* PFColor.m in Sources */, + 35BA8B26BA3FF9EE389EDA244F3240C2 /* PFDismissButton.m in Sources */, + 361EE1A511CE78B7C59775C8F44F43F0 /* PFImage.m in Sources */, + 66035B9E35B16BE8CC3820E250029868 /* PFImageCache.m in Sources */, + E89E10B73335AA160BDE8D05A41E17A6 /* PFImageView.m in Sources */, + D2CE3816A69F70889FEFDA33968E37CA /* PFLoadingView.m in Sources */, + B78CBD9E9538363A533A6659F46BAE21 /* PFLogInView.m in Sources */, + 4E4D33EB340E341A8CBBF9C1057A3ECF /* PFLogInViewController.m in Sources */, + A074914EA314C559B519718BCFAE1568 /* PFPrimaryButton.m in Sources */, + BE3D74842C4B26AD5A15F30B86F6F273 /* PFProductTableViewController.m in Sources */, + 6BD52C05450099582B25A2164A50F2CC /* PFPurchaseTableViewCell.m in Sources */, + 537A37E464F4FF3F0F38FC06CC0AAD54 /* PFQueryCollectionViewController.m in Sources */, + 46E6E0A9C42605F730517D83A819266B /* PFQueryTableViewController.m in Sources */, + BFAB994DAFBE38A006E51BA45BFF6E81 /* PFRect.m in Sources */, + EE3F1DB0D7EE48DAF178C57F3CC1AFF4 /* PFResources.m in Sources */, + F0CA640D732D970B8664007876F64912 /* PFSignUpView.m in Sources */, + 59878F3121333CB7A57BDFB3EA53368F /* PFSignUpViewController.m in Sources */, + 93FA2E68E0DB9606BE686744428E87D2 /* PFTableViewCell.m in Sources */, + 2F341D8F76DFAE9B0489607ADB975DEB /* PFTextButton.m in Sources */, + 3C2840F926E8C2DF0CAF3604DBFC469F /* PFTextField.m in Sources */, + C1E3E3D87295E4783F26D693C89378CC /* ParseUI-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C3C7C7250D18FF994BF65B322A9C97A9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AFEBD6DA74A0DD12DA250FF0A91A3940 /* SVIndefiniteAnimatedView.m in Sources */, + C9AA6D0A1F2F1E9E0991FC1DE9C28523 /* SVProgressHUD-dummy.m in Sources */, + D038F2276792902B80CCA388F5778175 /* SVProgressHUD.m in Sources */, + B83FF94D922ED493F66036A928852E6F /* SVRadialGradientLayer.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1354,27 +1507,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DDC28D2424073158D26ACE736D046AE3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - CC5A157C447F72EC96B8D15E952FB5A1 /* Alamofire-dummy.m in Sources */, - 16AAC2788482090D85976A0620D6A831 /* Alamofire.swift in Sources */, - 682F0D80D52620252D001284672DD8B8 /* Download.swift in Sources */, - 9DAC86BD34D3B4D5154900729AFCB0B4 /* Error.swift in Sources */, - EBE6C837145AED845C3FAED9611E0CE6 /* Manager.swift in Sources */, - 25AA95E50F4AF923B35CBD537E551A6B /* MultipartFormData.swift in Sources */, - 241E49D04E71CF311AEEBE4FCEA28D37 /* ParameterEncoding.swift in Sources */, - B61606E3136018C59B7EA1162ADCC79B /* Request.swift in Sources */, - D51B649A51D369ED35CC9B489DB1F0AD /* ResponseSerialization.swift in Sources */, - 81C0FB46AA83894EF0D0F8179985F4D0 /* Result.swift in Sources */, - 4D090ACD4E980D42EC4D62B6C77CE309 /* ServerTrustPolicy.swift in Sources */, - AC97B7A733EB3AADA009E416C6E2643C /* Stream.swift in Sources */, - 349C775B7F3CBC689577E923A8D62220 /* Upload.swift in Sources */, - 10B1CC7C5E6BFFD4BDFA74D89225A16A /* Validation.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; F6B8408D5CBE56BBC1C0DC03998D76CB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1413,60 +1545,120 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 045469CA6BEF22AB85CCCEC3EA3F7AA3 /* PBXTargetDependency */ = { + 12F8B66633D6769A378FA5E1270BB9DF /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = SnapKit; - target = 4EDA452517A913B556C7860F490D5FD3 /* SnapKit */; - targetProxy = EB427ADDD8CEC964ECB3282CF4297126 /* PBXContainerItemProxy */; + name = SVProgressHUD; + target = 3CD6A168CBF3B631BB2C2F0BE2952A1C /* SVProgressHUD */; + targetProxy = 0264CCA35835DEEDED72438934DA4C39 /* PBXContainerItemProxy */; }; - 24D13B2D4A0FFEDA20E3F91355F887ED /* PBXTargetDependency */ = { + 7D1018159696E72DE0316CCDC38685F6 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Parse; - target = 77545C60DD00C9F792CEEC9995290A1C /* Parse */; - targetProxy = F7536014CFA3998E1F983815A38CAA27 /* PBXContainerItemProxy */; + name = Bolts; + target = 8D88C1D9673E5D48828AE5F0FB9A083C /* Bolts */; + targetProxy = A8C1FA3148E2C91F9462A27EDC3DFCE8 /* PBXContainerItemProxy */; }; - 25B6CD0FC9F979DC0CC6CE1C2684E6D7 /* PBXTargetDependency */ = { + 91CDA20A79BFCC401F6B5692573ECDEF /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Alamofire; - target = BB49AA45405B3C29158A457C15B32CB8 /* Alamofire */; - targetProxy = CC785A7EE4E95822352CB07EC1B45C13 /* PBXContainerItemProxy */; + name = Bolts; + target = 8D88C1D9673E5D48828AE5F0FB9A083C /* Bolts */; + targetProxy = 93924BC7084BB6F89A4EF57B9714D118 /* PBXContainerItemProxy */; + }; + C0DCA4E03EC0A774363C24B1FC1A49F1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Parse; + target = 235C5CA5D82C2DD787A19D63A785CABA /* Parse */; + targetProxy = 2F79BB45A1A068748B0ED835D51962BF /* PBXContainerItemProxy */; }; - 309FBAB047320B2C149540842AB6867F /* PBXTargetDependency */ = { + C2DE90DEE7CB6D5E22C02BDF88C27946 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = Spring; target = 4ADDC830F1F3957A877DC0A28F0CBD4E /* Spring */; - targetProxy = E5652175708BDEE4182E3B100925D06A /* PBXContainerItemProxy */; + targetProxy = EDE47945FCD3FA70E77E2A4CBC82EA18 /* PBXContainerItemProxy */; }; - 4F06BCC5FCCE2E4DCA85396D37BC1B65 /* PBXTargetDependency */ = { + C4DF196A06BC5BCA90714126A1AC10F9 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Bolts; - target = 10FC5CE2B571075A620708ACED6A2623 /* Bolts */; - targetProxy = 7DB5D1D86535DCAF19019F7BC5A1E411 /* PBXContainerItemProxy */; + name = ParseUI; + target = 61A52E32A13FD38217F820D4B11E57B1 /* ParseUI */; + targetProxy = 413D839EE2D49DC60335F942FBFF1D7B /* PBXContainerItemProxy */; }; - 68031510DD11D85FA2FB46A5D81D7A5C /* PBXTargetDependency */ = { + DDA731DBB051F7638504C9AE61AEDAAB /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = ParseUI; - target = 1091688AA925600943826D4E240A451A /* ParseUI */; - targetProxy = C34248A9CB95A89509697B5875E3B447 /* PBXContainerItemProxy */; + name = Parse; + target = 235C5CA5D82C2DD787A19D63A785CABA /* Parse */; + targetProxy = D7C3DD80E36C76111F28464520C1148F /* PBXContainerItemProxy */; }; - 69882778577A691FFABB27A0541886B5 /* PBXTargetDependency */ = { + F78E5964AA2A88015E7C42CCFCF24547 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Bolts; - target = 10FC5CE2B571075A620708ACED6A2623 /* Bolts */; - targetProxy = 10310F8FD28115C6D92DD36CFCCD3508 /* PBXContainerItemProxy */; + name = Alamofire; + target = 85C0FAEA03C3F706077F691B3555AD88 /* Alamofire */; + targetProxy = 860351DD2EFD306846D21F2ABAE12B9D /* PBXContainerItemProxy */; }; - D7F9C43DFBA669784EF4196C6E7FC8F1 /* PBXTargetDependency */ = { + FFB24355E705D2E1926BB45A4085B31C /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = Parse; - target = 77545C60DD00C9F792CEEC9995290A1C /* Parse */; - targetProxy = 71111488C2E050A4E5DF4DF9C35DE7FE /* PBXContainerItemProxy */; + name = SnapKit; + target = 4EDA452517A913B556C7860F490D5FD3 /* SnapKit */; + targetProxy = A689706B720E0085F7221EE2948083FB /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 01D9A98050BB28D4C1149C3EC67CC053 /* Release */ = { + 0CA4A2C6E8A9E00609901E5D8C71F228 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9DBF5386BD59DD908C3BBB66F313924C /* SVProgressHUD-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.1.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = SVProgressHUD; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0E14E9E4CC86E40DA6B1CF9BA126F973 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9DBF5386BD59DD908C3BBB66F313924C /* SVProgressHUD-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.1.3; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/SVProgressHUD/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/SVProgressHUD/SVProgressHUD.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = SVProgressHUD; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 23EEB5E7DFDB24635D6726D91275EED6 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A80B5C0BF5D2CDCBA1B8EABCBAD8D729 /* Pods.release.xcconfig */; + baseConfigurationReference = 5B91690FAC44BB238E55220E574A4A1F /* Pods.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1; @@ -1520,9 +1712,9 @@ }; name = Release; }; - 33EF4ACDC24D9329102B24509E1C4A9B /* Release */ = { + 30FA33E6A87F43B70ED4E778F8CA1AB2 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 51909C7F1AD1EBABD6272372A4140053 /* ParseUI-Private.xcconfig */; + baseConfigurationReference = 3ACBC43B508943DB8829B56E0FFEFCDB /* ParseUI-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1.1.4; @@ -1538,7 +1730,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/ParseUI/ParseUI.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = ParseUI; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1546,38 +1738,41 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 40EAA00556D4B56F128CF16FC6EF789B /* Release */ = { + 4EFB08339B63A8448D3EF5ADE434E4FD /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7B6643B0DA0A5E02F0020A3FF33B7346 /* Alamofire-Private.xcconfig */; + baseConfigurationReference = A65101DC9EB52DC9111DF0C0601F5128 /* Pods.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2.0.2; + CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 2; - DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Alamofire; + MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_NAME = Pods; SDKROOT = iphoneos; SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; - 55F3571E87E13C402FB6BCDE8E4D5226 /* Release */ = { + 4FD3043631C358093CA58B817E8364B2 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3BA75C13F675948CCDEFF6EFE449CD18 /* Parse-Private.xcconfig */; + baseConfigurationReference = 16750CC5D92DB8C6C526741A011C5B91 /* Parse-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1.7.5; @@ -1593,7 +1788,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/Parse/Parse.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; PRODUCT_NAME = Parse; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1601,7 +1796,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Release; + name = Debug; }; 5E07DD7BB990B4F0E266EB3EC391CECE /* Debug */ = { isa = XCBuildConfiguration; @@ -1631,53 +1826,26 @@ }; name = Debug; }; - 8243CBDF643AC293C6871D41A2A86E47 /* Debug */ = { + 8A5B046F98EFAC2E64478CA5826ACA3B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 3BA75C13F675948CCDEFF6EFE449CD18 /* Parse-Private.xcconfig */; + baseConfigurationReference = 3ACBC43B508943DB8829B56E0FFEFCDB /* ParseUI-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1.7.5; + CURRENT_PROJECT_VERSION = 1.1.4; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Parse/Parse-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Parse/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Parse/Parse.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Parse; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 85DC353349C3AB1A36CE2AA303686C05 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2D4F759353A8957B54E7F1FA28611B2B /* Bolts-Private.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1.3.0; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Bolts/Bolts-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Bolts/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/ParseUI/ParseUI-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ParseUI/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Bolts/Bolts.modulemap"; + MODULEMAP_FILE = "Target Support Files/ParseUI/ParseUI.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = Bolts; + PRODUCT_NAME = ParseUI; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1686,27 +1854,25 @@ }; name = Release; }; - 88D861D3CCC386377A953D922E7CCA3D /* Debug */ = { + 901CFF997DEDD82C69474AE460DEAE63 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 66EA5941F2B36360103507DAB9E6258D /* Pods.debug.xcconfig */; + baseConfigurationReference = 5F5388130D37843645ADF5DCA408FB72 /* Alamofire-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1; + CURRENT_PROJECT_VERSION = 2.0.2; DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; - INFOPLIST_FILE = "Target Support Files/Pods/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Pods/Pods.modulemap"; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_NAME = Pods; + PRODUCT_NAME = Alamofire; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1716,9 +1882,9 @@ }; name = Debug; }; - 98C345F76354A71B9BC61B8E9AE70139 /* Debug */ = { + 905E5CBD0589B30906EDA0A30A363233 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 2D4F759353A8957B54E7F1FA28611B2B /* Bolts-Private.xcconfig */; + baseConfigurationReference = 11A7BE4205C5FABE76951CAC019CAD5D /* Bolts-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CURRENT_PROJECT_VERSION = 1.3.0; @@ -1733,7 +1899,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/Bolts/Bolts.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; + MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = Bolts; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -1741,7 +1907,7 @@ VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */ = { isa = XCBuildConfiguration; @@ -1811,26 +1977,52 @@ }; name = Debug; }; - D505CF6FDC190F25ED9FF024858BD3BD /* Debug */ = { + D28BF0FF9922512DF26B2E0F7532E27F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 51909C7F1AD1EBABD6272372A4140053 /* ParseUI-Private.xcconfig */; + baseConfigurationReference = 5F5388130D37843645ADF5DCA408FB72 /* Alamofire-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 1.1.4; + CURRENT_PROJECT_VERSION = 2.0.2; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Alamofire; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + D921497B0F54B1C9C830FEE785F31042 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 11A7BE4205C5FABE76951CAC019CAD5D /* Bolts-Private.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 1.3.0; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/ParseUI/ParseUI-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/ParseUI/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Bolts/Bolts-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Bolts/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/ParseUI/ParseUI.modulemap"; + MODULEMAP_FILE = "Target Support Files/Bolts/Bolts.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = ParseUI; + PRODUCT_NAME = Bolts; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1839,33 +2031,33 @@ }; name = Debug; }; - F3C47108EECAE250662460CAADDC59E8 /* Debug */ = { + DFA6067A56D50A087FC24E802C5773BF /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7B6643B0DA0A5E02F0020A3FF33B7346 /* Alamofire-Private.xcconfig */; + baseConfigurationReference = 16750CC5D92DB8C6C526741A011C5B91 /* Parse-Private.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 2.0.2; + CURRENT_PROJECT_VERSION = 1.7.5; DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_PREFIX_HEADER = "Target Support Files/Alamofire/Alamofire-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Alamofire/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/Parse/Parse-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Parse/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/Alamofire/Alamofire.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = Alamofire; + MODULEMAP_FILE = "Target Support Files/Parse/Parse.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Parse; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; - name = Debug; + name = Release; }; F591195DC20568B6196468835769ED71 /* Release */ = { isa = XCBuildConfiguration; @@ -1941,20 +2133,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + 24EFFB441B0D023E76F682EB24A0A43A /* Build configuration list for PBXNativeTarget "Bolts" */ = { isa = XCConfigurationList; buildConfigurations = ( - A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */, - FB45FFD90572718D82AB9092B750F0CA /* Release */, + D921497B0F54B1C9C830FEE785F31042 /* Debug */, + 905E5CBD0589B30906EDA0A30A363233 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2EF5408FA251FFFAAD3C4AF20A1466F6 /* Build configuration list for PBXNativeTarget "ParseUI" */ = { + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - D505CF6FDC190F25ED9FF024858BD3BD /* Debug */, - 33EF4ACDC24D9329102B24509E1C4A9B /* Release */, + A70CDAD61F90AC503C7D04CC22DA2923 /* Debug */, + FB45FFD90572718D82AB9092B750F0CA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; @@ -1968,38 +2160,47 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 97647631F302732AB7A25809055D32A4 /* Build configuration list for PBXNativeTarget "Alamofire" */ = { + AC1C1C3D1D3FF1284B83FBE577CD3AC6 /* Build configuration list for PBXNativeTarget "ParseUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 30FA33E6A87F43B70ED4E778F8CA1AB2 /* Debug */, + 8A5B046F98EFAC2E64478CA5826ACA3B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + AD1D238F5E67D012535A251B52B51E90 /* Build configuration list for PBXNativeTarget "SVProgressHUD" */ = { isa = XCConfigurationList; buildConfigurations = ( - F3C47108EECAE250662460CAADDC59E8 /* Debug */, - 40EAA00556D4B56F128CF16FC6EF789B /* Release */, + 0CA4A2C6E8A9E00609901E5D8C71F228 /* Debug */, + 0E14E9E4CC86E40DA6B1CF9BA126F973 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D0A81189E3090AF797E260E0AA5A7909 /* Build configuration list for PBXNativeTarget "Parse" */ = { + B14337B988305938196ECF7464D50BA9 /* Build configuration list for PBXNativeTarget "Parse" */ = { isa = XCConfigurationList; buildConfigurations = ( - 8243CBDF643AC293C6871D41A2A86E47 /* Debug */, - 55F3571E87E13C402FB6BCDE8E4D5226 /* Release */, + 4FD3043631C358093CA58B817E8364B2 /* Debug */, + DFA6067A56D50A087FC24E802C5773BF /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E1480EE833DE42CEDCCBC5D64E524AC0 /* Build configuration list for PBXNativeTarget "Bolts" */ = { + CF4FB936E6BE741310FD60CA946BB279 /* Build configuration list for PBXNativeTarget "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 98C345F76354A71B9BC61B8E9AE70139 /* Debug */, - 85DC353349C3AB1A36CE2AA303686C05 /* Release */, + 4EFB08339B63A8448D3EF5ADE434E4FD /* Debug */, + 23EEB5E7DFDB24635D6726D91275EED6 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E6FAFC61EBF1AE7D0DC84EE8D3FFBE06 /* Build configuration list for PBXNativeTarget "Pods" */ = { + F8B4D4B5951956E02146591824213E9B /* Build configuration list for PBXNativeTarget "Alamofire" */ = { isa = XCConfigurationList; buildConfigurations = ( - 88D861D3CCC386377A953D922E7CCA3D /* Debug */, - 01D9A98050BB28D4C1149C3EC67CC053 /* Release */, + 901CFF997DEDD82C69474AE460DEAE63 /* Debug */, + D28BF0FF9922512DF26B2E0F7532E27F /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Alamofire.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Alamofire.xcscheme index 544694c..b858afb 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Alamofire.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Alamofire.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Bolts.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Bolts.xcscheme index 0f2797c..3bb0ee2 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Bolts.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Bolts.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse.xcscheme index d8e23a2..91f0cb1 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/ParseUI.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/ParseUI.xcscheme index 1ccc513..36f1055 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/ParseUI.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/ParseUI.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Pods.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Pods.xcscheme index d6d06d7..b34a5e4 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Pods.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Pods.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse 2.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SVProgressHUD.xcscheme similarity index 66% rename from Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse 2.xcscheme rename to Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SVProgressHUD.xcscheme index c529ea3..40f79d0 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Parse 2.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SVProgressHUD.xcscheme @@ -14,61 +14,43 @@ buildForAnalyzing = "YES"> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> + + - - - - - - - - diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SnapKit.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SnapKit.xcscheme index 732f499..3cbc537 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SnapKit.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/SnapKit.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Spring.xcscheme b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Spring.xcscheme index 8566da0..a11df11 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Spring.xcscheme +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/Spring.xcscheme @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> diff --git a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/xcschememanagement.plist b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/xcschememanagement.plist index f991f88..ecfd7fe 100644 --- a/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Pods/Pods.xcodeproj/xcuserdata/codeglider.xcuserdatad/xcschemes/xcschememanagement.plist @@ -8,65 +8,51 @@ isShown - orderHint - 1 Bolts.xcscheme isShown - orderHint - 2 - - Parse 2.xcscheme - - orderHint - 8 Parse.xcscheme isShown - orderHint - 3 ParseUI.xcscheme isShown - orderHint - 4 Pods.xcscheme isShown - orderHint - 5 + + SVProgressHUD.xcscheme + + isShown + SnapKit.xcscheme isShown - orderHint - 6 Spring.xcscheme isShown - orderHint - 7 SuppressBuildableAutocreation - 1091688AA925600943826D4E240A451A + 235C5CA5D82C2DD787A19D63A785CABA primary - 10FC5CE2B571075A620708ACED6A2623 + 3CD6A168CBF3B631BB2C2F0BE2952A1C primary @@ -81,17 +67,22 @@ primary - 77545C60DD00C9F792CEEC9995290A1C + 61A52E32A13FD38217F820D4B11E57B1 + + primary + + + 85C0FAEA03C3F706077F691B3555AD88 primary - BB49AA45405B3C29158A457C15B32CB8 + 8D88C1D9673E5D48828AE5F0FB9A083C primary - C5441A043671A407F5F8CDE2FC6859EF + D8A0CB5D0264B3807A246C5F16C45FE9 primary diff --git a/Pods/SVProgressHUD/LICENSE.txt b/Pods/SVProgressHUD/LICENSE.txt new file mode 100644 index 0000000..5bcd8b4 --- /dev/null +++ b/Pods/SVProgressHUD/LICENSE.txt @@ -0,0 +1,26 @@ +Copyright (c) 2011-2014 Sam Vermette + +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. + +A different license may apply to other resources included in this package, +including Freepik Icons. Please consult their +respective headers for the terms of their individual licenses. \ No newline at end of file diff --git a/Pods/SVProgressHUD/README.md b/Pods/SVProgressHUD/README.md new file mode 100644 index 0000000..0b1ea66 --- /dev/null +++ b/Pods/SVProgressHUD/README.md @@ -0,0 +1,162 @@ +# SVProgressHUD + +![Pod Version](https://img.shields.io/cocoapods/v/SVProgressHUD.svg?style=flat) +![Pod License](https://img.shields.io/cocoapods/l/SVProgressHUD.svg?style=flat) +![Pod Platform](https://img.shields.io/cocoapods/p/SVProgressHUD.svg?style=flat) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) + + +`SVProgressHUD` is a clean and easy-to-use HUD meant to display the progress of an ongoing task. + +![SVProgressHUD](http://f.cl.ly/items/2G1F1Z0M0k0h2U3V1p39/SVProgressHUD.gif) + +## Installation + +### From CocoaPods + +[CocoaPods](http://cocoapods.org) is a dependency manager for Objective-C, which automates and simplifies the process of using 3rd-party libraries like `SVProgressHUD` in your projects. Simply add the following line to your [Podfile](http://guides.cocoapods.org/using/using-cocoapods.html): + +```ruby +pod 'SVProgressHUD' +``` + +If you want to use the latest features of `SVProgressHUD` add `:head`: + +```ruby +pod 'SVProgressHUD', :head +``` + +This pulls from the `master` branch directly. We are usually careful about what we push there and this is the version we use ourselves in all of our projects. + +### Carthage + +You can install `SVProgressHUD` with [Carthage](https://github.com/Carthage/Carthage). + +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/TransitApp/SVProgressHUD) + +### Manually + +* Drag the `SVProgressHUD/SVProgressHUD` folder into your project. +* Take care that `SVProgressHUD.bundle` is added to `Targets->Build Phases->Copy Bundle Resources`. +* Add the **QuartzCore** framework to your project. + +## Usage + +(see sample Xcode project in `/Demo`) + +`SVProgressHUD` is created as a singleton (i.e. it doesn't need to be explicitly allocated and instantiated; you directly call `[SVProgressHUD method]`). + +**Use `SVProgressHUD` wisely! Only use it if you absolutely need to perform a task before taking the user forward. Bad use case examples: pull to refresh, infinite scrolling, sending message.** + +Using `SVProgressHUD` in your app will usually look as simple as this (using Grand Central Dispatch): + +```objective-c +[SVProgressHUD show]; +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + // time-consuming task + dispatch_async(dispatch_get_main_queue(), ^{ + [SVProgressHUD dismiss]; + }); +}); +``` + +### Showing the HUD + +You can show the status of indeterminate tasks using one of the following: + +```objective-c ++ (void)show; ++ (void)showWithStatus:(NSString*)string; +``` + +If you'd like the HUD to reflect the progress of a task, use one of these: + +```objective-c ++ (void)showProgress:(CGFloat)progress; ++ (void)showProgress:(CGFloat)progress status:(NSString*)status; +``` + +### Dismissing the HUD + +The HUD can be dismissed using: + +```objective-c ++ (void)dismiss; ++ (void)dismissWithDelay:(NSTimeInterval)delay; +``` + +If you'd like to stack HUDs, you can balance out every show call using: + +```objective-c ++ (void)popActivity; +``` + +The HUD will get dismissed once the `popActivity` calls will match the number of show calls. + +Or show a confirmation glyph before before getting dismissed a little bit later. The display time depends on the length of the given string (between 0.5 and 5 seconds). + +```objective-c ++ (void)showInfoWithStatus:(NSString *)string; ++ (void)showSuccessWithStatus:(NSString*)string; ++ (void)showErrorWithStatus:(NSString *)string; ++ (void)showImage:(UIImage*)image status:(NSString*)string; +``` + +## Customization + +`SVProgressHUD` can be customized via the following methods: + +```objective-c ++ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight ++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone ++ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat ++ (void)setRingThickness:(CGFloat)width; // default is 2 pt ++ (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt ++ (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] ++ (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom ++ (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom ++ (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik ++ (void)setSuccessImage:(UIImage*)image; // default is bundled success image from Freepik ++ (void)setErrorImage:(UIImage*)image; // default is bundled error image from Freepik ++ (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set +``` + +Additionally `SVProgressHUD` supports the `UIAppearance` protocol. + +### Hint + +As standard `SVProgressHUD` offers two preconfigured styles: + +* `SVProgressHUDStyleLight`: White background with black spinner and text +* `SVProgressHUDStyleDark`: Black background with white spinner and text + +If you want to use custom colors with `setForegroundColor` and `setBackgroundColor:` don't forget to set `SVProgressHUDStyleCustom` via `setDefaultStyle:`. + +## Notifications + +`SVProgressHUD` posts four notifications via `NSNotificationCenter` in response to being shown/dismissed: +* `SVProgressHUDWillAppearNotification` when the show animation starts +* `SVProgressHUDDidAppearNotification` when the show animation completes +* `SVProgressHUDWillDisappearNotification` when the dismiss animation starts +* `SVProgressHUDDidDisappearNotification` when the dismiss animation completes + +Each notification passes a `userInfo` dictionary holding the HUD's status string (if any), retrievable via `SVProgressHUDStatusUserInfoKey`. + +`SVProgressHUD` also posts `SVProgressHUDDidReceiveTouchEventNotification` when users touch on the overall screen or `SVProgressHUDDidTouchDownInsideNotification` when a user touches on the HUD directly. For this notifications `userInfo` is not passed but the object parameter contains the `UIEvent` that related to the touch. + +## App Extensions + +When using `SVProgressHUD` in an App Extension, `#define SV_APP_EXTENSIONS` to avoid using unavailable APIs. Additionally call `setViewForExtension:` from your extensions view controller with `self.view`. + +## Contributing to this project + +If you have feature requests or bug reports, feel free to help out by sending pull requests or by [creating new issues](https://github.com/TransitApp/SVProgressHUD/issues/new). Please take a moment to +review the guidelines written by [Nicolas Gallagher](https://github.com/necolas/): + +* [Bug reports](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#bugs) +* [Feature requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#features) +* [Pull requests](https://github.com/necolas/issue-guidelines/blob/master/CONTRIBUTING.md#pull-requests) + +## Credits + +`SVProgressHUD` is brought to you by [Sam Vermette](http://samvermette.com) and [contributors to the project](https://github.com/TransitApp/SVProgressHUD/contributors). If you're using `SVProgressHUD` in your project, attribution would be very appreciated. The success, error and info icons are made by [Freepik](http://www.freepik.com) from [Flaticon](http://www.flaticon.com) and are licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/). diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h b/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h new file mode 100644 index 0000000..e6be802 --- /dev/null +++ b/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.h @@ -0,0 +1,17 @@ +// +// SVIndefiniteAnimatedView.h +// SVProgressHUD, https://github.com/TransitApp/SVProgressHUD +// +// Copyright (c) 2014 Guillaume Campagna. All rights reserved. +// + +#import + +@interface SVIndefiniteAnimatedView : UIView + +@property (nonatomic, assign) CGFloat strokeThickness; +@property (nonatomic, assign) CGFloat radius; +@property (nonatomic, strong) UIColor *strokeColor; + +@end + diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m b/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m new file mode 100644 index 0000000..a1a8782 --- /dev/null +++ b/Pods/SVProgressHUD/SVProgressHUD/SVIndefiniteAnimatedView.m @@ -0,0 +1,140 @@ +// +// SVIndefiniteAnimatedView.m +// SVProgressHUD, https://github.com/TransitApp/SVProgressHUD +// +// Copyright (c) 2014 Guillaume Campagna. All rights reserved. +// + +#import "SVIndefiniteAnimatedView.h" + +#pragma mark SVIndefiniteAnimatedView + +@interface SVIndefiniteAnimatedView () + +@property (nonatomic, strong) CAShapeLayer *indefiniteAnimatedLayer; + +@end + +@implementation SVIndefiniteAnimatedView + +- (void)willMoveToSuperview:(UIView *)newSuperview { + if (newSuperview) { + [self layoutAnimatedLayer]; + } else { + [_indefiniteAnimatedLayer removeFromSuperlayer]; + _indefiniteAnimatedLayer = nil; + } +} + +- (void)layoutAnimatedLayer { + CALayer *layer = self.indefiniteAnimatedLayer; + [self.layer addSublayer:layer]; + layer.position = CGPointMake(CGRectGetWidth(self.bounds) - CGRectGetWidth(layer.bounds) / 2, CGRectGetHeight(self.bounds) - CGRectGetHeight(layer.bounds) / 2); +} + +- (CAShapeLayer*)indefiniteAnimatedLayer { + if(!_indefiniteAnimatedLayer) { + CGPoint arcCenter = CGPointMake(self.radius+self.strokeThickness/2+5, self.radius+self.strokeThickness/2+5); + CGRect rect = CGRectMake(0.0f, 0.0f, arcCenter.x*2, arcCenter.y*2); + + UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:arcCenter + radius:self.radius + startAngle:(CGFloat) (M_PI*3/2) + endAngle:(CGFloat) (M_PI/2+M_PI*5) + clockwise:YES]; + + _indefiniteAnimatedLayer = [CAShapeLayer layer]; + _indefiniteAnimatedLayer.contentsScale = [[UIScreen mainScreen] scale]; + _indefiniteAnimatedLayer.frame = rect; + _indefiniteAnimatedLayer.fillColor = [UIColor clearColor].CGColor; + _indefiniteAnimatedLayer.strokeColor = self.strokeColor.CGColor; + _indefiniteAnimatedLayer.lineWidth = self.strokeThickness; + _indefiniteAnimatedLayer.lineCap = kCALineCapRound; + _indefiniteAnimatedLayer.lineJoin = kCALineJoinBevel; + _indefiniteAnimatedLayer.path = smoothedPath.CGPath; + + CALayer *maskLayer = [CALayer layer]; + + NSBundle *bundle = [NSBundle bundleForClass:self.class]; + NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; + NSBundle *imageBundle = [NSBundle bundleWithURL:url]; + NSString *path = [imageBundle pathForResource:@"angle-mask" ofType:@"png"]; + + maskLayer.contents = (__bridge id)[[UIImage imageWithContentsOfFile:path] CGImage]; + maskLayer.frame = _indefiniteAnimatedLayer.bounds; + _indefiniteAnimatedLayer.mask = maskLayer; + + NSTimeInterval animationDuration = 1; + CAMediaTimingFunction *linearCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]; + + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; + animation.fromValue = (id) 0; + animation.toValue = @(M_PI*2); + animation.duration = animationDuration; + animation.timingFunction = linearCurve; + animation.removedOnCompletion = NO; + animation.repeatCount = INFINITY; + animation.fillMode = kCAFillModeForwards; + animation.autoreverses = NO; + [_indefiniteAnimatedLayer.mask addAnimation:animation forKey:@"rotate"]; + + CAAnimationGroup *animationGroup = [CAAnimationGroup animation]; + animationGroup.duration = animationDuration; + animationGroup.repeatCount = INFINITY; + animationGroup.removedOnCompletion = NO; + animationGroup.timingFunction = linearCurve; + + CABasicAnimation *strokeStartAnimation = [CABasicAnimation animationWithKeyPath:@"strokeStart"]; + strokeStartAnimation.fromValue = @0.015; + strokeStartAnimation.toValue = @0.515; + + CABasicAnimation *strokeEndAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; + strokeEndAnimation.fromValue = @0.485; + strokeEndAnimation.toValue = @0.985; + + animationGroup.animations = @[strokeStartAnimation, strokeEndAnimation]; + [_indefiniteAnimatedLayer addAnimation:animationGroup forKey:@"progress"]; + + } + return _indefiniteAnimatedLayer; +} + +- (void)setFrame:(CGRect)frame { + if(!CGRectEqualToRect(frame, super.frame)){ + [super setFrame:frame]; + + if (self.superview) { + [self layoutAnimatedLayer]; + } + } + +} + +- (void)setRadius:(CGFloat)radius { + if(radius != _radius){ + _radius = radius; + + [_indefiniteAnimatedLayer removeFromSuperlayer]; + _indefiniteAnimatedLayer = nil; + + if (self.superview) { + [self layoutAnimatedLayer]; + } + } +} + +- (void)setStrokeColor:(UIColor *)strokeColor { + _strokeColor = strokeColor; + _indefiniteAnimatedLayer.strokeColor = strokeColor.CGColor; +} + +- (void)setStrokeThickness:(CGFloat)strokeThickness { + _strokeThickness = strokeThickness; + _indefiniteAnimatedLayer.lineWidth = _strokeThickness; +} + +- (CGSize)sizeThatFits:(CGSize)size { + return CGSizeMake((self.radius+self.strokeThickness/2+5)*2, (self.radius+self.strokeThickness/2+5)*2); +} + +@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png new file mode 100644 index 0000000..84d1f7c Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png new file mode 100644 index 0000000..4aa036e Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@2x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png new file mode 100644 index 0000000..2a4cd17 Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/angle-mask@3x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png new file mode 100644 index 0000000..3a0c20f Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png new file mode 100644 index 0000000..b8bc16c Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@2x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png new file mode 100644 index 0000000..4cf4c4f Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/error@3x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png new file mode 100644 index 0000000..5bb8192 Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png new file mode 100644 index 0000000..49a57d6 Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@2x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png new file mode 100644 index 0000000..7f6fb4e Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/info@3x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png new file mode 100644 index 0000000..481caf8 Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png new file mode 100644 index 0000000..c33f9f3 Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@2x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png new file mode 100644 index 0000000..c6063d0 Binary files /dev/null and b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.bundle/success@3x.png differ diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h new file mode 100644 index 0000000..659b914 --- /dev/null +++ b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.h @@ -0,0 +1,114 @@ +// +// SVProgressHUD.h +// SVProgressHUD, https://github.com/TransitApp/SVProgressHUD +// +// Copyright (c) 2011-2014 Sam Vermette and contributors. All rights reserved. +// + +#import +#import + +#if __IPHONE_OS_VERSION_MAX_ALLOWED < 70000 + +#define UI_APPEARANCE_SELECTOR + +#endif + +extern NSString * const SVProgressHUDDidReceiveTouchEventNotification; +extern NSString * const SVProgressHUDDidTouchDownInsideNotification; +extern NSString * const SVProgressHUDWillDisappearNotification; +extern NSString * const SVProgressHUDDidDisappearNotification; +extern NSString * const SVProgressHUDWillAppearNotification; +extern NSString * const SVProgressHUDDidAppearNotification; + +extern NSString * const SVProgressHUDStatusUserInfoKey; + +typedef NS_ENUM(NSInteger, SVProgressHUDStyle) { + SVProgressHUDStyleLight, // default style, white HUD with black text, HUD background will be blurred on iOS 8 and above + SVProgressHUDStyleDark, // black HUD and white text, HUD background will be blurred on iOS 8 and above + SVProgressHUDStyleCustom // uses the fore- and background color properties +}; + +typedef NS_ENUM(NSUInteger, SVProgressHUDMaskType) { + SVProgressHUDMaskTypeNone = 1, // default mask type, allow user interactions while HUD is displayed + SVProgressHUDMaskTypeClear, // don't allow user interactions + SVProgressHUDMaskTypeBlack, // don't allow user interactions and dim the UI in the back of the HUD, as on iOS 7 and above + SVProgressHUDMaskTypeGradient // don't allow user interactions and dim the UI with a a-la UIAlertView background gradient, as on iOS 6 +}; + +typedef NS_ENUM(NSUInteger, SVProgressHUDAnimationType) { + SVProgressHUDAnimationTypeFlat, // default animation type, custom flat animation (indefinite animated ring) + SVProgressHUDAnimationTypeNative // iOS native UIActivityIndicatorView +}; + +@interface SVProgressHUD : UIView + +#pragma mark - Customization + +@property (assign, nonatomic) SVProgressHUDStyle defaultStyle UI_APPEARANCE_SELECTOR; // default is SVProgressHUDStyleLight +@property (assign, nonatomic) SVProgressHUDMaskType defaultMaskType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDMaskTypeNone +@property (assign, nonatomic) SVProgressHUDAnimationType defaultAnimationType UI_APPEARANCE_SELECTOR; // default is SVProgressHUDAnimationTypeFlat +@property (assign, nonatomic) CGFloat ringThickness UI_APPEARANCE_SELECTOR; // default is 2 pt +@property (assign, nonatomic) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; // default is 14 pt +@property (assign, nonatomic) UIOffset offsetFromCenter UI_APPEARANCE_SELECTOR; // default is 0, 0 + +@property (strong, nonatomic) UIFont *font UI_APPEARANCE_SELECTOR; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] +@property (strong, nonatomic) UIColor *backgroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor whiteColor] +@property (strong, nonatomic) UIColor *foregroundColor UI_APPEARANCE_SELECTOR; // default is [UIColor blackColor] +@property (strong, nonatomic) UIImage *infoImage UI_APPEARANCE_SELECTOR; // default is the bundled info image provided by Freepik +@property (strong, nonatomic) UIImage *successImage UI_APPEARANCE_SELECTOR; // default is the bundled success image provided by Freepik +@property (strong, nonatomic) UIImage *errorImage UI_APPEARANCE_SELECTOR; // default is the bundled error image provided by Freepik +@property (strong, nonatomic) UIView *viewForExtension UI_APPEARANCE_SELECTOR; // default is nil, only used if #define SV_APP_EXTENSIONS is set + ++ (void)setDefaultStyle:(SVProgressHUDStyle)style; // default is SVProgressHUDStyleLight ++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType; // default is SVProgressHUDMaskTypeNone ++ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type; // default is SVProgressHUDAnimationTypeFlat ++ (void)setRingThickness:(CGFloat)width; // default is 2 pt ++ (void)setCornerRadius:(CGFloat)cornerRadius; // default is 14 pt ++ (void)setFont:(UIFont*)font; // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline] ++ (void)setForegroundColor:(UIColor*)color; // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom ++ (void)setBackgroundColor:(UIColor*)color; // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom ++ (void)setInfoImage:(UIImage*)image; // default is the bundled info image provided by Freepik ++ (void)setSuccessImage:(UIImage*)image; // default is the bundled success image provided by Freepik ++ (void)setErrorImage:(UIImage*)image; // default is the bundled error image provided by Freepik ++ (void)setViewForExtension:(UIView*)view; // default is nil, only used if #define SV_APP_EXTENSIONS is set + + +#pragma mark - Show Methods + ++ (void)show; ++ (void)showWithMaskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use show and setDefaultMaskType: instead."))); ++ (void)showWithStatus:(NSString*)status; ++ (void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showWithStatus: and setDefaultMaskType: instead."))); + ++ (void)showProgress:(float)progress; ++ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress: and setDefaultMaskType: instead."))); ++ (void)showProgress:(float)progress status:(NSString*)status; ++ (void)showProgress:(float)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showProgress: and setDefaultMaskType: instead."))); + ++ (void)setStatus:(NSString*)status; // change the HUD loading status while it's showing + +// stops the activity indicator, shows a glyph + status, and dismisses the HUD a little bit later ++ (void)showInfoWithStatus:(NSString*)status; ++ (void)showInfoWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showInfoWithStatus: and setDefaultMaskType: instead."))); ++ (void)showSuccessWithStatus:(NSString*)status; ++ (void)showSuccessWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showSuccessWithStatus: and setDefaultMaskType: instead."))); ++ (void)showErrorWithStatus:(NSString*)status; ++ (void)showErrorWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showErrorWithStatus: and setDefaultMaskType: instead."))); + +// shows a image + status, use 28x28 white PNGs ++ (void)showImage:(UIImage*)image status:(NSString*)status; ++ (void)showImage:(UIImage*)image status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType __attribute__((deprecated("Use showImage: and setDefaultMaskType: instead."))); + ++ (void)setOffsetFromCenter:(UIOffset)offset; ++ (void)resetOffsetFromCenter; + ++ (void)popActivity; // decrease activity count, if activity count == 0 the HUD is dismissed ++ (void)dismiss; ++ (void)dismissWithDelay:(NSTimeInterval)delay; // delayes the dismissal + ++ (BOOL)isVisible; + + +@end + diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m new file mode 100644 index 0000000..af6bb01 --- /dev/null +++ b/Pods/SVProgressHUD/SVProgressHUD/SVProgressHUD.m @@ -0,0 +1,1230 @@ +// +// SVProgressHUD.h +// SVProgressHUD, https://github.com/TransitApp/SVProgressHUD +// +// Copyright (c) 2011-2014 Sam Vermette and contributors. All rights reserved. +// + +#if !__has_feature(objc_arc) +#error SVProgressHUD is ARC only. Either turn on ARC for the project or use -fobjc-arc flag +#endif + +#import "SVProgressHUD.h" +#import "SVIndefiniteAnimatedView.h" +#import "SVRadialGradientLayer.h" + +NSString * const SVProgressHUDDidReceiveTouchEventNotification = @"SVProgressHUDDidReceiveTouchEventNotification"; +NSString * const SVProgressHUDDidTouchDownInsideNotification = @"SVProgressHUDDidTouchDownInsideNotification"; +NSString * const SVProgressHUDWillDisappearNotification = @"SVProgressHUDWillDisappearNotification"; +NSString * const SVProgressHUDDidDisappearNotification = @"SVProgressHUDDidDisappearNotification"; +NSString * const SVProgressHUDWillAppearNotification = @"SVProgressHUDWillAppearNotification"; +NSString * const SVProgressHUDDidAppearNotification = @"SVProgressHUDDidAppearNotification"; + +NSString * const SVProgressHUDStatusUserInfoKey = @"SVProgressHUDStatusUserInfoKey"; + +static const CGFloat SVProgressHUDRingRadius = 18; +static const CGFloat SVProgressHUDRingNoTextRadius = 24; +static const CGFloat SVProgressHUDParallaxDepthPoints = 10; +static const CGFloat SVProgressHUDUndefinedProgress = -1; + +@interface SVProgressHUD () + +@property (nonatomic, strong, readonly) NSTimer *fadeOutTimer; +@property (nonatomic, readonly, getter = isClear) BOOL clear; + +@property (nonatomic, strong) UIControl *overlayView; +@property (nonatomic, strong) UIView *hudView; + +@property (nonatomic, strong) UILabel *stringLabel; +@property (nonatomic, strong) UIImageView *imageView; +@property (nonatomic, strong) UIView *indefiniteAnimatedView; +@property (nonatomic, strong) CALayer *backgroundLayer; + +@property (nonatomic, readwrite) CGFloat progress; +@property (nonatomic, readwrite) NSUInteger activityCount; +@property (nonatomic, strong) CAShapeLayer *backgroundRingLayer; +@property (nonatomic, strong) CAShapeLayer *ringLayer; + +@property (nonatomic, readonly) CGFloat visibleKeyboardHeight; + +- (void)updateHUDFrame; +- (void)updateMask; +- (void)updateBlurBounds; +- (void)updateMotionEffectForOrientation:(UIInterfaceOrientation)orientation; + +- (void)setStatus:(NSString*)string; +- (void)setFadeOutTimer:(NSTimer*)newTimer; + +- (void)registerNotifications; +- (NSDictionary*)notificationUserInfo; + +- (void)positionHUD:(NSNotification*)notification; +- (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle; + +- (void)overlayViewDidReceiveTouchEvent:(id)sender forEvent:(UIEvent*)event; + +- (void)showProgress:(float)progress status:(NSString*)string; +- (void)showImage:(UIImage*)image status:(NSString*)status duration:(NSTimeInterval)duration; + +- (void)dismissWithDelay:(NSTimeInterval)delay; +- (void)dismiss; + +- (UIActivityIndicatorView *)createActivityIndicatorView; +- (SVIndefiniteAnimatedView *)createIndefiniteAnimatedView; +- (UIView *)indefiniteAnimatedView; +- (CAShapeLayer*)ringLayer; +- (CAShapeLayer*)backgroundRingLayer; +- (void)cancelRingLayerAnimation; +- (CAShapeLayer*)createRingLayerWithCenter:(CGPoint)center radius:(CGFloat)radius; + +- (NSTimeInterval)displayDurationForString:(NSString*)string; +- (UIColor*)foregroundColorForStyle; +- (UIColor*)backgroundColorForStyle; +- (UIImage*)image:(UIImage*)image withTintColor:(UIColor*)color; + +@end + + +@implementation SVProgressHUD { + BOOL _isInitializing; +} + ++ (SVProgressHUD*)sharedView{ + static dispatch_once_t once; + + static SVProgressHUD *sharedView; +#if !defined(SV_APP_EXTENSIONS) + dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[UIApplication sharedApplication].keyWindow.bounds]; }); +#else + dispatch_once(&once, ^{ sharedView = [[self alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; }); +#endif + return sharedView; +} + + +#pragma mark - Setters + ++ (void)setStatus:(NSString*)status{ + [[self sharedView] setStatus:status]; +} + ++ (void)setDefaultStyle:(SVProgressHUDStyle)style{ + [self sharedView].defaultStyle = style; +} + ++ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType{ + [self sharedView].defaultMaskType = maskType; +} + ++ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type { + [self sharedView].defaultAnimationType = type; + // Reset indefiniteAnimatedView so it gets recreated with the new style + [self sharedView].indefiniteAnimatedView = nil; +} + ++ (void)setRingThickness:(CGFloat)width{ + [self sharedView].ringThickness = width; +} + ++ (void)setCornerRadius:(CGFloat)cornerRadius{ + [self sharedView].cornerRadius = cornerRadius; +} + ++ (void)setFont:(UIFont*)font{ + [self sharedView].font = font; +} + ++ (void)setForegroundColor:(UIColor*)color{ + [self sharedView].foregroundColor = color; +} + ++ (void)setBackgroundColor:(UIColor*)color{ + [self sharedView].backgroundColor = color; +} + ++ (void)setInfoImage:(UIImage*)image{ + [self sharedView].infoImage = image; +} + ++ (void)setSuccessImage:(UIImage *)image { + [self sharedView].successImage = image; +} + ++ (void)setErrorImage:(UIImage *)image { + [self sharedView].errorImage = image; +} + ++ (void)setViewForExtension:(UIView *)view{ + [self sharedView].viewForExtension = view; +} + +#pragma mark - Show Methods + ++ (void)show{ + [self showWithStatus:nil]; +} + ++ (void)showWithMaskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self show]; + [self setDefaultMaskType:existingMaskType]; +} + ++ (void)showWithStatus:(NSString*)status{ + [self sharedView]; + [self showProgress:SVProgressHUDUndefinedProgress status:status]; +} + ++ (void)showWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showWithStatus:status]; + [self setDefaultMaskType:existingMaskType]; +} + ++ (void)showProgress:(float)progress{ + [self showProgress:progress status:nil]; +} + ++ (void)showProgress:(float)progress maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showProgress:progress]; + [self setDefaultMaskType:existingMaskType]; +} + ++ (void)showProgress:(float)progress status:(NSString*)status{ + [[self sharedView] showProgress:progress status:status]; +} + ++ (void)showProgress:(float)progress status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showProgress:progress status:status]; + [self setDefaultMaskType:existingMaskType]; +} + +#pragma mark - Show, then automatically dismiss methods + ++ (void)showInfoWithStatus:(NSString*)status{ + [self showImage:[self sharedView].infoImage status:status]; +} + ++ (void)showInfoWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showInfoWithStatus:status]; + [self setDefaultMaskType:existingMaskType]; +} + ++ (void)showSuccessWithStatus:(NSString*)status{ + [self showImage:[self sharedView].successImage status:status]; +} + ++ (void)showSuccessWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showSuccessWithStatus:status]; + [self setDefaultMaskType:existingMaskType]; +} + ++ (void)showErrorWithStatus:(NSString*)status{ + [self showImage:[self sharedView].errorImage status:status]; +} + ++ (void)showErrorWithStatus:(NSString*)status maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showErrorWithStatus:status]; + [self setDefaultMaskType:existingMaskType]; +} + ++ (void)showImage:(UIImage*)image status:(NSString*)status{ + NSTimeInterval displayInterval = [[self sharedView] displayDurationForString:status]; + [[self sharedView] showImage:image status:status duration:displayInterval]; +} + ++ (void)showImage:(UIImage*)image status:(NSString*)status maskType:(SVProgressHUDMaskType)maskType{ + SVProgressHUDMaskType existingMaskType = [self sharedView].defaultMaskType; + [self setDefaultMaskType:maskType]; + [self showImage:image status:status]; + [self setDefaultMaskType:existingMaskType]; +} + + +#pragma mark - Dismiss Methods + ++ (void)popActivity{ + if([self sharedView].activityCount > 0){ + [self sharedView].activityCount--; + } + if([self sharedView].activityCount == 0){ + [[self sharedView] dismiss]; + } +} + ++ (void)dismissWithDelay:(NSTimeInterval)delay{ + if([self isVisible]){ + [[self sharedView] dismissWithDelay:delay]; + } +} + ++ (void)dismiss{ + [self dismissWithDelay:0]; +} + + +#pragma mark - Offset + ++ (void)setOffsetFromCenter:(UIOffset)offset{ + [self sharedView].offsetFromCenter = offset; +} + ++ (void)resetOffsetFromCenter{ + [self setOffsetFromCenter:UIOffsetZero]; +} + + +#pragma mark - Instance Methods + +- (instancetype)initWithFrame:(CGRect)frame{ + if((self = [super initWithFrame:frame])){ + + _isInitializing = YES; + + self.userInteractionEnabled = NO; + _backgroundColor = [UIColor clearColor]; + _foregroundColor = [UIColor blackColor]; + self.alpha = 0.0f; + self.activityCount = 0; + + _defaultMaskType = SVProgressHUDMaskTypeNone; + _defaultStyle = SVProgressHUDStyleLight; + _defaultAnimationType = SVProgressHUDAnimationTypeFlat; + + // add accessibility support + self.accessibilityIdentifier = @"SVProgressHUD"; + self.accessibilityLabel = @"SVProgressHUD"; + self.isAccessibilityElement = YES; + + if ([UIFont respondsToSelector:@selector(preferredFontForTextStyle:)]) { + _font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + } else { + _font = [UIFont systemFontOfSize:14.0f]; + } + + NSBundle *bundle = [NSBundle bundleForClass:[self class]]; + NSURL *url = [bundle URLForResource:@"SVProgressHUD" withExtension:@"bundle"]; + NSBundle *imageBundle = [NSBundle bundleWithURL:url]; + + UIImage* infoImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"info" ofType:@"png"]]; + UIImage* successImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"success" ofType:@"png"]]; + UIImage* errorImage = [UIImage imageWithContentsOfFile:[imageBundle pathForResource:@"error" ofType:@"png"]]; + + if ([[UIImage class] instancesRespondToSelector:@selector(imageWithRenderingMode:)]) { + _infoImage = [infoImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + _successImage = [successImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + _errorImage = [errorImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } else { + _infoImage = infoImage; + _successImage = successImage; + _errorImage = errorImage; + } + + _ringThickness = 2; + _cornerRadius = 14; + + _isInitializing = NO; + } + + return self; +} + +- (void)updateHUDFrame{ + CGFloat hudWidth = 100.0f; + CGFloat hudHeight = 100.0f; + CGFloat stringHeightBuffer = 20.0f; + CGFloat stringAndContentHeightBuffer = 80.0f; + CGRect labelRect = CGRectZero; + + // Check if an image or progress ring is displayed + BOOL imageUsed = (self.imageView.image) || (self.imageView.hidden); + BOOL progressUsed = (self.progress != SVProgressHUDUndefinedProgress) && (self.progress >= 0.0f); + + // Calculate and apply sizes + NSString *string = self.stringLabel.text; + if(string){ + CGSize constraintSize = CGSizeMake(200.0f, 300.0f); + CGRect stringRect; + if([string respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]){ + stringRect = [string boundingRectWithSize:constraintSize + options:(NSStringDrawingOptions)(NSStringDrawingUsesFontLeading|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin) + attributes:@{NSFontAttributeName: self.stringLabel.font} + context:NULL]; + } else{ + CGSize stringSize; + if([string respondsToSelector:@selector(sizeWithAttributes:)]){ + stringSize = [string sizeWithAttributes:@{NSFontAttributeName:[UIFont fontWithName:self.stringLabel.font.fontName size:self.stringLabel.font.pointSize]}]; + } else{ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" + stringSize = [string sizeWithFont:self.stringLabel.font constrainedToSize:CGSizeMake(200.0f, 300.0f)]; +#pragma clang diagnostic pop + } + stringRect = CGRectMake(0.0f, 0.0f, stringSize.width, stringSize.height); + } + + CGFloat stringWidth = stringRect.size.width; + CGFloat stringHeight = ceilf(CGRectGetHeight(stringRect)); + + if(imageUsed || progressUsed){ + hudHeight = stringAndContentHeightBuffer + stringHeight; + } else{ + hudHeight = stringHeightBuffer + stringHeight; + } + if(stringWidth > hudWidth){ + hudWidth = ceilf(stringWidth/2)*2; + } + CGFloat labelRectY = (imageUsed || progressUsed) ? 68.0f : 9.0f; + if(hudHeight > 100.0f){ + labelRect = CGRectMake(12.0f, labelRectY, hudWidth, stringHeight); + hudWidth += 24.0f; + } else{ + hudWidth += 24.0f; + labelRect = CGRectMake(0.0f, labelRectY, hudWidth, stringHeight); + } + } + // Update values on subviews + self.hudView.bounds = CGRectMake(0.0f, 0.0f, hudWidth, hudHeight); + [self updateBlurBounds]; + + if(string){ + self.imageView.center = CGPointMake(CGRectGetWidth(self.hudView.bounds)/2, 36.0f); + } else{ + self.imageView.center = CGPointMake(CGRectGetWidth(self.hudView.bounds)/2, CGRectGetHeight(self.hudView.bounds)/2); + } + + self.stringLabel.hidden = NO; + self.stringLabel.frame = labelRect; + + // Animate value update + [CATransaction begin]; + [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; + + if(string) { + if(self.defaultAnimationType == SVProgressHUDAnimationTypeFlat) { + SVIndefiniteAnimatedView *indefiniteAnimationView = (SVIndefiniteAnimatedView *)self.indefiniteAnimatedView; + indefiniteAnimationView.radius = SVProgressHUDRingRadius; + [indefiniteAnimationView sizeToFit]; + } + + CGPoint center = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), 36.0f); + self.indefiniteAnimatedView.center = center; + + if(self.progress != SVProgressHUDUndefinedProgress){ + self.backgroundRingLayer.position = self.ringLayer.position = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), 36.0f); + } + } else { + if(self.defaultAnimationType == SVProgressHUDAnimationTypeFlat) { + SVIndefiniteAnimatedView *indefiniteAnimationView = (SVIndefiniteAnimatedView *)self.indefiniteAnimatedView; + indefiniteAnimationView.radius = SVProgressHUDRingNoTextRadius; + [indefiniteAnimationView sizeToFit]; + } + + CGPoint center = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), CGRectGetHeight(self.hudView.bounds)/2); + self.indefiniteAnimatedView.center = center; + + if(self.progress != SVProgressHUDUndefinedProgress){ + self.backgroundRingLayer.position = self.ringLayer.position = CGPointMake((CGRectGetWidth(self.hudView.bounds)/2), CGRectGetHeight(self.hudView.bounds)/2); + } + } + + [CATransaction commit]; +} + +- (void)updateMask{ + if(self.backgroundLayer){ + [self.backgroundLayer removeFromSuperlayer]; + self.backgroundLayer = nil; + } + switch (self.defaultMaskType){ + case SVProgressHUDMaskTypeBlack:{ + + self.backgroundLayer = [CALayer layer]; + self.backgroundLayer.frame = self.bounds; + self.backgroundLayer.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5].CGColor; + CGPoint gradientCenter = self.center; + gradientCenter.y = (self.bounds.size.height - self.visibleKeyboardHeight) / 2; + [self.backgroundLayer setNeedsDisplay]; + + [self.layer insertSublayer:self.backgroundLayer atIndex:0]; + break; + } + + case SVProgressHUDMaskTypeGradient:{ + SVRadialGradientLayer *layer = [SVRadialGradientLayer layer]; + self.backgroundLayer = layer; + self.backgroundLayer.frame = self.bounds; + CGPoint gradientCenter = self.center; + gradientCenter.y = (self.bounds.size.height - self.visibleKeyboardHeight) / 2; + layer.gradientCenter = gradientCenter; + [self.backgroundLayer setNeedsDisplay]; + + [self.layer insertSublayer:self.backgroundLayer atIndex:0]; + break; + } + default: + break; + } +} + +- (void)updateBlurBounds{ +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + if(NSClassFromString(@"UIBlurEffect")){ + // Remove background color, else the effect would not work + self.hudView.backgroundColor = [UIColor clearColor]; + + // Remove any old instances of UIVisualEffectViews + for (UIView *subview in self.hudView.subviews){ + if([subview isKindOfClass:[UIVisualEffectView class]]){ + [subview removeFromSuperview]; + } + } + + if(self.backgroundColor != [UIColor clearColor]){ + // Create blur effect + UIBlurEffectStyle blurEffectStyle = self.defaultStyle == SVProgressHUDStyleDark ? UIBlurEffectStyleDark : UIBlurEffectStyleLight; + UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:blurEffectStyle]; + UIVisualEffectView *blurEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect]; + blurEffectView.autoresizingMask = self.hudView.autoresizingMask; + blurEffectView.frame = self.hudView.bounds; + + // Add vibrancy to the blur effect to make it more vivid + UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect]; + UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect]; + vibrancyEffectView.autoresizingMask = blurEffectView.autoresizingMask; + vibrancyEffectView.bounds = blurEffectView.bounds; + [blurEffectView.contentView addSubview:vibrancyEffectView]; + + [self.hudView insertSubview:blurEffectView atIndex:0]; + } + } +#endif +} + +- (void)updateMotionEffectForOrientation:(UIInterfaceOrientation)orientation{ + if([_hudView respondsToSelector:@selector(addMotionEffect:)]){ + UIInterpolatingMotionEffectType motionEffectType = UIInterfaceOrientationIsPortrait(orientation) ? UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis : UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis; + UIInterpolatingMotionEffect *effectX = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:motionEffectType]; + effectX.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints); + effectX.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints); + + motionEffectType = UIInterfaceOrientationIsPortrait(orientation) ? UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis : UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis; + UIInterpolatingMotionEffect *effectY = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:motionEffectType]; + effectY.minimumRelativeValue = @(-SVProgressHUDParallaxDepthPoints); + effectY.maximumRelativeValue = @(SVProgressHUDParallaxDepthPoints); + + UIMotionEffectGroup *effectGroup = [[UIMotionEffectGroup alloc] init]; + effectGroup.motionEffects = @[effectX, effectY]; + + // Update motion effects + self.hudView.motionEffects = @[]; + [self.hudView addMotionEffect:effectGroup]; + } +} + +- (void)setStatus:(NSString*)string{ + self.stringLabel.text = string; + [self updateHUDFrame]; +} + +- (void)setFadeOutTimer:(NSTimer*)newTimer{ + if(_fadeOutTimer){ + [_fadeOutTimer invalidate], _fadeOutTimer = nil; + } + if(newTimer){ + _fadeOutTimer = newTimer; + } +} + + +#pragma mark - Notifications and their handling + +- (void)registerNotifications{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIApplicationDidChangeStatusBarOrientationNotification + object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIApplicationDidBecomeActiveNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardWillHideNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardDidHideNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardWillShowNotification + object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(positionHUD:) + name:UIKeyboardDidShowNotification + object:nil]; +} + +- (NSDictionary*)notificationUserInfo{ + return (self.stringLabel.text ? @{SVProgressHUDStatusUserInfoKey : self.stringLabel.text} : nil); +} + +- (void)positionHUD:(NSNotification*)notification{ + CGFloat keyboardHeight = 0.0f; + double animationDuration = 0.0; + +#if !defined(SV_APP_EXTENSIONS) + self.frame = [UIApplication sharedApplication].keyWindow.bounds; + UIInterfaceOrientation orientation = UIApplication.sharedApplication.statusBarOrientation; +#else + self.frame = UIScreen.mainScreen.bounds; + UIInterfaceOrientation orientation = CGRectGetWidth(self.frame) > CGRectGetHeight(self.frame) ? UIInterfaceOrientationLandscapeLeft : UIInterfaceOrientationPortrait; +#endif + + // no transforms applied to window in iOS 8, but only if compiled with iOS 8 sdk as base sdk, otherwise system supports old rotation logic. + BOOL ignoreOrientation = NO; +#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 + if([[NSProcessInfo processInfo] respondsToSelector:@selector(operatingSystemVersion)]){ + ignoreOrientation = YES; + } +#endif + + // Get keyboardHeight in regards to current state + if(notification){ + NSDictionary* keyboardInfo = [notification userInfo]; + CGRect keyboardFrame = [keyboardInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue]; + animationDuration = [keyboardInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + + if(notification.name == UIKeyboardWillShowNotification || notification.name == UIKeyboardDidShowNotification){ + if(ignoreOrientation || UIInterfaceOrientationIsPortrait(orientation)){ + keyboardHeight = CGRectGetHeight(keyboardFrame); + } else{ + keyboardHeight = CGRectGetWidth(keyboardFrame); + } + } + } else{ + keyboardHeight = self.visibleKeyboardHeight; + } + + // Get the currently active frame of the display (depends on orientation) + CGRect orientationFrame = self.bounds; +#if !defined(SV_APP_EXTENSIONS) + CGRect statusBarFrame = UIApplication.sharedApplication.statusBarFrame; +#else + CGRect statusBarFrame = CGRectZero; +#endif + + if(!ignoreOrientation && UIInterfaceOrientationIsLandscape(orientation)){ + float temp = CGRectGetWidth(orientationFrame); + orientationFrame.size.width = CGRectGetHeight(orientationFrame); + orientationFrame.size.height = temp; + + temp = CGRectGetWidth(statusBarFrame); + statusBarFrame.size.width = CGRectGetHeight(statusBarFrame); + statusBarFrame.size.height = temp; + } + + // Update the motion effects in regards to orientation + [self updateMotionEffectForOrientation:orientation]; + + // Calculate available height for display + CGFloat activeHeight = CGRectGetHeight(orientationFrame); + if(keyboardHeight > 0){ + activeHeight += CGRectGetHeight(statusBarFrame)*2; + } + activeHeight -= keyboardHeight; + + CGFloat posX = CGRectGetWidth(orientationFrame)/2.0f; + CGFloat posY = floorf(activeHeight*0.45f); + + CGPoint newCenter; + CGFloat rotateAngle; + + // Update posX and posY in regards to orientation + if(ignoreOrientation){ + rotateAngle = 0.0; + newCenter = CGPointMake(posX, posY); + } else{ + switch (orientation){ + case UIInterfaceOrientationPortraitUpsideDown: + rotateAngle = (CGFloat) M_PI; + newCenter = CGPointMake(posX, CGRectGetHeight(orientationFrame)-posY); + break; + case UIInterfaceOrientationLandscapeLeft: + rotateAngle = (CGFloat) (-M_PI/2.0f); + newCenter = CGPointMake(posY, posX); + break; + case UIInterfaceOrientationLandscapeRight: + rotateAngle = (CGFloat) (M_PI/2.0f); + newCenter = CGPointMake(CGRectGetHeight(orientationFrame)-posY, posX); + break; + default: // Same as UIInterfaceOrientationPortrait + rotateAngle = 0.0f; + newCenter = CGPointMake(posX, posY); + break; + } + } + + if(notification){ + // Animate update if notification was present + [UIView animateWithDuration:animationDuration + delay:0 + options:UIViewAnimationOptionAllowUserInteraction + animations:^{ + [self moveToPoint:newCenter rotateAngle:rotateAngle]; + [self.hudView setNeedsDisplay]; + } completion:NULL]; + } else{ + [self moveToPoint:newCenter rotateAngle:rotateAngle]; + [self.hudView setNeedsDisplay]; + } + +} + +- (void)moveToPoint:(CGPoint)newCenter rotateAngle:(CGFloat)angle{ + self.hudView.transform = CGAffineTransformMakeRotation(angle); + self.hudView.center = CGPointMake(newCenter.x + self.offsetFromCenter.horizontal, newCenter.y + self.offsetFromCenter.vertical); +} + + +#pragma mark - Event handling + +- (void)overlayViewDidReceiveTouchEvent:(id)sender forEvent:(UIEvent*)event{ + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidReceiveTouchEventNotification object:event]; + + UITouch *touch = event.allTouches.anyObject; + CGPoint touchLocation = [touch locationInView:self]; + + if(CGRectContainsPoint(self.hudView.frame, touchLocation)){ + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidTouchDownInsideNotification object:event]; + } +} + + +#pragma mark - Master show/dismiss methods + +- (void)showProgress:(float)progress status:(NSString*)string{ + if(!self.overlayView.superview){ +#if !defined(SV_APP_EXTENSIONS) + NSEnumerator *frontToBackWindows = [UIApplication.sharedApplication.windows reverseObjectEnumerator]; + for (UIWindow *window in frontToBackWindows){ + BOOL windowOnMainScreen = window.screen == UIScreen.mainScreen; + BOOL windowIsVisible = !window.hidden && window.alpha > 0; + BOOL windowLevelNormal = window.windowLevel == UIWindowLevelNormal; + + if(windowOnMainScreen && windowIsVisible && windowLevelNormal){ + [window addSubview:self.overlayView]; + break; + } + } +#else + if(SVProgressHUDExtensionView){ + [SVProgressHUDExtensionView addSubview:self.overlayView]; + } +#endif + } else{ + // Ensure that overlay will be exactly on top of rootViewController (which may be changed during runtime). + [self.overlayView.superview bringSubviewToFront:self.overlayView]; + } + + if(!self.superview){ + [self.overlayView addSubview:self]; + } + + if(self.fadeOutTimer){ + self.activityCount = 0; + } + self.fadeOutTimer = nil; + self.imageView.hidden = YES; + self.progress = progress; + + self.stringLabel.text = string; + [self updateHUDFrame]; + [self updateMask]; + + if(progress >= 0){ + self.imageView.image = nil; + self.imageView.hidden = NO; + + [self.indefiniteAnimatedView removeFromSuperview]; + if([self.indefiniteAnimatedView respondsToSelector:@selector(stopAnimating)]) { + [(id)self.indefiniteAnimatedView stopAnimating]; + } + + self.ringLayer.strokeEnd = progress; + + if(progress == 0){ + self.activityCount++; + } + } else{ + self.activityCount++; + [self cancelRingLayerAnimation]; + + [self.hudView addSubview:self.indefiniteAnimatedView]; + if([self.indefiniteAnimatedView respondsToSelector:@selector(startAnimating)]) { + [(id)self.indefiniteAnimatedView startAnimating]; + } + } + + if(self.defaultMaskType != SVProgressHUDMaskTypeNone){ + self.overlayView.userInteractionEnabled = YES; + self.accessibilityLabel = string; + self.isAccessibilityElement = YES; + } else{ + self.overlayView.userInteractionEnabled = NO; + self.hudView.accessibilityLabel = string; + self.hudView.isAccessibilityElement = YES; + } + + self.overlayView.hidden = NO; + self.overlayView.backgroundColor = [UIColor clearColor]; + [self positionHUD:nil]; + + // Appear + if(self.alpha != 1 || self.hudView.alpha != 1){ + NSDictionary *userInfo = [self notificationUserInfo]; + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillAppearNotification + object:nil + userInfo:userInfo]; + + [self registerNotifications]; + self.hudView.transform = CGAffineTransformScale(self.hudView.transform, 1.3, 1.3); + + if(self.isClear){ + self.alpha = 1; + self.hudView.alpha = 0; + } + + __weak SVProgressHUD *weakSelf = self; + [UIView animateWithDuration:0.15 + delay:0 + options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseOut | UIViewAnimationOptionBeginFromCurrentState + animations:^{ + __strong SVProgressHUD *strongSelf = weakSelf; + if(strongSelf){ + strongSelf.hudView.transform = CGAffineTransformScale(strongSelf.hudView.transform, 1/1.3f, 1/1.3f); + + if(strongSelf.isClear){ // handle iOS 7 and 8 UIToolbar which not answers well to hierarchy opacity change + strongSelf.hudView.alpha = 1; + } else{ + strongSelf.alpha = 1; + } + } + } + completion:^(BOOL finished){ + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidAppearNotification + object:nil + userInfo:userInfo]; + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, string); + }]; + + [self setNeedsDisplay]; + } +} + +- (void)showImage:(UIImage*)image status:(NSString*)string duration:(NSTimeInterval)duration{ + self.progress = SVProgressHUDUndefinedProgress; + [self cancelRingLayerAnimation]; + + if(![self.class isVisible]){ + [self.class show]; + } + + UIColor *tintColor = self.foregroundColorForStyle; + if([self.imageView respondsToSelector:@selector(setTintColor:)]){ + if (image.renderingMode != UIImageRenderingModeAlwaysTemplate) { + image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } + self.imageView.tintColor = tintColor; + } else{ + image = [self image:image withTintColor:tintColor]; + } + self.imageView.image = image; + self.imageView.hidden = NO; + + self.stringLabel.text = string; + [self updateHUDFrame]; + [self.indefiniteAnimatedView removeFromSuperview]; + if([self.indefiniteAnimatedView respondsToSelector:@selector(stopAnimating)]) { + [(id)self.indefiniteAnimatedView stopAnimating]; + } + + if(self.defaultMaskType != SVProgressHUDMaskTypeNone){ + self.overlayView.userInteractionEnabled = YES; + self.accessibilityLabel = string; + self.isAccessibilityElement = YES; + } else{ + self.overlayView.userInteractionEnabled = NO; + self.hudView.accessibilityLabel = string; + self.hudView.isAccessibilityElement = YES; + } + + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); + UIAccessibilityPostNotification(UIAccessibilityAnnouncementNotification, string); + + self.fadeOutTimer = [NSTimer timerWithTimeInterval:duration target:self selector:@selector(dismiss) userInfo:nil repeats:NO]; + [[NSRunLoop mainRunLoop] addTimer:self.fadeOutTimer forMode:NSRunLoopCommonModes]; +} + +- (void)dismissWithDelay:(NSTimeInterval)delay{ + NSDictionary *userInfo = [self notificationUserInfo]; + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDWillDisappearNotification + object:nil + userInfo:userInfo]; + + self.activityCount = 0; + __weak SVProgressHUD *weakSelf = self; + [UIView animateWithDuration:0.15 + delay:delay + options:(UIViewAnimationOptions) (UIViewAnimationCurveEaseIn | UIViewAnimationOptionAllowUserInteraction) + animations:^{ + __strong SVProgressHUD *strongSelf = weakSelf; + if(strongSelf){ + strongSelf.hudView.transform = CGAffineTransformScale(self.hudView.transform, 0.8f, 0.8f); + if(strongSelf.isClear){ // handle iOS 7 UIToolbar not answer well to hierarchy opacity change + strongSelf.hudView.alpha = 0.0f; + } else{ + strongSelf.alpha = 0.0f; + } + } + } + completion:^(BOOL finished){ + __strong SVProgressHUD *strongSelf = weakSelf; + if(strongSelf){ + if(strongSelf.alpha == 0.0f || strongSelf.hudView.alpha == 0.0f){ + strongSelf.alpha = 0.0f; + strongSelf.hudView.alpha = 0.0f; + + [[NSNotificationCenter defaultCenter] removeObserver:strongSelf]; + [strongSelf cancelRingLayerAnimation]; + [_hudView removeFromSuperview]; + _hudView = nil; + + [_overlayView removeFromSuperview]; + _overlayView = nil; + + [_indefiniteAnimatedView removeFromSuperview]; + _indefiniteAnimatedView = nil; + + UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, nil); + + [[NSNotificationCenter defaultCenter] postNotificationName:SVProgressHUDDidDisappearNotification + object:nil + userInfo:userInfo]; + + // Tell the rootViewController to update the StatusBar appearance +#if !defined(SV_APP_EXTENSIONS) + UIViewController *rootController = [[UIApplication sharedApplication] keyWindow].rootViewController; + if([rootController respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]){ + [rootController setNeedsStatusBarAppearanceUpdate]; + } +#endif + // uncomment to make sure UIWindow is gone from app.windows + //NSLog(@"%@", [UIApplication sharedApplication].windows); + //NSLog(@"keyWindow = %@", [UIApplication sharedApplication].keyWindow); + } + } + }]; +} + +- (void)dismiss +{ + [self dismissWithDelay:0]; +} + + +#pragma mark - Ring progress animation + +- (UIActivityIndicatorView *)createActivityIndicatorView{ + UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; + activityIndicatorView.color = self.foregroundColorForStyle; + [activityIndicatorView sizeToFit]; + return activityIndicatorView; +} + +- (SVIndefiniteAnimatedView *)createIndefiniteAnimatedView{ + SVIndefiniteAnimatedView *indefiniteAnimatedView = [[SVIndefiniteAnimatedView alloc] initWithFrame:CGRectZero]; + indefiniteAnimatedView.strokeColor = self.foregroundColorForStyle; + indefiniteAnimatedView.radius = self.stringLabel.text ? SVProgressHUDRingRadius : SVProgressHUDRingNoTextRadius; + indefiniteAnimatedView.strokeThickness = self.ringThickness; + [indefiniteAnimatedView sizeToFit]; + return indefiniteAnimatedView; +} + +- (UIView *)indefiniteAnimatedView{ + if(_indefiniteAnimatedView == nil){ + _indefiniteAnimatedView = (self.defaultAnimationType == SVProgressHUDAnimationTypeFlat) ? [self createIndefiniteAnimatedView] : [self createActivityIndicatorView]; + } + + return _indefiniteAnimatedView; +} + +- (CAShapeLayer*)ringLayer{ + if(!_ringLayer){ + CGPoint center = CGPointMake(CGRectGetWidth(_hudView.frame)/2, CGRectGetHeight(_hudView.frame)/2); + _ringLayer = [self createRingLayerWithCenter:center radius:SVProgressHUDRingRadius]; + [self.hudView.layer addSublayer:_ringLayer]; + } + _ringLayer.strokeColor = self.foregroundColorForStyle.CGColor; + _ringLayer.lineWidth = self.ringThickness; + + return _ringLayer; +} + +- (CAShapeLayer*)backgroundRingLayer{ + if(!_backgroundRingLayer){ + CGPoint center = CGPointMake(CGRectGetWidth(_hudView.frame)/2, CGRectGetHeight(_hudView.frame)/2); + _backgroundRingLayer = [self createRingLayerWithCenter:center radius:SVProgressHUDRingRadius]; + _backgroundRingLayer.strokeEnd = 1; + [self.hudView.layer addSublayer:_backgroundRingLayer]; + } + _backgroundRingLayer.strokeColor = [self.foregroundColorForStyle colorWithAlphaComponent:0.1f].CGColor; + _backgroundRingLayer.lineWidth = self.ringThickness; + + return _backgroundRingLayer; +} + +- (void)cancelRingLayerAnimation{ + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + [_hudView.layer removeAllAnimations]; + + _ringLayer.strokeEnd = 0.0f; + if(_ringLayer.superlayer){ + [_ringLayer removeFromSuperlayer]; + } + _ringLayer = nil; + + if(_backgroundRingLayer.superlayer){ + [_backgroundRingLayer removeFromSuperlayer]; + } + _backgroundRingLayer = nil; + + [CATransaction commit]; +} + +- (CAShapeLayer*)createRingLayerWithCenter:(CGPoint)center radius:(CGFloat)radius{ + UIBezierPath* smoothedPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(radius, radius) radius:radius startAngle:(CGFloat) -M_PI_2 endAngle:(CGFloat) (M_PI + M_PI_2) clockwise:YES]; + + CAShapeLayer *slice = [CAShapeLayer layer]; + slice.contentsScale = [[UIScreen mainScreen] scale]; + slice.frame = CGRectMake(center.x-radius, center.y-radius, radius*2, radius*2); + slice.fillColor = [UIColor clearColor].CGColor; + slice.lineCap = kCALineCapRound; + slice.lineJoin = kCALineJoinBevel; + slice.path = smoothedPath.CGPath; + + return slice; +} + + +#pragma mark - Utilities + ++ (BOOL)isVisible{ + return ([self sharedView].alpha == 1); +} + + +#pragma mark - Getters + +- (NSTimeInterval)displayDurationForString:(NSString*)string{ + return MIN((float)string.length*0.06 + 0.5, 5.0); +} + +- (UIColor *)foregroundColorForStyle{ + if(self.defaultStyle == SVProgressHUDStyleLight){ + return [UIColor blackColor]; + } else if(self.defaultStyle == SVProgressHUDStyleDark){ + return [UIColor whiteColor]; + } else{ + return self.foregroundColor; + } +} + +- (UIColor *)backgroundColorForStyle{ + if(self.defaultStyle == SVProgressHUDStyleLight){ + return [UIColor whiteColor]; + } else if(self.defaultStyle == SVProgressHUDStyleDark){ + return [UIColor blackColor]; + } else{ + return self.backgroundColor; + } +} + +- (UIImage*)image:(UIImage*)image withTintColor:(UIColor*)color{ + CGRect rect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); + UIGraphicsBeginImageContextWithOptions(rect.size, NO, image.scale); + CGContextRef c = UIGraphicsGetCurrentContext(); + [image drawInRect:rect]; + CGContextSetFillColorWithColor(c, [color CGColor]); + CGContextSetBlendMode(c, kCGBlendModeSourceAtop); + CGContextFillRect(c, rect); + UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return tintedImage; +} + +- (BOOL)isClear{ // used for iOS 7 and above + return (self.defaultMaskType == SVProgressHUDMaskTypeClear || self.defaultMaskType == SVProgressHUDMaskTypeNone); +} + +- (UIControl*)overlayView{ + if(!_overlayView){ +#if !defined(SV_APP_EXTENSIONS) + CGRect windowBounds = [UIApplication sharedApplication].keyWindow.bounds; + _overlayView = [[UIControl alloc] initWithFrame:windowBounds]; +#else + _overlayView = [[UIControl alloc] initWithFrame:[UIScreen mainScreen].bounds]; +#endif + _overlayView = [[UIControl alloc] initWithFrame:windowBounds]; + _overlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + _overlayView.backgroundColor = [UIColor clearColor]; + [_overlayView addTarget:self action:@selector(overlayViewDidReceiveTouchEvent:forEvent:) forControlEvents:UIControlEventTouchDown]; + } + return _overlayView; +} + +- (UIView*)hudView{ + if(!_hudView){ + _hudView = [[UIView alloc] initWithFrame:CGRectZero]; + _hudView.layer.cornerRadius = self.cornerRadius; + _hudView.layer.masksToBounds = YES; + _hudView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin; + } + _hudView.backgroundColor = self.backgroundColorForStyle; + + if(!_hudView.superview){ + [self addSubview:_hudView]; + } + return _hudView; +} + +- (UILabel*)stringLabel{ + if(!_stringLabel){ + _stringLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + _stringLabel.backgroundColor = [UIColor clearColor]; + _stringLabel.adjustsFontSizeToFitWidth = YES; + _stringLabel.textAlignment = NSTextAlignmentCenter; + _stringLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters; + _stringLabel.numberOfLines = 0; + } + _stringLabel.textColor = self.foregroundColorForStyle; + _stringLabel.font = self.font; + + if(!_stringLabel.superview){ + [self.hudView addSubview:_stringLabel]; + } + return _stringLabel; +} + +- (UIImageView*)imageView{ + if(!_imageView){ + _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 28.0f, 28.0f)]; + } + if(!_imageView.superview){ + [self.hudView addSubview:_imageView]; + } + return _imageView; +} + +- (CGFloat)visibleKeyboardHeight{ +#if !defined(SV_APP_EXTENSIONS) + UIWindow *keyboardWindow = nil; + for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]){ + if(![[testWindow class] isEqual:[UIWindow class]]){ + keyboardWindow = testWindow; + break; + } + } + + for (__strong UIView *possibleKeyboard in [keyboardWindow subviews]){ + if([possibleKeyboard isKindOfClass:NSClassFromString(@"UIPeripheralHostView")] || [possibleKeyboard isKindOfClass:NSClassFromString(@"UIKeyboard")]){ + return CGRectGetHeight(possibleKeyboard.bounds); + } else if([possibleKeyboard isKindOfClass:NSClassFromString(@"UIInputSetContainerView")]){ + for (__strong UIView *possibleKeyboardSubview in [possibleKeyboard subviews]){ + if([possibleKeyboardSubview isKindOfClass:NSClassFromString(@"UIInputSetHostView")]){ + return CGRectGetHeight(possibleKeyboardSubview.bounds); + } + } + } + } +#endif + return 0; +} + +#pragma mark - UIAppearance Setters + +- (void)setDefaultStyle:(SVProgressHUDStyle)style{ + if (!_isInitializing) _defaultStyle = style; +} + +- (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType{ + if (!_isInitializing) _defaultMaskType = maskType; +} + +-(void)setDefaultAnimationType:(SVProgressHUDAnimationType)animationType { + if (!_isInitializing) _defaultAnimationType = animationType; +} + +- (void)setRingThickness:(CGFloat)width { + if (!_isInitializing) _ringThickness = width; +} + +- (void)setCornerRadius:(CGFloat)cornerRadius { + if (!_isInitializing) _cornerRadius = cornerRadius; +} + +- (void)setFont:(UIFont *)font { + if (!_isInitializing) _font = font; +} + +- (void)setBackgroundColor:(UIColor *)color { + if (!_isInitializing) _backgroundColor = color; +} + +- (void)setForegroundColor:(UIColor *)color { + if (!_isInitializing) _foregroundColor = color; +} + +- (void)setInfoImage:(UIImage*)image{ + if (!_isInitializing) _infoImage = image; +} + +- (void)setSuccessImage:(UIImage *)image { + if (!_isInitializing) _successImage = image; +} + +- (void)setErrorImage:(UIImage *)image { + if (!_isInitializing) _errorImage = image; +} + +- (void)setViewForExtension:(UIView *)view{ + if (!_isInitializing) _viewForExtension = view; +} + + +- (void)setOffsetFromCenter:(UIOffset)offset { + if (!_isInitializing) _offsetFromCenter = offset; +} + +@end + diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h b/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h new file mode 100644 index 0000000..38cbf74 --- /dev/null +++ b/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.h @@ -0,0 +1,14 @@ +// +// SVRadialGradientLayer.h +// SVProgressHUD, https://github.com/TransitApp/SVProgressHUD +// +// Copyright (c) 2014 Tobias Tiemerding. All rights reserved. +// + +#import + +@interface SVRadialGradientLayer : CALayer + +@property (nonatomic) CGPoint gradientCenter; + +@end diff --git a/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m b/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m new file mode 100644 index 0000000..dd4c89a --- /dev/null +++ b/Pods/SVProgressHUD/SVProgressHUD/SVRadialGradientLayer.m @@ -0,0 +1,25 @@ +// +// SVRadialGradientLayer.m +// SVProgressHUD, https://github.com/TransitApp/SVProgressHUD +// +// Copyright (c) 2014 Tobias Tiemerding. All rights reserved. +// + +#import "SVRadialGradientLayer.h" + +@implementation SVRadialGradientLayer + +- (void)drawInContext:(CGContextRef)context { + size_t locationsCount = 2; + CGFloat locations[2] = {0.0f, 1.0f}; + CGFloat colors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colors, locations, locationsCount); + CGColorSpaceRelease(colorSpace); + + float radius = MIN(self.bounds.size.width , self.bounds.size.height) ; + CGContextDrawRadialGradient (context, gradient, self.gradientCenter, 0, self.gradientCenter, radius, kCGGradientDrawsAfterEndLocation); + CGGradientRelease(gradient); +} + +@end diff --git a/Pods/Spring/Spring/BlurView.swift b/Pods/Spring/Spring/BlurView.swift index d7871ee..00df486 100644 --- a/Pods/Spring/Spring/BlurView.swift +++ b/Pods/Spring/Spring/BlurView.swift @@ -27,6 +27,7 @@ public func insertBlurView (view: UIView, style: UIBlurEffectStyle) -> UIVisualE let blurEffect = UIBlurEffect(style: style) let blurEffectView = UIVisualEffectView(effect: blurEffect) + blurEffectView.frame = view.bounds view.insertSubview(blurEffectView, atIndex: 0) return blurEffectView diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown index d72f560..ab4678f 100644 --- a/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown @@ -82,6 +82,35 @@ 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. +## SVProgressHUD + +Copyright (c) 2011-2014 Sam Vermette + +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. + +A different license may apply to other resources included in this package, +including Freepik Icons. Please consult their +respective headers for the terms of their individual licenses. + ## SnapKit Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit diff --git a/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/Pods/Target Support Files/Pods/Pods-acknowledgements.plist index b643a06..967dd1c 100644 --- a/Pods/Target Support Files/Pods/Pods-acknowledgements.plist +++ b/Pods/Target Support Files/Pods/Pods-acknowledgements.plist @@ -109,6 +109,39 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Type PSGroupSpecifier + + FooterText + Copyright (c) 2011-2014 Sam Vermette + +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. + +A different license may apply to other resources included in this package, +including Freepik Icons. Please consult their +respective headers for the terms of their individual licenses. + Title + SVProgressHUD + Type + PSGroupSpecifier + FooterText Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit diff --git a/Pods/Target Support Files/Pods/Pods-frameworks.sh b/Pods/Target Support Files/Pods/Pods-frameworks.sh index 5835f84..05e4fb1 100755 --- a/Pods/Target Support Files/Pods/Pods-frameworks.sh +++ b/Pods/Target Support Files/Pods/Pods-frameworks.sh @@ -56,6 +56,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework 'Pods/Bolts.framework' install_framework 'Pods/Parse.framework' install_framework 'Pods/ParseUI.framework' + install_framework 'Pods/SVProgressHUD.framework' install_framework 'Pods/SnapKit.framework' install_framework 'Pods/Spring.framework' fi @@ -64,6 +65,7 @@ if [[ "$CONFIGURATION" == "Release" ]]; then install_framework 'Pods/Bolts.framework' install_framework 'Pods/Parse.framework' install_framework 'Pods/ParseUI.framework' + install_framework 'Pods/SVProgressHUD.framework' install_framework 'Pods/SnapKit.framework' install_framework 'Pods/Spring.framework' fi diff --git a/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/Pods/Target Support Files/Pods/Pods.debug.xcconfig index ca9593d..9416d4d 100644 --- a/Pods/Target Support Files/Pods/Pods.debug.xcconfig +++ b/Pods/Target Support Files/Pods/Pods.debug.xcconfig @@ -1,7 +1,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Bolts.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Parse.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/ParseUI.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SnapKit.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Spring.framework/Headers" -OTHER_LDFLAGS = $(inherited) -ObjC -undefined dynamic_lookup -framework "Alamofire" -framework "Bolts" -framework "Parse" -framework "ParseUI" -framework "SnapKit" -framework "Spring" +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Bolts.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Parse.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/ParseUI.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SVProgressHUD.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SnapKit.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Spring.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -undefined dynamic_lookup -framework "Alamofire" -framework "Bolts" -framework "Parse" -framework "ParseUI" -framework "SVProgressHUD" -framework "SnapKit" -framework "Spring" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/Pods/Pods.release.xcconfig b/Pods/Target Support Files/Pods/Pods.release.xcconfig index ca9593d..9416d4d 100644 --- a/Pods/Target Support Files/Pods/Pods.release.xcconfig +++ b/Pods/Target Support Files/Pods/Pods.release.xcconfig @@ -1,7 +1,7 @@ GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Bolts.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Parse.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/ParseUI.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SnapKit.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Spring.framework/Headers" -OTHER_LDFLAGS = $(inherited) -ObjC -undefined dynamic_lookup -framework "Alamofire" -framework "Bolts" -framework "Parse" -framework "ParseUI" -framework "SnapKit" -framework "Spring" +OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Alamofire.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Bolts.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Parse.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/ParseUI.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SVProgressHUD.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/SnapKit.framework/Headers" -iquote "$CONFIGURATION_BUILD_DIR/Spring.framework/Headers" +OTHER_LDFLAGS = $(inherited) -ObjC -undefined dynamic_lookup -framework "Alamofire" -framework "Bolts" -framework "Parse" -framework "ParseUI" -framework "SVProgressHUD" -framework "SnapKit" -framework "Spring" OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Pods/Target Support Files/SVProgressHUD/Info.plist b/Pods/Target Support Files/SVProgressHUD/Info.plist new file mode 100644 index 0000000..24482bd --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + org.cocoapods.${PRODUCT_NAME:rfc1034identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + HEAD based on 1.1.3 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-Private.xcconfig b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-Private.xcconfig new file mode 100644 index 0000000..ccc9640 --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-Private.xcconfig @@ -0,0 +1,6 @@ +#include "SVProgressHUD.xcconfig" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/SVProgressHUD" "${PODS_ROOT}/Headers/Public" +OTHER_LDFLAGS = ${SVPROGRESSHUD_OTHER_LDFLAGS} +PODS_ROOT = ${SRCROOT} +SKIP_INSTALL = YES \ No newline at end of file diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m new file mode 100644 index 0000000..696032a --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_SVProgressHUD : NSObject +@end +@implementation PodsDummy_SVProgressHUD +@end diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch new file mode 100644 index 0000000..aa992a4 --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-prefix.pch @@ -0,0 +1,4 @@ +#ifdef __OBJC__ +#import +#endif + diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-umbrella.h b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-umbrella.h new file mode 100644 index 0000000..cad07ba --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD-umbrella.h @@ -0,0 +1,9 @@ +#import + +#import "SVIndefiniteAnimatedView.h" +#import "SVProgressHUD.h" +#import "SVRadialGradientLayer.h" + +FOUNDATION_EXPORT double SVProgressHUDVersionNumber; +FOUNDATION_EXPORT const unsigned char SVProgressHUDVersionString[]; + diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemap b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemap new file mode 100644 index 0000000..2eaf140 --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemap @@ -0,0 +1,6 @@ +framework module SVProgressHUD { + umbrella header "SVProgressHUD-umbrella.h" + + export * + module * { export * } +} diff --git a/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig new file mode 100644 index 0000000..32b63c1 --- /dev/null +++ b/Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig @@ -0,0 +1 @@ +SVPROGRESSHUD_OTHER_LDFLAGS = -framework "QuartzCore" \ No newline at end of file diff --git a/README.md b/README.md index d400704..ef90b2a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ #图灵聊天机器人 ![Icon-60@3x.png](http://upload-images.jianshu.io/upload_images/727794-5f5d5a899832d67c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) -##v1.0.2 +##v1.0.0 beta ##使用图灵机器人API和Parse实现 ##运行环境: diff --git a/SHTextField.swift b/SHTextField.swift new file mode 100644 index 0000000..8dac83a --- /dev/null +++ b/SHTextField.swift @@ -0,0 +1,21 @@ +// +// SHTextField.swift +// TuringChatMachine +// +// Created by codeGlider on 15/9/29. +// Copyright © 2015年 codeGlider. All rights reserved. +// + +import UIKit + +class SHTextField: UITextField { + + /* + // Only override drawRect: if you perform custom drawing. + // An empty implementation adversely affects performance during animation. + override func drawRect(rect: CGRect) { + // Drawing code + } + */ + +} diff --git a/TRChatRequestManager.swift b/TRChatRequestManager.swift new file mode 100644 index 0000000..b72baef --- /dev/null +++ b/TRChatRequestManager.swift @@ -0,0 +1,201 @@ +// +// TRChatRequestManager.swift +// TuringChatMachine +// +// Created by codeGlider on 15/10/8. +// Copyright © 2015年 codeGlider. All rights reserved. +// + +import Foundation +import Alamofire +import Parse + +typealias newsType = (article:String,detailurl:String,icon:String,source:String) +typealias trainsType = (detailurl:String,endtime:String,icon:String,start:String,starttime:String,terminal:String,trainnum:String) +typealias recipeType = (name:String,info:String,detailurl:String,icon:String) + +public enum messageType:String{ + case text = "100000" + case link = "200000" + case news = "302000" + case trains = "305000" + case recipes = "308000" + + } + +public class TRChatRequestManager{ + + + + + + public var type:messageType! + public var message:AnyObject! + private static let instance = TRChatRequestManager() + class var sharedManager:TRChatRequestManager { + + return instance + } + func requestMessage(question:String,handler:(type:messageType,message:AnyObject)->Void){ + + Alamofire.request(.GET, NSURL(string: api_url)!, parameters: ["key":api_key,"info":question,"userid":PFUser.currentUser()!.objectId! as String]).responseJSON(options: NSJSONReadingOptions.MutableContainers) { _,_,data in + + guard data.isSuccess else{ + print("Request error \(data.error)") + return + } + + guard let type = messageType.init(rawValue:((data.value!.objectForKey("code") as? NSNumber)?.stringValue)! ) else{ + print("Data error \(data.error)") + return + } + guard let answer = data.value!.objectForKey("text") as? String else { + print("Data error \(data.error)") + return + + } + + self.type = type + + switch (type){ + + case .text: + + let message = textMessage(answer: answer) + + self.message = message + print("\(self.type) : \((self.message as! textMessage).answer)") + handler(type: type, message: self.message as! textMessage) + break + case .link: + + let url = data.value!.objectForKey("url") as! String + let message = linkMessage(answer: answer + "\n(请点击本消息打开查看)", url: url) + self.message = message + print("\(self.type) : \(self.message as! linkMessage)") + handler(type: type, message: self.message as! linkMessage) + break + case .trains: + + var trains:[trainsType] = [] + + (data.value!.objectForKey("list") as! NSArray) + .map{ + trains.append(( + $0.objectForKey("detailurl") as! String , + $0.objectForKey("endtime") as! String, + $0.objectForKey("icon") as! String, + $0.objectForKey("start") as! String, + $0.objectForKey("starttime") as! String, + $0.objectForKey("terminal") as! String, + $0.objectForKey("trainnum") as! String + ) + ) + + } + self.message = trainMessage(answer: answer, trains: trains) + handler(type: type, message: self.message as! trainMessage) + // print("\(self.type) : \((self.message as! trainMessage).trains)") + break + case .news: + + var news:[newsType] = [] + + (data.value!.objectForKey("list") as! NSArray) + .map{ + news.append(( + $0.objectForKey("article") as! String , + $0.objectForKey("detailurl") as! String, + $0.objectForKey("icon") as! String, + $0.objectForKey("source") as! String) + ) + + } + self.message = newsMessage(answer: answer, news: news) +// print("\(self.type) : \((self.message as! newsMessage).news)") + break + case .recipes: + var recipes:[recipeType] = [] + + (data.value!.objectForKey("list") as! NSArray) + .map{ + recipes.append(( + $0.objectForKey("name") as! String , + $0.objectForKey("info") as! String, + $0.objectForKey("detailurl") as! String, + $0.objectForKey("icon") as! String + ) + ) + + } + self.message = recipeMessage(answer: answer, recipes: recipes) + +// print("\(self.type) : \((self.message as! recipeMessage).recipes)") + break + default: break + + + } + + + } + + + + } + + + +} +class textMessage{ + + var answer:String + init( answer:String){ + + self.answer = answer + + } + + +} +class linkMessage{ + var answer:String + var url:String + init(answer:String,url:String){ + + self.answer = answer + self.url = url + + } + +} +class newsMessage{ + var answer:String + var news:[newsType] + init(answer:String,news:[newsType]){ + self.answer = answer + self.news = news + } + +} +class recipeMessage{ + var answer:String + var recipes:[recipeType] + init(answer:String,recipes:[recipeType]){ + self.answer = answer + self.recipes = recipes + + } +} +class trainMessage{ + var answer:String + var trains:[trainsType] + init(answer:String,trains:[trainsType]){ + self.answer = answer + self.trains = trains + + + } + +} + diff --git a/TuringChatMachine.xcodeproj/project.pbxproj b/TuringChatMachine.xcodeproj/project.pbxproj index b2fb41c..35ec5fd 100644 --- a/TuringChatMachine.xcodeproj/project.pbxproj +++ b/TuringChatMachine.xcodeproj/project.pbxproj @@ -17,15 +17,38 @@ 6EC946021B9691C7001A8943 /* ChatViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC945FE1B9691C7001A8943 /* ChatViewController.swift */; }; 75B334B0CA33BB4B8729CE53 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 127F756A1F6DCE74E2B2AE10 /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 872118451BB0F4210088B2B4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 872118441BB0F4210088B2B4 /* Main.storyboard */; settings = {ASSET_TAGS = (); }; }; - 8721184B1BB102E80088B2B4 /* Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872118461BB102E80088B2B4 /* Extension.swift */; settings = {ASSET_TAGS = (); }; }; + 8721184B1BB102E80088B2B4 /* Extension&util.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872118461BB102E80088B2B4 /* Extension&util.swift */; settings = {ASSET_TAGS = (); }; }; 8721184C1BB102E80088B2B4 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872118471BB102E80088B2B4 /* HomeViewController.swift */; settings = {ASSET_TAGS = (); }; }; 8721184D1BB102E80088B2B4 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872118481BB102E80088B2B4 /* LoginViewController.swift */; settings = {ASSET_TAGS = (); }; }; 8721184E1BB102E80088B2B4 /* ResetPasswordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 872118491BB102E80088B2B4 /* ResetPasswordViewController.swift */; settings = {ASSET_TAGS = (); }; }; 8721184F1BB102E80088B2B4 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8721184A1BB102E80088B2B4 /* SignUpViewController.swift */; settings = {ASSET_TAGS = (); }; }; 872118511BB13EBB0088B2B4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 872118501BB13EBB0088B2B4 /* LaunchScreen.storyboard */; settings = {ASSET_TAGS = (); }; }; + 87340D341BBA6B9B00878B39 /* UITabelViewLoadAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87340D331BBA6B9B00878B39 /* UITabelViewLoadAnimation.swift */; settings = {ASSET_TAGS = (); }; }; + 8758F2DE1BC8AFB30067FE1D /* MutiMessageTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8758F2DC1BC8AFB30067FE1D /* MutiMessageTableViewCell.swift */; settings = {ASSET_TAGS = (); }; }; + 87B2FD0C1BBA7A180078679E /* LaunchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87B2FD0B1BBA7A180078679E /* LaunchViewController.swift */; settings = {ASSET_TAGS = (); }; }; 87D1C6441BAFB6BF009B8AFA /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 87D1C6431BAFB6BF009B8AFA /* CloudKit.framework */; }; 87DFA6741BB446BE00DF4346 /* FadeInTransitionAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87DFA6731BB446BE00DF4346 /* FadeInTransitionAnimator.swift */; settings = {ASSET_TAGS = (); }; }; - 87E001641BAFA084007ABC42 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87E001631BAFA084007ABC42 /* WebViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 87F0509C1BB8DCD0003976B6 /* MJRefreshAutoFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050721BB8DCD0003976B6 /* MJRefreshAutoFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F0509D1BB8DCD0003976B6 /* MJRefreshBackFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050741BB8DCD0003976B6 /* MJRefreshBackFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F0509E1BB8DCD0003976B6 /* MJRefreshComponent.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050761BB8DCD0003976B6 /* MJRefreshComponent.m */; settings = {ASSET_TAGS = (); }; }; + 87F0509F1BB8DCD0003976B6 /* MJRefreshFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050781BB8DCD0003976B6 /* MJRefreshFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A01BB8DCD0003976B6 /* MJRefreshHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F0507A1BB8DCD0003976B6 /* MJRefreshHeader.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A11BB8DCD0003976B6 /* MJRefreshAutoGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F0507F1BB8DCD0003976B6 /* MJRefreshAutoGifFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A21BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050811BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A31BB8DCD0003976B6 /* MJRefreshAutoStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050831BB8DCD0003976B6 /* MJRefreshAutoStateFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A41BB8DCD0003976B6 /* MJRefreshBackGifFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050861BB8DCD0003976B6 /* MJRefreshBackGifFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A51BB8DCD0003976B6 /* MJRefreshBackNormalFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050881BB8DCD0003976B6 /* MJRefreshBackNormalFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A61BB8DCD0003976B6 /* MJRefreshBackStateFooter.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F0508A1BB8DCD0003976B6 /* MJRefreshBackStateFooter.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A71BB8DCD0003976B6 /* MJRefreshGifHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F0508D1BB8DCD0003976B6 /* MJRefreshGifHeader.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A81BB8DCD0003976B6 /* MJRefreshNormalHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F0508F1BB8DCD0003976B6 /* MJRefreshNormalHeader.m */; settings = {ASSET_TAGS = (); }; }; + 87F050A91BB8DCD0003976B6 /* MJRefreshStateHeader.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050911BB8DCD0003976B6 /* MJRefreshStateHeader.m */; settings = {ASSET_TAGS = (); }; }; + 87F050AA1BB8DCD0003976B6 /* MJRefresh.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 87F050921BB8DCD0003976B6 /* MJRefresh.bundle */; settings = {ASSET_TAGS = (); }; }; + 87F050AB1BB8DCD0003976B6 /* MJRefreshConst.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050951BB8DCD0003976B6 /* MJRefreshConst.m */; settings = {ASSET_TAGS = (); }; }; + 87F050AC1BB8DCD0003976B6 /* UIScrollView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050971BB8DCD0003976B6 /* UIScrollView+MJExtension.m */; settings = {ASSET_TAGS = (); }; }; + 87F050AD1BB8DCD0003976B6 /* UIScrollView+MJRefresh.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F050991BB8DCD0003976B6 /* UIScrollView+MJRefresh.m */; settings = {ASSET_TAGS = (); }; }; + 87F050AE1BB8DCD0003976B6 /* UIView+MJExtension.m in Sources */ = {isa = PBXBuildFile; fileRef = 87F0509B1BB8DCD0003976B6 /* UIView+MJExtension.m */; settings = {ASSET_TAGS = (); }; }; + 87F31E2B1BBAE82B001FDE6E /* SHTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87F31E2A1BBAE82B001FDE6E /* SHTextField.swift */; settings = {ASSET_TAGS = (); }; }; + 87FB7E971BC69013003B07CE /* TRChatRequestManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87FB7E961BC69013003B07CE /* TRChatRequestManager.swift */; settings = {ASSET_TAGS = (); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -55,17 +78,59 @@ 6EC945FE1B9691C7001A8943 /* ChatViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ChatViewController.swift; sourceTree = ""; }; 735D6E07674705CBE9DA6651 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 872118441BB0F4210088B2B4 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = ""; }; - 872118461BB102E80088B2B4 /* Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extension.swift; sourceTree = ""; }; + 872118461BB102E80088B2B4 /* Extension&util.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Extension&util.swift"; sourceTree = ""; }; 872118471BB102E80088B2B4 /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; 872118481BB102E80088B2B4 /* LoginViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; 872118491BB102E80088B2B4 /* ResetPasswordViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ResetPasswordViewController.swift; sourceTree = ""; }; 8721184A1BB102E80088B2B4 /* SignUpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; 872118501BB13EBB0088B2B4 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + 87340D331BBA6B9B00878B39 /* UITabelViewLoadAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UITabelViewLoadAnimation.swift; sourceTree = ""; }; + 8758F2DC1BC8AFB30067FE1D /* MutiMessageTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MutiMessageTableViewCell.swift; path = ../MutiMessageTableViewCell.swift; sourceTree = ""; }; 87925A521BB3A1A500847703 /* MJRefresh-Bridge-header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MJRefresh-Bridge-header.h"; sourceTree = ""; }; + 87B2FD0B1BBA7A180078679E /* LaunchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = ""; }; 87D1C6421BAFB1E0009B8AFA /* TuringChatMachine.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = TuringChatMachine.entitlements; sourceTree = ""; }; 87D1C6431BAFB6BF009B8AFA /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; 87DFA6731BB446BE00DF4346 /* FadeInTransitionAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FadeInTransitionAnimator.swift; sourceTree = ""; }; - 87E001631BAFA084007ABC42 /* WebViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; }; + 87F050711BB8DCD0003976B6 /* MJRefreshAutoFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshAutoFooter.h; sourceTree = ""; }; + 87F050721BB8DCD0003976B6 /* MJRefreshAutoFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshAutoFooter.m; sourceTree = ""; }; + 87F050731BB8DCD0003976B6 /* MJRefreshBackFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshBackFooter.h; sourceTree = ""; }; + 87F050741BB8DCD0003976B6 /* MJRefreshBackFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshBackFooter.m; sourceTree = ""; }; + 87F050751BB8DCD0003976B6 /* MJRefreshComponent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshComponent.h; sourceTree = ""; }; + 87F050761BB8DCD0003976B6 /* MJRefreshComponent.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshComponent.m; sourceTree = ""; }; + 87F050771BB8DCD0003976B6 /* MJRefreshFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshFooter.h; sourceTree = ""; }; + 87F050781BB8DCD0003976B6 /* MJRefreshFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshFooter.m; sourceTree = ""; }; + 87F050791BB8DCD0003976B6 /* MJRefreshHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshHeader.h; sourceTree = ""; }; + 87F0507A1BB8DCD0003976B6 /* MJRefreshHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshHeader.m; sourceTree = ""; }; + 87F0507E1BB8DCD0003976B6 /* MJRefreshAutoGifFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshAutoGifFooter.h; sourceTree = ""; }; + 87F0507F1BB8DCD0003976B6 /* MJRefreshAutoGifFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshAutoGifFooter.m; sourceTree = ""; }; + 87F050801BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshAutoNormalFooter.h; sourceTree = ""; }; + 87F050811BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshAutoNormalFooter.m; sourceTree = ""; }; + 87F050821BB8DCD0003976B6 /* MJRefreshAutoStateFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshAutoStateFooter.h; sourceTree = ""; }; + 87F050831BB8DCD0003976B6 /* MJRefreshAutoStateFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshAutoStateFooter.m; sourceTree = ""; }; + 87F050851BB8DCD0003976B6 /* MJRefreshBackGifFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshBackGifFooter.h; sourceTree = ""; }; + 87F050861BB8DCD0003976B6 /* MJRefreshBackGifFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshBackGifFooter.m; sourceTree = ""; }; + 87F050871BB8DCD0003976B6 /* MJRefreshBackNormalFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshBackNormalFooter.h; sourceTree = ""; }; + 87F050881BB8DCD0003976B6 /* MJRefreshBackNormalFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshBackNormalFooter.m; sourceTree = ""; }; + 87F050891BB8DCD0003976B6 /* MJRefreshBackStateFooter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshBackStateFooter.h; sourceTree = ""; }; + 87F0508A1BB8DCD0003976B6 /* MJRefreshBackStateFooter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshBackStateFooter.m; sourceTree = ""; }; + 87F0508C1BB8DCD0003976B6 /* MJRefreshGifHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshGifHeader.h; sourceTree = ""; }; + 87F0508D1BB8DCD0003976B6 /* MJRefreshGifHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshGifHeader.m; sourceTree = ""; }; + 87F0508E1BB8DCD0003976B6 /* MJRefreshNormalHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshNormalHeader.h; sourceTree = ""; }; + 87F0508F1BB8DCD0003976B6 /* MJRefreshNormalHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshNormalHeader.m; sourceTree = ""; }; + 87F050901BB8DCD0003976B6 /* MJRefreshStateHeader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshStateHeader.h; sourceTree = ""; }; + 87F050911BB8DCD0003976B6 /* MJRefreshStateHeader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshStateHeader.m; sourceTree = ""; }; + 87F050921BB8DCD0003976B6 /* MJRefresh.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = MJRefresh.bundle; sourceTree = ""; }; + 87F050931BB8DCD0003976B6 /* MJRefresh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefresh.h; sourceTree = ""; }; + 87F050941BB8DCD0003976B6 /* MJRefreshConst.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MJRefreshConst.h; sourceTree = ""; }; + 87F050951BB8DCD0003976B6 /* MJRefreshConst.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MJRefreshConst.m; sourceTree = ""; }; + 87F050961BB8DCD0003976B6 /* UIScrollView+MJExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+MJExtension.h"; sourceTree = ""; }; + 87F050971BB8DCD0003976B6 /* UIScrollView+MJExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+MJExtension.m"; sourceTree = ""; }; + 87F050981BB8DCD0003976B6 /* UIScrollView+MJRefresh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+MJRefresh.h"; sourceTree = ""; }; + 87F050991BB8DCD0003976B6 /* UIScrollView+MJRefresh.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+MJRefresh.m"; sourceTree = ""; }; + 87F0509A1BB8DCD0003976B6 /* UIView+MJExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIView+MJExtension.h"; sourceTree = ""; }; + 87F0509B1BB8DCD0003976B6 /* UIView+MJExtension.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIView+MJExtension.m"; sourceTree = ""; }; + 87F31E2A1BBAE82B001FDE6E /* SHTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SHTextField.swift; sourceTree = ""; }; + 87FB7E961BC69013003B07CE /* TRChatRequestManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TRChatRequestManager.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -103,7 +168,7 @@ isa = PBXGroup; children = ( 87DFA6731BB446BE00DF4346 /* FadeInTransitionAnimator.swift */, - 872118461BB102E80088B2B4 /* Extension.swift */, + 872118461BB102E80088B2B4 /* Extension&util.swift */, 872118471BB102E80088B2B4 /* HomeViewController.swift */, 872118481BB102E80088B2B4 /* LoginViewController.swift */, 872118491BB102E80088B2B4 /* ResetPasswordViewController.swift */, @@ -116,7 +181,7 @@ 6E0923581BA7A98A00C498C1 /* chatPage */ = { isa = PBXGroup; children = ( - 87E001631BAFA084007ABC42 /* WebViewController.swift */, + 8758F2DC1BC8AFB30067FE1D /* MutiMessageTableViewCell.swift */, 6EC945FC1B9691C7001A8943 /* MessageBubbleTableViewCell.swift */, 6EC945FE1B9691C7001A8943 /* ChatViewController.swift */, ); @@ -134,6 +199,8 @@ 6EC945CB1B968F71001A8943 = { isa = PBXGroup; children = ( + 87FB7E961BC69013003B07CE /* TRChatRequestManager.swift */, + 87F050661BB8D935003976B6 /* Utility */, 87925A521BB3A1A500847703 /* MJRefresh-Bridge-header.h */, 6EC945F91B968FD5001A8943 /* Podfile */, 6EC945D61B968F71001A8943 /* TuringChatMachine */, @@ -194,13 +261,125 @@ 6EE18E031BA26EFB00944C87 /* controllers */ = { isa = PBXGroup; children = ( + 87B2FD0A1BBA79E80078679E /* LaunchScreen */, 6E0923581BA7A98A00C498C1 /* chatPage */, 6E0923571BA7A96D00C498C1 /* welcomePage */, - 872118501BB13EBB0088B2B4 /* LaunchScreen.storyboard */, ); name = controllers; sourceTree = ""; }; + 87B2FD0A1BBA79E80078679E /* LaunchScreen */ = { + isa = PBXGroup; + children = ( + 872118501BB13EBB0088B2B4 /* LaunchScreen.storyboard */, + 87B2FD0B1BBA7A180078679E /* LaunchViewController.swift */, + ); + name = LaunchScreen; + sourceTree = ""; + }; + 87F050661BB8D935003976B6 /* Utility */ = { + isa = PBXGroup; + children = ( + 87340D331BBA6B9B00878B39 /* UITabelViewLoadAnimation.swift */, + 87F0506F1BB8DCD0003976B6 /* MJRefresh */, + 87F31E2A1BBAE82B001FDE6E /* SHTextField.swift */, + ); + name = Utility; + sourceTree = ""; + }; + 87F0506F1BB8DCD0003976B6 /* MJRefresh */ = { + isa = PBXGroup; + children = ( + 87F050701BB8DCD0003976B6 /* Base */, + 87F0507B1BB8DCD0003976B6 /* Custom */, + 87F050921BB8DCD0003976B6 /* MJRefresh.bundle */, + 87F050931BB8DCD0003976B6 /* MJRefresh.h */, + 87F050941BB8DCD0003976B6 /* MJRefreshConst.h */, + 87F050951BB8DCD0003976B6 /* MJRefreshConst.m */, + 87F050961BB8DCD0003976B6 /* UIScrollView+MJExtension.h */, + 87F050971BB8DCD0003976B6 /* UIScrollView+MJExtension.m */, + 87F050981BB8DCD0003976B6 /* UIScrollView+MJRefresh.h */, + 87F050991BB8DCD0003976B6 /* UIScrollView+MJRefresh.m */, + 87F0509A1BB8DCD0003976B6 /* UIView+MJExtension.h */, + 87F0509B1BB8DCD0003976B6 /* UIView+MJExtension.m */, + ); + path = MJRefresh; + sourceTree = ""; + }; + 87F050701BB8DCD0003976B6 /* Base */ = { + isa = PBXGroup; + children = ( + 87F050711BB8DCD0003976B6 /* MJRefreshAutoFooter.h */, + 87F050721BB8DCD0003976B6 /* MJRefreshAutoFooter.m */, + 87F050731BB8DCD0003976B6 /* MJRefreshBackFooter.h */, + 87F050741BB8DCD0003976B6 /* MJRefreshBackFooter.m */, + 87F050751BB8DCD0003976B6 /* MJRefreshComponent.h */, + 87F050761BB8DCD0003976B6 /* MJRefreshComponent.m */, + 87F050771BB8DCD0003976B6 /* MJRefreshFooter.h */, + 87F050781BB8DCD0003976B6 /* MJRefreshFooter.m */, + 87F050791BB8DCD0003976B6 /* MJRefreshHeader.h */, + 87F0507A1BB8DCD0003976B6 /* MJRefreshHeader.m */, + ); + path = Base; + sourceTree = ""; + }; + 87F0507B1BB8DCD0003976B6 /* Custom */ = { + isa = PBXGroup; + children = ( + 87F0507C1BB8DCD0003976B6 /* Footer */, + 87F0508B1BB8DCD0003976B6 /* Header */, + ); + path = Custom; + sourceTree = ""; + }; + 87F0507C1BB8DCD0003976B6 /* Footer */ = { + isa = PBXGroup; + children = ( + 87F0507D1BB8DCD0003976B6 /* Auto */, + 87F050841BB8DCD0003976B6 /* Back */, + ); + path = Footer; + sourceTree = ""; + }; + 87F0507D1BB8DCD0003976B6 /* Auto */ = { + isa = PBXGroup; + children = ( + 87F0507E1BB8DCD0003976B6 /* MJRefreshAutoGifFooter.h */, + 87F0507F1BB8DCD0003976B6 /* MJRefreshAutoGifFooter.m */, + 87F050801BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.h */, + 87F050811BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.m */, + 87F050821BB8DCD0003976B6 /* MJRefreshAutoStateFooter.h */, + 87F050831BB8DCD0003976B6 /* MJRefreshAutoStateFooter.m */, + ); + path = Auto; + sourceTree = ""; + }; + 87F050841BB8DCD0003976B6 /* Back */ = { + isa = PBXGroup; + children = ( + 87F050851BB8DCD0003976B6 /* MJRefreshBackGifFooter.h */, + 87F050861BB8DCD0003976B6 /* MJRefreshBackGifFooter.m */, + 87F050871BB8DCD0003976B6 /* MJRefreshBackNormalFooter.h */, + 87F050881BB8DCD0003976B6 /* MJRefreshBackNormalFooter.m */, + 87F050891BB8DCD0003976B6 /* MJRefreshBackStateFooter.h */, + 87F0508A1BB8DCD0003976B6 /* MJRefreshBackStateFooter.m */, + ); + path = Back; + sourceTree = ""; + }; + 87F0508B1BB8DCD0003976B6 /* Header */ = { + isa = PBXGroup; + children = ( + 87F0508C1BB8DCD0003976B6 /* MJRefreshGifHeader.h */, + 87F0508D1BB8DCD0003976B6 /* MJRefreshGifHeader.m */, + 87F0508E1BB8DCD0003976B6 /* MJRefreshNormalHeader.h */, + 87F0508F1BB8DCD0003976B6 /* MJRefreshNormalHeader.m */, + 87F050901BB8DCD0003976B6 /* MJRefreshStateHeader.h */, + 87F050911BB8DCD0003976B6 /* MJRefreshStateHeader.m */, + ); + path = Header; + sourceTree = ""; + }; D431887E2EF3B90B8DC625CF /* Pods */ = { isa = PBXGroup; children = ( @@ -304,6 +483,7 @@ 6EC945FA1B968FD5001A8943 /* Podfile in Resources */, 6EC945E11B968F71001A8943 /* Images.xcassets in Resources */, 872118511BB13EBB0088B2B4 /* LaunchScreen.storyboard in Resources */, + 87F050AA1BB8DCD0003976B6 /* MJRefresh.bundle in Resources */, 872118451BB0F4210088B2B4 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -371,16 +551,38 @@ buildActionMask = 2147483647; files = ( 8721184F1BB102E80088B2B4 /* SignUpViewController.swift in Sources */, + 87B2FD0C1BBA7A180078679E /* LaunchViewController.swift in Sources */, + 87F050A91BB8DCD0003976B6 /* MJRefreshStateHeader.m in Sources */, 8721184D1BB102E80088B2B4 /* LoginViewController.swift in Sources */, + 87F050AE1BB8DCD0003976B6 /* UIView+MJExtension.m in Sources */, 6EC945FF1B9691C7001A8943 /* Message.swift in Sources */, - 87E001641BAFA084007ABC42 /* WebViewController.swift in Sources */, - 8721184B1BB102E80088B2B4 /* Extension.swift in Sources */, + 8721184B1BB102E80088B2B4 /* Extension&util.swift in Sources */, + 87F050AD1BB8DCD0003976B6 /* UIScrollView+MJRefresh.m in Sources */, 8721184C1BB102E80088B2B4 /* HomeViewController.swift in Sources */, + 87F050A51BB8DCD0003976B6 /* MJRefreshBackNormalFooter.m in Sources */, 6EC946001B9691C7001A8943 /* MessageBubbleTableViewCell.swift in Sources */, + 87F050A81BB8DCD0003976B6 /* MJRefreshNormalHeader.m in Sources */, + 87F050A21BB8DCD0003976B6 /* MJRefreshAutoNormalFooter.m in Sources */, + 87F31E2B1BBAE82B001FDE6E /* SHTextField.swift in Sources */, + 87F0509D1BB8DCD0003976B6 /* MJRefreshBackFooter.m in Sources */, + 87F050A31BB8DCD0003976B6 /* MJRefreshAutoStateFooter.m in Sources */, + 87F050A71BB8DCD0003976B6 /* MJRefreshGifHeader.m in Sources */, + 87F050A11BB8DCD0003976B6 /* MJRefreshAutoGifFooter.m in Sources */, + 87F050AC1BB8DCD0003976B6 /* UIScrollView+MJExtension.m in Sources */, 6EC945DA1B968F71001A8943 /* AppDelegate.swift in Sources */, + 87F050A41BB8DCD0003976B6 /* MJRefreshBackGifFooter.m in Sources */, + 87F0509E1BB8DCD0003976B6 /* MJRefreshComponent.m in Sources */, 8721184E1BB102E80088B2B4 /* ResetPasswordViewController.swift in Sources */, + 8758F2DE1BC8AFB30067FE1D /* MutiMessageTableViewCell.swift in Sources */, + 87F050A01BB8DCD0003976B6 /* MJRefreshHeader.m in Sources */, 6EC946021B9691C7001A8943 /* ChatViewController.swift in Sources */, 87DFA6741BB446BE00DF4346 /* FadeInTransitionAnimator.swift in Sources */, + 87F0509C1BB8DCD0003976B6 /* MJRefreshAutoFooter.m in Sources */, + 87340D341BBA6B9B00878B39 /* UITabelViewLoadAnimation.swift in Sources */, + 87F0509F1BB8DCD0003976B6 /* MJRefreshFooter.m in Sources */, + 87F050A61BB8DCD0003976B6 /* MJRefreshBackStateFooter.m in Sources */, + 87F050AB1BB8DCD0003976B6 /* MJRefreshConst.m in Sources */, + 87FB7E971BC69013003B07CE /* TRChatRequestManager.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/UserInterfaceState.xcuserstate b/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/UserInterfaceState.xcuserstate index 7ed9541..e6b952d 100644 Binary files a/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/UserInterfaceState.xcuserstate and b/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index ed9a9b4..cfcd999 100644 --- a/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/TuringChatMachine.xcworkspace/xcuserdata/codeglider.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,4 +2,22 @@ + + + + + + diff --git a/TuringChatMachine/.DS_Store b/TuringChatMachine/.DS_Store index aef3dc1..366b0b2 100644 Binary files a/TuringChatMachine/.DS_Store and b/TuringChatMachine/.DS_Store differ diff --git a/TuringChatMachine/AppDelegate.swift b/TuringChatMachine/AppDelegate.swift index 9d83f20..ee5cf33 100644 --- a/TuringChatMachine/AppDelegate.swift +++ b/TuringChatMachine/AppDelegate.swift @@ -21,9 +21,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. - + Parse.enableLocalDatastore() Parse.setApplicationId("CYdFL9mvG8jHqc4ZA5PJsWMInBbMMun0XCoqnHgf", clientKey: "6tGOC1uIKeYp5glvJE6MXZOWG9pmLtMuIUdh2Yzo") - + PFAnalytics.trackAppOpenedWithLaunchOptionsInBackground(launchOptions) { (success, Error) -> Void in guard success else{ print("Analytics failed! \(Error?.userInfo)") @@ -42,7 +42,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()] UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent - + let frame = UIScreen.mainScreen().bounds window = UIWindow(frame: frame) diff --git a/TuringChatMachine/ChatViewController.swift b/TuringChatMachine/ChatViewController.swift index 2cedb6d..63494f5 100644 --- a/TuringChatMachine/ChatViewController.swift +++ b/TuringChatMachine/ChatViewController.swift @@ -41,23 +41,28 @@ import Parse import ParseUI import Alamofire import SnapKit +import SVProgressHUD +import Spring let messageFontSize: CGFloat = 17 let sentDateFontSize:CGFloat = 10 let toolBarMinHeight: CGFloat = 44 let textViewMaxHeight: (portrait: CGFloat, landscape: CGFloat) = (portrait: 272, landscape: 90) -class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewControllerDelegate { +class ChatViewController:UIViewController,UITextViewDelegate,SFSafariViewControllerDelegate { //MARK:属性定义 - + var tableView:UITableView! var toolBar: UIToolbar! var textView: UITextView! var sendButton: UIButton! + var backGroundImage:UIImageView! var rotating = false var continuedActivity: NSUserActivity? - var response:String? - var messages:[Message] = [] + var isFirstEnter = true + var howMany7DaysBefore:Double = 1 + + var messageObjects:[PFObject] = [] //[[Message(incoming: true, text: "你好,请叫我灵灵,我是主人的贴身小助手!", sentDate: NSDate())]] override var inputAccessoryView: UIView! { get { @@ -112,13 +117,9 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo } //MARK:生命周期管理 func initData(howMany7DaysBefore:Double){ - print("initData") - + var index = 0 - var currentDate:NSDate? - - let query:PFQuery = PFQuery(className:"Messages") if let user = PFUser.currentUser(){ query.whereKey("createdBy", equalTo: user) @@ -129,36 +130,38 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo } query.orderByAscending("sentDate") - //query.cachePolicy = PFCachePolicy.CacheThenNetwork - + //query.fromLocalDatastore() + + //query.cachePolicy = PFCachePolicy.CacheElseNetwork + query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in if error == nil { - - - if objects!.count > 0 { - for object in objects as! [PFObject] { - + if howMany7DaysBefore <= 1{ + + self.messageObjects = objects as! [PFObject] + }else{ + self.messageObjects.insertContentsOf(objects as! [PFObject], at: 0) + + } + if objects?.count == 0 && howMany7DaysBefore == 1{//如果是第一次登陆 + let message = Message(messageType:messageType.text.rawValue , incoming: true, text: "\(PFUser.currentUser()!.username!),你好!我是你的私人小助手,请叫我灵灵!",contents:"\(PFUser.currentUser()!.username!),你好!我是你的私人小助手,请叫我灵灵!".dataUsingEncoding(NSUTF8StringEncoding)!, sentDate: NSDate()) + self.saveMessage(message) + - let message = Message(incoming: object["incoming"] as! Bool, text: object["text"] as! String, sentDate: object["sentDate"] as! NSDate) - if let url = object["url"] as? String{ - message.url = url - - } - self.messages.append(message) - dispatch_async(dispatch_get_main_queue(), { () -> Void in - - self.tableView.reloadData() - - }) - - - currentDate = message.sentDate - index++ - - } } + if howMany7DaysBefore == 0{ + self.tableView.reloadDataWithAnimate(AnimationDirect.FromRightToLeft, animationTime: 1.0, interval: 0.1) + }else{ + self.tableView.reloadData() + } + SVProgressHUD.dismiss() + + + if let header = self.tableView.header{ + header.endRefreshing() + } }else{ print("Error \(error?.userInfo)") } @@ -166,28 +169,41 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo - - } override func viewDidLoad() { + super.viewDidLoad() - - self.initData(1) - + + + self.initData(howMany7DaysBefore) + // tableView.autoresizingMask = UIViewAutoresizing.FlexibleWidth + backGroundImage = UIImageView(image: UIImage(named: "loginBackground")) + + self.tableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.Plain) + self.view.addSubview(self.tableView) + + self.tableView.delegate = self + self.tableView.dataSource = self + self.tableView.backgroundView = backGroundImage + insertBlurView(self.tableView.backgroundView!, style: UIBlurEffectStyle.Light) + tableView.autoresizingMask = UIViewAutoresizing.FlexibleHeight self.tableView.keyboardDismissMode = .Interactive self.tableView.estimatedRowHeight = 44 - self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom:toolBarMinHeight, right: 0) + self.tableView.contentInset = UIEdgeInsets(top:0, left: 0, bottom:toolBarMinHeight, right: 0) self.tableView.separatorStyle = .None - - + let refreshHeader = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction:"refreshTriggered:") + refreshHeader.ignoredScrollViewContentInsetTop = 18 + refreshHeader.lastUpdatedTimeLabel?.hidden = true + refreshHeader.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.White + tableView.header = refreshHeader - self.navigationController?.navigationBarHidden = false + self.navigationItem.setLeftBarButtonItem(itemWithImage("exit", highlightImage: "exit_highlight", target: self, action:"exitButtonTapped:"), animated: true) self.navigationItem.setRightBarButtonItem(itemWithImage("setting", highlightImage: "setting_highlight", target: self, action:"settingButtonTapped:"), animated: true) title = "灵灵" @@ -199,7 +215,8 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) notificationCenter.addObserver(self, selector: "keyboardDidShow:", name: UIKeyboardDidShowNotification, object: nil) - + //self.myrefreshControl = CBStoreHouseRefreshControl() + // Do any additional setup after loading the view. @@ -222,15 +239,29 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - + override func viewWillAppear(animated: Bool) { self.view.backgroundColor = UIColor.whiteColor() + if isFirstEnter { + SVProgressHUD.setDefaultMaskType(SVProgressHUDMaskType.Black) + SVProgressHUD.showWithStatus("加载聊天记录...") + } + + isFirstEnter = false + + } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) +// TRChatRequestManager.sharedManager.requestMessage("今天北京到天津的火车", handler: { (type, message) -> Void in +// +// print(type) +// print((message as! trainMessage).trains) +// +// }) tableView.flashScrollIndicators() - - + self.navigationController?.navigationBarHidden = false + } //MARK:textView代理方法 @@ -238,114 +269,94 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo updateTextViewHeight() sendButton.enabled = textView.hasText() } - //MARK:tableView代理方法 + - override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { - return true - } - override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { - if editingStyle == UITableViewCellEditingStyle.Delete{ - - messages.removeAtIndex(indexPath.row) - tableView.reloadData() - - } - } - override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { - guard let selectedCell = tableView.cellForRowAtIndexPath(indexPath) as? MessageBubbleTableViewCell else{ - return nil - } - - guard selectedCell.url != "" else{ - return nil - } - if #available(iOS 9.0, *) { - let webVC = SFSafariViewController(URL: NSURL(string:selectedCell.url)!, entersReaderIfAvailable: true) - webVC.delegate = self - self.presentViewController(webVC, animated: true, completion: nil) - } else { - let webVC = WebViewController(url: selectedCell.url) - self.presentViewController(webVC, animated: true, completion: nil) - - } - - return nil - } - @available(iOS 9.0, *) + @available(iOS 9.0, *) func safariViewControllerDidFinish(controller: SFSafariViewController) { controller.dismissViewControllerAnimated(true, completion: nil) } - - override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - - let cellIdentifier = NSStringFromClass(MessageBubbleTableViewCell) - var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MessageBubbleTableViewCell! - if cell == nil { - - cell = MessageBubbleTableViewCell(style: .Default, reuseIdentifier: cellIdentifier) - - } - - let message = messages[indexPath.row] - cell.configureWithMessage(message) - - return cell - - - } - - - override func numberOfSectionsInTableView(tableView: UITableView) -> Int { - - return 1 - - } - override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - - if messages.count > 0{ - return messages.count - }else{ - return 0 - } - } + var currentCellDate:NSDate! //MARK:发送操作及帮助方法 func saveMessage(message:Message){ + let saveObject = PFObject(className: "Messages") saveObject["incoming"] = message.incoming saveObject["text"] = message.text saveObject["sentDate"] = message.sentDate saveObject["url"] = message.url - + saveObject["messageType"] = message.messageType + let file = PFFile(data: message.contents) let user = PFUser.currentUser() saveObject["createdBy"] = user - saveObject.saveEventually { (success, error) -> Void in + saveObject["contents"] = file + + + + + + + + messageObjects.append(saveObject) + saveObject.pinInBackgroundWithBlock { (success, error) -> Void in + if success{ + print("消息本地保存成功!") + }else{ + + print("消息本地保存失败! \(error)") + + } + } + saveObject.saveInBackgroundWithBlock { (success, error) -> Void in if success{ - print("消息保存成功!") + print("消息云端保存成功!") }else{ - print("消息保存失败! \(error)") + print("消息云端保存失败! \(error)") } } + } - func deleteMessage(message:Message){ - + func deleteMessage(message:PFObject){ + message.unpinInBackgroundWithBlock { (success, error) -> Void in + guard error == nil else{ + print("本地删除失败! \(error?.userInfo)") + return + + } + print("本地删除成功!") + + } +message.deleteInBackgroundWithBlock { (success, error) -> Void in + guard error == nil else{ + print("云端删除失败! \(error?.userInfo)") + return + + } + print("云端删除成功!") + } } + func sendAction() { var question = "" var answer = "" + + + question = textView.text! + let data = question.dataUsingEncoding(NSUTF8StringEncoding)! - let message = Message(incoming: false, text: textView.text, sentDate: NSDate()) + let message = Message(messageType:messageType.text.rawValue , incoming: false, text:question,contents:data,sentDate: NSDate()) + self.createUserActivity(messageObjects.count - 1, text:question, url: "") saveMessage(message) - messages.append(message) + - question = textView.text + textView.text = nil @@ -357,53 +368,80 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo ], withRowAnimation: .Left) self.tableView.endUpdates() self.tableViewScrollToBottomAnimated(false) - - Alamofire.request(.GET, NSURL(string: api_url)!, parameters: ["key":api_key,"info":question,"userid":PFUser.currentUser()!.objectId! as String]).responseJSON(options: NSJSONReadingOptions.MutableContainers) { _,_,data in + TRChatRequestManager.sharedManager.requestMessage(question) { (type, message) -> Void in + switch (type){ + case .text: + let answer = (message as! textMessage).answer as String + let messageToSave = Message(messageType:messageType.text.rawValue, incoming: true, text:answer ,contents:answer.dataUsingEncoding(NSUTF8StringEncoding)!, sentDate: NSDate()) + self.saveMessage(messageToSave) + self.createUserActivity(self.messageObjects.count - 1 ,text:answer, url:"") - guard data.isSuccess else{ - print("Data read error \(data.error)") - return - } + break + case .link: + + let answer = (message as! linkMessage).answer as String + let url = (message as! linkMessage).url as String + let urlData = url.dataUsingEncoding(NSUTF8StringEncoding) + + let messageToSave = Message(messageType: messageType.link.rawValue,incoming: true, text:answer ,contents:urlData!, sentDate: NSDate()) + + + + self.saveMessage(messageToSave) + self.createUserActivity(self.messageObjects.count - 1 ,text:answer, url:url) + + break + case .trains: + let answer = (message as! trainMessage).answer + let contents = (message as! trainMessage).trains as! AnyObject + + let messageToSave = Message(messageType: messageType.trains.rawValue, incoming: true, text: answer,contents:archiveObject(contents), sentDate: NSDate()) + //let messageContents = NSKeyedUnarchiver.unarchiveObjectWithData(messageToSave.contents) as! [trainsType] + + self.saveMessage(messageToSave) + self.createUserActivity(self.messageObjects.count - 1 ,text:answer, url:"") + + + break + case .news: + let answer = (message as! newsMessage).answer + let contents = (message as! newsMessage).news as! AnyObject + let messageToSave = Message(messageType: messageType.news.rawValue, incoming: true, text: answer,contents:archiveObject(contents), sentDate: NSDate()) + self.saveMessage(messageToSave) + print(messageToSave) + self.createUserActivity(self.messageObjects.count - 1 ,text:answer, url:"") + break + case .recipes: + let answer = (message as! newsMessage).answer + let contents = (message as! newsMessage).news as! AnyObject + let messageToSave = Message(messageType: messageType.news.rawValue, incoming: true, text: answer,contents:archiveObject(contents), sentDate: NSDate()) + self.saveMessage(messageToSave) + self.createUserActivity(self.messageObjects.count - 1 ,text:answer, url:"") + + break + default: break - guard let text = data.value!.objectForKey("text") as? String else{ - print("Text is nil!") - return - } - answer = text - if let url = data.value!.objectForKey("url") as? String { - let message = Message(incoming: true, - text:text+"\n(点击该消息打开查看)", - sentDate: NSDate()) - message.url = url - self.saveMessage(message) - self.messages.append(message) - self.createUserActivity(self.messages.count - 1, question: question, answer:answer, url: url) - - }else{ - - let message = Message(incoming: true, text:text, sentDate: NSDate()) - self.saveMessage(message) - self.messages.append(message) - self.createUserActivity(self.messages.count - 1 , question: question, answer:answer, url:"") - - } - self.tableView.beginUpdates() - self.tableView.insertRowsAtIndexPaths([ - NSIndexPath(forRow:self.tableView.numberOfRowsInSection(0) , inSection:0) - ], withRowAnimation:.Left) - self.tableView.endUpdates() - self.tableViewScrollToBottomAnimated(false) } + self.tableView.beginUpdates() + self.tableView.insertRowsAtIndexPaths([ + NSIndexPath(forRow:self.tableView.numberOfRowsInSection(0) , inSection:0) + ], withRowAnimation:.Left) + self.tableView.endUpdates() + self.tableViewScrollToBottomAnimated(false) + } + + } - func createUserActivity(index:Int,question:String,answer:String,url:String){ + + func createUserActivity(index:Int,text:String,url:String){ let myActivity = NSUserActivity(activityType: "com.codeGlider.TuringChatMachine.chat")//1 - myActivity.title = "Q:\(question)\nA:\(answer)" // 2 + myActivity.title = "\(text)" // 2 myActivity.eligibleForSearch = true // 4 - myActivity.keywords = Set(arrayLiteral:question,answer) // 5 + myActivity.keywords = Set(arrayLiteral:text) // 5 self.userActivity = myActivity // 6 if url != ""{ self.userActivity?.userInfo = ["index":index] @@ -501,6 +539,7 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo func itemWithImage(image:String,highlightImage:String,target:AnyObject,action:Selector)->UIBarButtonItem { + let button = UIButton(type: UIButtonType.Custom) button.setBackgroundImage(UIImage(named: image), forState: UIControlState.Normal) button.setBackgroundImage(UIImage(named: highlightImage), forState: UIControlState.Highlighted) @@ -510,6 +549,14 @@ class ChatViewController:UITableViewController,UITextViewDelegate,SFSafariViewCo button.addTarget(target, action: action, forControlEvents: UIControlEvents.TouchUpInside) return UIBarButtonItem(customView: button) + } + + func refreshTriggered(sender:AnyObject){ + + self.initData(++howMany7DaysBefore) + + + } // MARK: - Navigation @@ -529,4 +576,115 @@ class InputTextView: UITextView { +} + //MARK:tableView代理方法 +extension ChatViewController:UITableViewDataSource,UITableViewDelegate{ + func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { + return true + } + func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { + if editingStyle == UITableViewCellEditingStyle.Delete{ + deleteMessage(messageObjects[indexPath.row]) + messageObjects.removeAtIndex(indexPath.row) + + tableView.reloadData() + + } + } + + func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? { + print("Selected At row \(indexPath.row)") + guard let selectedCell = tableView.cellForRowAtIndexPath(indexPath) as? MessageBubbleTableViewCell else{ + + return nil + } + print("\(selectedCell.url)") + let url = selectedCell.url + + guard url != "" else{ + return nil + } + + print(selectedCell.url) + let webVC = SFSafariViewController(URL: NSURL(string: url)!, entersReaderIfAvailable: true) + webVC.delegate = self + self.presentViewController(webVC, animated: true, completion: nil) + + + + return nil + } + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + + var showSentDate = false + let object = messageObjects[indexPath.row] + + let message = Message(messageType:object["messageType"] as! String, incoming:object["incoming"] as! Bool, text: object["text"] as! String,contents:(object["contents"] as! PFFile).getData()!, sentDate: object["sentDate"] as! NSDate) + if indexPath.row == 0{ + currentCellDate = message.sentDate + showSentDate = true + } + let timeInterval = currentCellDate.timeIntervalSinceDate(message.sentDate) + print(abs(timeInterval)) + + if abs(timeInterval) > 60*3{ + showSentDate = true + } + let cellIdentifier:String + + + if message.messageType == messageType.text.rawValue || message.messageType == messageType.link.rawValue{ + cellIdentifier = NSStringFromClass(MessageBubbleTableViewCell) + + var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MessageBubbleTableViewCell! + if cell == nil { + + cell = MessageBubbleTableViewCell(style: .Default, reuseIdentifier: cellIdentifier) + + } + cell.configureWithMessage(message,showSentDate:showSentDate) + currentCellDate = message.sentDate + cell.backgroundColor = UIColor.clearColor() + return cell + + }else{ + + cellIdentifier = NSStringFromClass(MutiMessageTableViewCell) + + var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! MutiMessageTableViewCell! + if cell == nil { + + cell = MutiMessageTableViewCell(style: .Default, reuseIdentifier: cellIdentifier) + + } + cell.configureWithMutiMessage(message,showSentDate:showSentDate) + currentCellDate = message.sentDate + cell.backgroundColor = UIColor.clearColor() + return cell + + } + + + + } + + + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + + return 1 + + } + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + + if messageObjects.count > 0{ + return messageObjects.count + }else{ + return 0 + } + } + + + } diff --git a/TuringChatMachine/Extension&util.swift b/TuringChatMachine/Extension&util.swift new file mode 100644 index 0000000..a5deac0 --- /dev/null +++ b/TuringChatMachine/Extension&util.swift @@ -0,0 +1,77 @@ +// +// Extension.swift +// ParseDemo +// +// Created by codeGlider on 15/9/19. +// Copyright © 2015年 abearablecode. All rights reserved. +// + +import UIKit +import SnapKit + +extension String{ + func getLength()->Int{ + return (self as NSString).length + + } + +} + +extension UITextField{ + + func addTextFieldLeftView(withImageName:String,withLeftPandding:CGFloat,andRightPandding:CGFloat){ + let panddingInset = UIEdgeInsets(top: 0, left:withLeftPandding, bottom: 0, right:andRightPandding) + let userLeftView = UIImageView(image: UIImage(named:withImageName)!) + userLeftView.contentMode = .ScaleAspectFit + let sidePanddingView = UIView(frame: CGRect(x: 0, y: 0, width:userLeftView.frame.width + panddingInset.left + panddingInset.right, height: userLeftView.frame.height)) + sidePanddingView.backgroundColor = UIColor.clearColor() + sidePanddingView.addSubview(userLeftView) + userLeftView.snp_makeConstraints { (make) -> Void in + make.left.equalTo(sidePanddingView.snp_left).offset(panddingInset.left) + make.right.equalTo(sidePanddingView.snp_right).offset(-panddingInset.right) + make.centerY.equalTo(sidePanddingView.snp_centerY) + } + + self.leftView = sidePanddingView + self.leftViewMode = .Always + + + } +} +//MARK:数据打包、解包 +func archiveObject(object:AnyObject)->NSData{ + + return NSKeyedArchiver.archivedDataWithRootObject(object) + +} +func unarchiveObject(data:NSData)->AnyObject{ + + let coder = NSCoder() + return NSKeyedUnarchiver.unarchiveObjectWithData(data)! + +} +func formatDate(date: NSDate) -> String { + let calendar = NSCalendar.currentCalendar() + let dateFormatter = NSDateFormatter() + dateFormatter.locale = NSLocale(localeIdentifier: "zh_CN") + + let last18hours = (-18*60*60 < date.timeIntervalSinceNow) + let isToday = calendar.isDateInToday(date) + let isYesteday = calendar.isDateInYesterday(date) + let isLast7Days = (calendar.compareDate(NSDate(timeIntervalSinceNow: -7*24*60*60), toDate: date, toUnitGranularity: NSCalendarUnit.NSDayCalendarUnit) == NSComparisonResult.OrderedAscending) + + + if last18hours || isToday { + dateFormatter.dateFormat = "a HH:mm" + }else if isYesteday{ + dateFormatter.dateFormat = "昨天 a HH:mm" + } + else if isLast7Days { + dateFormatter.dateFormat = "EEEE a HH:mm" + } else { + dateFormatter.dateFormat = "YYYY年MM月dd日 a HH:mm" + + } + return dateFormatter.stringFromDate(date) +} + \ No newline at end of file diff --git a/TuringChatMachine/Extension.swift b/TuringChatMachine/Extension.swift deleted file mode 100644 index fd9aef7..0000000 --- a/TuringChatMachine/Extension.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// Extension.swift -// ParseDemo -// -// Created by codeGlider on 15/9/19. -// Copyright © 2015年 abearablecode. All rights reserved. -// - -import UIKit - -extension String{ - func getLength()->Int{ - return (self as NSString).length - - } - -} - -func formatDate(date: NSDate) -> String { - let calendar = NSCalendar.currentCalendar() - let dateFormatter = NSDateFormatter() - dateFormatter.locale = NSLocale(localeIdentifier: "zh_CN") - - let last18hours = (-18*60*60 < date.timeIntervalSinceNow) - let isToday = calendar.isDateInToday(date) - let isLast7Days = (calendar.compareDate(NSDate(timeIntervalSinceNow: -7*24*60*60), toDate: date, toUnitGranularity: NSCalendarUnit.NSDayCalendarUnit) == NSComparisonResult.OrderedAscending) - - - if last18hours || isToday { - dateFormatter.dateFormat = "a HH:mm" - } else if isLast7Days { - dateFormatter.dateFormat = "MM月dd日 a HH:mm EEEE" - } else { - dateFormatter.dateFormat = "YYYY年MM月dd日 a HH:mm" - - } - return dateFormatter.stringFromDate(date) -} - \ No newline at end of file diff --git a/TuringChatMachine/FadeInTransitionAnimator.swift b/TuringChatMachine/FadeInTransitionAnimator.swift index 9164825..5004790 100644 --- a/TuringChatMachine/FadeInTransitionAnimator.swift +++ b/TuringChatMachine/FadeInTransitionAnimator.swift @@ -9,9 +9,9 @@ import UIKit class FadeInTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning { - let animationDuration:Double = 1.0 + let animationDuration:Double = 0.5 weak var transitionContext: UIViewControllerContextTransitioning? - + var operation:UINavigationControllerOperation = .Push func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return animationDuration; @@ -19,30 +19,69 @@ class FadeInTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning func animateTransition(transitionContext: UIViewControllerContextTransitioning) { self.transitionContext = transitionContext - + if operation == .Push{ let containerView = transitionContext.containerView() - let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) as! HomeViewController - let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) as! ChatViewController - toViewController.view.alpha = 0.0 - toViewController.navigationController?.navigationBarHidden = true - print("Animating...") - containerView!.addSubview(toViewController.view) + let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) + let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) + + + toViewController!.view.alpha = 0.0 + //toViewController!.navigationController?.navigationBarHidden = false + containerView!.addSubview(toViewController!.view) + UIView.animateWithDuration(animationDuration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in - fromViewController.view.alpha = 0.2 - fromViewController.panle.transform = CGAffineTransformMakeScale(1.5, 1.5) - toViewController.view.alpha = 1.0 - toViewController.navigationController?.setNavigationBarHidden(false, animated: true) + fromViewController!.view.alpha = 0.0 + fromViewController!.view.transform = CGAffineTransformMakeScale(2.0,2.0) + toViewController!.view.alpha = 1.0 + if let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) as? ChatViewController{ + toViewController.navigationController?.setNavigationBarHidden(false, animated:false) + toViewController.navigationController?.navigationBar.tintColor = UIColor(red:0.35, green:0.78, blue:0.92, alpha:1) + + } + }, completion:{ (finish) -> Void in + transitionContext.completeTransition(true) + fromViewController!.view.alpha = 1.0 + fromViewController!.view.transform = CGAffineTransformIdentity }) + }else{ + let containerView = transitionContext.containerView() + let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) + let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) + + + toViewController!.view.alpha = 0.0 + + containerView!.addSubview(toViewController!.view) + + UIView.animateWithDuration(animationDuration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in + + fromViewController!.view.alpha = 0.0 + fromViewController!.view.transform = CGAffineTransformMakeScale(0,0) + toViewController!.view.alpha = 1.0 + toViewController!.navigationController?.setNavigationBarHidden(true, animated:false) + }, completion:{ (finish) -> Void in + + transitionContext.completeTransition(true) + fromViewController!.view.alpha = 1.0 + //fromViewController!.view.transform = CGAffineTransformIdentity + + }) + + } } - override func animationDidStop(anim: CAAnimation!, finished flag: Bool) { + override func animationDidStop(anim: CAAnimation!,finished flag: Bool) { + + if let context = transitionContext { self.transitionContext?.completeTransition(!self.transitionContext!.transitionWasCancelled()) - + + } + transitionContext = nil } } diff --git a/TuringChatMachine/HomeViewController.swift b/TuringChatMachine/HomeViewController.swift index 1612abf..d828f27 100644 --- a/TuringChatMachine/HomeViewController.swift +++ b/TuringChatMachine/HomeViewController.swift @@ -9,6 +9,7 @@ import UIKit import Parse import Spring + func delay(seconds seconds: Double, completion:()->()) { let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64( Double(NSEC_PER_SEC) * seconds )) @@ -17,20 +18,27 @@ func delay(seconds seconds: Double, completion:()->()) { } } class HomeViewController: UIViewController { - + + @IBOutlet weak var AvatarImage: SpringImageView! @IBOutlet weak var panle: SpringView! - @IBOutlet weak var logInStatus: UIButton! + @IBOutlet weak var logInStatus: UILabel! @IBOutlet weak var usernameLabel: UILabel! let transition = FadeInTransitionAnimator() override func viewWillAppear(animated: Bool) { - - self.navigationController?.navigationBarHidden = true + homePanleShowAnimation() + avatarImageShowAnimation() + if (PFUser.currentUser() == nil) { + + logInStatus.text = "未登录" + + usernameLabel.text = "无用户" dispatch_async(dispatch_get_main_queue(), { () -> Void in delay(seconds: 1.5, completion: { () -> () in let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("Login") //viewController.view.backgroundColor = UIColor.whiteColor() + self.navigationController?.view.backgroundColor = UIColor.whiteColor() self.navigationController?.pushViewController(viewController, animated: true) //self.presentViewController(viewController, animated: true, completion: nil) @@ -44,66 +52,78 @@ class HomeViewController: UIViewController { self.view.addSubview(spinner) spinner.startAnimating() + logInStatus.text = "登陆中" + if let name = PFUser.currentUser()?.username{ - self.usernameLabel.text = "@" + name + self.usernameLabel.text = "@" + name + } delay(seconds: 1.5, completion: { () -> () in let ChatVC = ChatViewController() - - spinner.stopAnimating() + self.logInStatus.text = "登陆成功" + spinner.stopAnimating() self.navigationController?.pushViewController(ChatVC, animated: true) //self.presentViewController(naviVC, animated:true, completion: nil) }) - + } } - - @IBAction func logOutAction(sender: UIButton) { - PFUser.logOut() - dispatch_async(dispatch_get_main_queue(), { () -> Void in - let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("Login") - self.presentViewController(viewController, animated: true, completion: nil) - }) + func homePanleShowAnimation(){ + if (PFUser.currentUser() == nil) { + logInStatus.enabled = false + usernameLabel.text = "无用户" + } + panle.animation = "fadeInUp" + panle.autostart = false + panle.curve = "easeOut" + panle.duration = 1.0 + panle.damping = 0.6 + panle.velocity = 0.0 + panle.force = 1.0 + panle.animate() } + func avatarImageShowAnimation(){ + + AvatarImage.animation = "zoomIn" + AvatarImage.autostart = false + AvatarImage.curve = "easeOut" + AvatarImage.duration = 1.0 + AvatarImage.velocity = 0.0 + AvatarImage.damping = 0.6 + AvatarImage.force = 1.0 + AvatarImage.animate() + } + override func viewDidLoad() { + insertBlurView(self.panle, style: UIBlurEffectStyle.Light) + + + self.navigationController?.navigationBar.tintColor = UIColor(red:0.35, green:0.78, blue:0.92, alpha:1) super.viewDidLoad() - + self.navigationController?.navigationBarHidden = true // Do any additional setup after loading the view. } override func viewDidAppear(animated: Bool) { navigationController?.delegate = self - } + } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - */ - + } extension HomeViewController:UINavigationControllerDelegate{ func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? { - if var _ = toVC as? ChatViewController{ - transition.operation = operation - + + transition.operation = operation + return transition - } - else{ - return nil - } + } diff --git a/TuringChatMachine/Images.xcassets/.DS_Store b/TuringChatMachine/Images.xcassets/.DS_Store index 449a38b..b6fcb8e 100644 Binary files a/TuringChatMachine/Images.xcassets/.DS_Store and b/TuringChatMachine/Images.xcassets/.DS_Store differ diff --git a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png index 5891b96..52e1da2 100644 Binary files a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png and b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@2x.png differ diff --git a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png index 963ba94..49fae02 100644 Binary files a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png and b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-29@3x.png differ diff --git a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png index 7c2536f..797806e 100644 Binary files a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png and b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@2x.png differ diff --git a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png index 26c381d..2d85a05 100644 Binary files a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png and b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-40@3x.png differ diff --git a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png index 26c381d..2d85a05 100644 Binary files a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png and b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png differ diff --git a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png index 85c5ed9..17619f1 100644 Binary files a/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png and b/TuringChatMachine/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png differ diff --git a/TuringChatMachine/Images.xcassets/email.imageset/C4093886-4EB5-4BA5-B3FD-0CC50839B407-1.png b/TuringChatMachine/Images.xcassets/email.imageset/C4093886-4EB5-4BA5-B3FD-0CC50839B407-1.png new file mode 100644 index 0000000..7616d62 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/email.imageset/C4093886-4EB5-4BA5-B3FD-0CC50839B407-1.png differ diff --git a/TuringChatMachine/Images.xcassets/email.imageset/C4093886-4EB5-4BA5-B3FD-0CC50839B407.png b/TuringChatMachine/Images.xcassets/email.imageset/C4093886-4EB5-4BA5-B3FD-0CC50839B407.png new file mode 100644 index 0000000..d4449e9 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/email.imageset/C4093886-4EB5-4BA5-B3FD-0CC50839B407.png differ diff --git a/TuringChatMachine/Images.xcassets/email.imageset/Contents.json b/TuringChatMachine/Images.xcassets/email.imageset/Contents.json new file mode 100644 index 0000000..2a813d6 --- /dev/null +++ b/TuringChatMachine/Images.xcassets/email.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "C4093886-4EB5-4BA5-B3FD-0CC50839B407.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "C4093886-4EB5-4BA5-B3FD-0CC50839B407-1.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TuringChatMachine/Images.xcassets/exit.imageset/Contents.json b/TuringChatMachine/Images.xcassets/exit.imageset/Contents.json index 6edd79a..8f8fadf 100644 --- a/TuringChatMachine/Images.xcassets/exit.imageset/Contents.json +++ b/TuringChatMachine/Images.xcassets/exit.imageset/Contents.json @@ -6,12 +6,12 @@ }, { "idiom" : "universal", - "filename" : "ic_exit_to_app_white_36pt_2x.png", + "filename" : "Oval 5 + Rectangle 1.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "ic_exit_to_app_white_36pt_3x.png", + "filename" : "Oval 5 + Rectangle 1-1.png", "scale" : "3x" } ], diff --git a/TuringChatMachine/Images.xcassets/exit.imageset/Oval 5 + Rectangle 1-1.png b/TuringChatMachine/Images.xcassets/exit.imageset/Oval 5 + Rectangle 1-1.png new file mode 100644 index 0000000..a1d9846 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/exit.imageset/Oval 5 + Rectangle 1-1.png differ diff --git a/TuringChatMachine/Images.xcassets/exit.imageset/Oval 5 + Rectangle 1.png b/TuringChatMachine/Images.xcassets/exit.imageset/Oval 5 + Rectangle 1.png new file mode 100644 index 0000000..a943c85 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/exit.imageset/Oval 5 + Rectangle 1.png differ diff --git a/TuringChatMachine/Images.xcassets/exit.imageset/ic_exit_to_app_white_36pt_2x.png b/TuringChatMachine/Images.xcassets/exit.imageset/ic_exit_to_app_white_36pt_2x.png deleted file mode 100644 index c04fe6e..0000000 Binary files a/TuringChatMachine/Images.xcassets/exit.imageset/ic_exit_to_app_white_36pt_2x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/exit.imageset/ic_exit_to_app_white_36pt_3x.png b/TuringChatMachine/Images.xcassets/exit.imageset/ic_exit_to_app_white_36pt_3x.png deleted file mode 100644 index f85cb22..0000000 Binary files a/TuringChatMachine/Images.xcassets/exit.imageset/ic_exit_to_app_white_36pt_3x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Contents.json b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Contents.json index 3e16429..80805a9 100644 --- a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Contents.json +++ b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Contents.json @@ -6,12 +6,12 @@ }, { "idiom" : "universal", - "filename" : "ic_exit_to_app_36pt_2x.png", + "filename" : "Oval 5 + Rectangle 3.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "ic_exit_to_app_36pt_3x.png", + "filename" : "Oval 5 + Rectangle 3-1.png", "scale" : "3x" } ], diff --git a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Oval 5 + Rectangle 3-1.png b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Oval 5 + Rectangle 3-1.png new file mode 100644 index 0000000..d0023b2 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Oval 5 + Rectangle 3-1.png differ diff --git a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Oval 5 + Rectangle 3.png b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Oval 5 + Rectangle 3.png new file mode 100644 index 0000000..0281885 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/Oval 5 + Rectangle 3.png differ diff --git a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/ic_exit_to_app_36pt_2x.png b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/ic_exit_to_app_36pt_2x.png deleted file mode 100644 index 53b79d4..0000000 Binary files a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/ic_exit_to_app_36pt_2x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/ic_exit_to_app_36pt_3x.png b/TuringChatMachine/Images.xcassets/exit_highlight.imageset/ic_exit_to_app_36pt_3x.png deleted file mode 100644 index 8fbf19c..0000000 Binary files a/TuringChatMachine/Images.xcassets/exit_highlight.imageset/ic_exit_to_app_36pt_3x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/loginBackground.imageset/Contents.json b/TuringChatMachine/Images.xcassets/loginBackground.imageset/Contents.json new file mode 100644 index 0000000..a06abc8 --- /dev/null +++ b/TuringChatMachine/Images.xcassets/loginBackground.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Mask.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Mask-1.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TuringChatMachine/Images.xcassets/loginBackground.imageset/Mask-1.png b/TuringChatMachine/Images.xcassets/loginBackground.imageset/Mask-1.png new file mode 100644 index 0000000..6c65008 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/loginBackground.imageset/Mask-1.png differ diff --git a/TuringChatMachine/Images.xcassets/loginBackground.imageset/Mask.png b/TuringChatMachine/Images.xcassets/loginBackground.imageset/Mask.png new file mode 100644 index 0000000..e7ef599 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/loginBackground.imageset/Mask.png differ diff --git a/TuringChatMachine/Images.xcassets/robot_dark.imageset/1442927384_c3po-1.png b/TuringChatMachine/Images.xcassets/robot_dark.imageset/1442927384_c3po-1.png new file mode 100644 index 0000000..9a629d2 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/robot_dark.imageset/1442927384_c3po-1.png differ diff --git a/TuringChatMachine/Images.xcassets/robot_dark.imageset/1442927384_c3po.png b/TuringChatMachine/Images.xcassets/robot_dark.imageset/1442927384_c3po.png new file mode 100644 index 0000000..a27a908 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/robot_dark.imageset/1442927384_c3po.png differ diff --git a/TuringChatMachine/Images.xcassets/robot_dark.imageset/Contents.json b/TuringChatMachine/Images.xcassets/robot_dark.imageset/Contents.json new file mode 100644 index 0000000..cff4ab2 --- /dev/null +++ b/TuringChatMachine/Images.xcassets/robot_dark.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "1442927384_c3po.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "1442927384_c3po-1.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TuringChatMachine/Images.xcassets/setting.imageset/Contents.json b/TuringChatMachine/Images.xcassets/setting.imageset/Contents.json index e35b6cc..8ce3f48 100644 --- a/TuringChatMachine/Images.xcassets/setting.imageset/Contents.json +++ b/TuringChatMachine/Images.xcassets/setting.imageset/Contents.json @@ -6,12 +6,12 @@ }, { "idiom" : "universal", - "filename" : "ic_settings_3x-1.png", + "filename" : "Oval 4 + Oval 5.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "ic_settings_3x.png", + "filename" : "Oval 4 + Oval 5-1.png", "scale" : "3x" } ], diff --git a/TuringChatMachine/Images.xcassets/setting.imageset/Oval 4 + Oval 5-1.png b/TuringChatMachine/Images.xcassets/setting.imageset/Oval 4 + Oval 5-1.png new file mode 100644 index 0000000..c8ab3fb Binary files /dev/null and b/TuringChatMachine/Images.xcassets/setting.imageset/Oval 4 + Oval 5-1.png differ diff --git a/TuringChatMachine/Images.xcassets/setting.imageset/Oval 4 + Oval 5.png b/TuringChatMachine/Images.xcassets/setting.imageset/Oval 4 + Oval 5.png new file mode 100644 index 0000000..4342e3f Binary files /dev/null and b/TuringChatMachine/Images.xcassets/setting.imageset/Oval 4 + Oval 5.png differ diff --git a/TuringChatMachine/Images.xcassets/setting.imageset/ic_settings_3x-1.png b/TuringChatMachine/Images.xcassets/setting.imageset/ic_settings_3x-1.png deleted file mode 100644 index 0591ff8..0000000 Binary files a/TuringChatMachine/Images.xcassets/setting.imageset/ic_settings_3x-1.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/setting.imageset/ic_settings_3x.png b/TuringChatMachine/Images.xcassets/setting.imageset/ic_settings_3x.png deleted file mode 100644 index f7d1d52..0000000 Binary files a/TuringChatMachine/Images.xcassets/setting.imageset/ic_settings_3x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Contents.json b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Contents.json index eaccfc7..8ce3f48 100644 --- a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Contents.json +++ b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Contents.json @@ -6,12 +6,12 @@ }, { "idiom" : "universal", - "filename" : "ic_settings_2x.png", + "filename" : "Oval 4 + Oval 5.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "ic_settings_3x.png", + "filename" : "Oval 4 + Oval 5-1.png", "scale" : "3x" } ], diff --git a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Oval 4 + Oval 5-1.png b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Oval 4 + Oval 5-1.png new file mode 100644 index 0000000..44a170b Binary files /dev/null and b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Oval 4 + Oval 5-1.png differ diff --git a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Oval 4 + Oval 5.png b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Oval 4 + Oval 5.png new file mode 100644 index 0000000..ea7d6f4 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/Oval 4 + Oval 5.png differ diff --git a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/ic_settings_2x.png b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/ic_settings_2x.png deleted file mode 100644 index e84e188..0000000 Binary files a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/ic_settings_2x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/ic_settings_3x.png b/TuringChatMachine/Images.xcassets/setting_highlight.imageset/ic_settings_3x.png deleted file mode 100644 index 3023ff8..0000000 Binary files a/TuringChatMachine/Images.xcassets/setting_highlight.imageset/ic_settings_3x.png and /dev/null differ diff --git a/TuringChatMachine/Images.xcassets/username.imageset/6915526F-DBD7-448E-BAB2-4B1B046F44FB-1.png b/TuringChatMachine/Images.xcassets/username.imageset/6915526F-DBD7-448E-BAB2-4B1B046F44FB-1.png new file mode 100644 index 0000000..3f63c2c Binary files /dev/null and b/TuringChatMachine/Images.xcassets/username.imageset/6915526F-DBD7-448E-BAB2-4B1B046F44FB-1.png differ diff --git a/TuringChatMachine/Images.xcassets/username.imageset/6915526F-DBD7-448E-BAB2-4B1B046F44FB.png b/TuringChatMachine/Images.xcassets/username.imageset/6915526F-DBD7-448E-BAB2-4B1B046F44FB.png new file mode 100644 index 0000000..35dffb5 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/username.imageset/6915526F-DBD7-448E-BAB2-4B1B046F44FB.png differ diff --git a/TuringChatMachine/Images.xcassets/username.imageset/Contents.json b/TuringChatMachine/Images.xcassets/username.imageset/Contents.json new file mode 100644 index 0000000..3f8c7f4 --- /dev/null +++ b/TuringChatMachine/Images.xcassets/username.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "6915526F-DBD7-448E-BAB2-4B1B046F44FB.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "6915526F-DBD7-448E-BAB2-4B1B046F44FB-1.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TuringChatMachine/Images.xcassets/userpassword.imageset/80228475-7B26-4654-8E5C-6403C995A5F0-1.png b/TuringChatMachine/Images.xcassets/userpassword.imageset/80228475-7B26-4654-8E5C-6403C995A5F0-1.png new file mode 100644 index 0000000..13c794b Binary files /dev/null and b/TuringChatMachine/Images.xcassets/userpassword.imageset/80228475-7B26-4654-8E5C-6403C995A5F0-1.png differ diff --git a/TuringChatMachine/Images.xcassets/userpassword.imageset/80228475-7B26-4654-8E5C-6403C995A5F0.png b/TuringChatMachine/Images.xcassets/userpassword.imageset/80228475-7B26-4654-8E5C-6403C995A5F0.png new file mode 100644 index 0000000..79c42f4 Binary files /dev/null and b/TuringChatMachine/Images.xcassets/userpassword.imageset/80228475-7B26-4654-8E5C-6403C995A5F0.png differ diff --git a/TuringChatMachine/Images.xcassets/userpassword.imageset/Contents.json b/TuringChatMachine/Images.xcassets/userpassword.imageset/Contents.json new file mode 100644 index 0000000..afc68fd --- /dev/null +++ b/TuringChatMachine/Images.xcassets/userpassword.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "80228475-7B26-4654-8E5C-6403C995A5F0.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "80228475-7B26-4654-8E5C-6403C995A5F0-1.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TuringChatMachine/LaunchScreen.storyboard b/TuringChatMachine/LaunchScreen.storyboard index abdd299..de3cdd2 100644 --- a/TuringChatMachine/LaunchScreen.storyboard +++ b/TuringChatMachine/LaunchScreen.storyboard @@ -2,7 +2,6 @@ - @@ -17,53 +16,37 @@ - - - - - - - - - - - - - - + + - - - - - - diff --git a/TuringChatMachine/LaunchViewController.swift b/TuringChatMachine/LaunchViewController.swift new file mode 100644 index 0000000..c7cf27a --- /dev/null +++ b/TuringChatMachine/LaunchViewController.swift @@ -0,0 +1,117 @@ +// +// LaunchViewController.swift +// TuringChatMachine +// +// Created by codeGlider on 15/9/29. +// Copyright © 2015年 codeGlider. All rights reserved. +// + +import UIKit +import Spring +class LaunchViewController: UIViewController { + + @IBOutlet weak var logo: UIImageView! + override func viewWillAppear(animated: Bool) { + let logoGoUpAnimation = CABasicAnimation(keyPath: "position.y") + logoGoUpAnimation.beginTime = CACurrentMediaTime() + logoGoUpAnimation.duration = 2.0 + logoGoUpAnimation.fillMode = kCAFillModeForwards + logoGoUpAnimation.removedOnCompletion = false + logoGoUpAnimation.timingFunction = getTimingFunction(AnimationCurve.EaseOutCirc) + logoGoUpAnimation.fromValue = 367 - 33 + logoGoUpAnimation.repeatCount = 1 + + logoGoUpAnimation.toValue = 367 - 33 - 230 + logo.layer.addAnimation(logoGoUpAnimation, forKey: nil) + } + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + // Get the new view controller using segue.destinationViewController. + // Pass the selected object to the new view controller. + } + */ + +} +enum AnimationCurve: String { + case EaseIn = "easeIn" + case EaseOut = "easeOut" + case EaseInOut = "easeInOut" + case Linear = "linear" + case Spring = "spring" + case EaseInSine = "easeInSine" + case EaseOutSine = "easeOutSine" + case EaseInOutSine = "easeInOutSine" + case EaseInQuad = "easeInQuad" + case EaseOutQuad = "easeOutQuad" + case EaseInOutQuad = "easeInOutQuad" + case EaseInCubic = "easeInCubic" + case EaseOutCubic = "easeOutCubic" + case EaseInOutCubic = "easeInOutCubic" + case EaseInQuart = "easeInQuart" + case EaseOutQuart = "easeOutQuart" + case EaseInOutQuart = "easeInOutQuart" + case EaseInQuint = "easeInQuint" + case EaseOutQuint = "easeOutQuint" + case EaseInOutQuint = "easeInOutQuint" + case EaseInExpo = "easeInExpo" + case EaseOutExpo = "easeOutExpo" + case EaseInOutExpo = "easeInOutExpo" + case EaseInCirc = "easeInCirc" + case EaseOutCirc = "easeOutCirc" + case EaseInOutCirc = "easeInOutCirc" + case EaseInBack = "easeInBack" + case EaseOutBack = "easeOutBack" + case EaseInOutBack = "easeInOutBack" +} +func getTimingFunction(curve: AnimationCurve) -> CAMediaTimingFunction { + + switch curve { + case .EaseIn: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) + case .EaseOut: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut) + case .EaseInOut: return CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) + case .Linear: return CAMediaTimingFunction(name: kCAMediaTimingFunctionLinear) + case .Spring: return CAMediaTimingFunction(controlPoints: 0.5, 1.1, 1, 1) + case .EaseInSine: return CAMediaTimingFunction(controlPoints: 0.47, 0, 0.745, 0.715) + case .EaseOutSine: return CAMediaTimingFunction(controlPoints: 0.39, 0.575, 0.565, 1) + case .EaseInOutSine: return CAMediaTimingFunction(controlPoints: 0.445, 0.05, 0.55, 0.95) + case .EaseInQuad: return CAMediaTimingFunction(controlPoints: 0.55, 0.085, 0.68, 0.53) + case .EaseOutQuad: return CAMediaTimingFunction(controlPoints: 0.25, 0.46, 0.45, 0.94) + case .EaseInOutQuad: return CAMediaTimingFunction(controlPoints: 0.455, 0.03, 0.515, 0.955) + case .EaseInCubic: return CAMediaTimingFunction(controlPoints: 0.55, 0.055, 0.675, 0.19) + case .EaseOutCubic: return CAMediaTimingFunction(controlPoints: 0.215, 0.61, 0.355, 1) + case .EaseInOutCubic: return CAMediaTimingFunction(controlPoints: 0.645, 0.045, 0.355, 1) + case .EaseInQuart: return CAMediaTimingFunction(controlPoints: 0.895, 0.03, 0.685, 0.22) + case .EaseOutQuart: return CAMediaTimingFunction(controlPoints: 0.165, 0.84, 0.44, 1) + case .EaseInOutQuart: return CAMediaTimingFunction(controlPoints: 0.77, 0, 0.175, 1) + case .EaseInQuint: return CAMediaTimingFunction(controlPoints: 0.755, 0.05, 0.855, 0.06) + case .EaseOutQuint: return CAMediaTimingFunction(controlPoints: 0.23, 1, 0.32, 1) + case .EaseInOutQuint: return CAMediaTimingFunction(controlPoints: 0.86, 0, 0.07, 1) + case .EaseInExpo: return CAMediaTimingFunction(controlPoints: 0.95, 0.05, 0.795, 0.035) + case .EaseOutExpo: return CAMediaTimingFunction(controlPoints: 0.19, 1, 0.22, 1) + case .EaseInOutExpo: return CAMediaTimingFunction(controlPoints: 1, 0, 0, 1) + case .EaseInCirc: return CAMediaTimingFunction(controlPoints: 0.6, 0.04, 0.98, 0.335) + case .EaseOutCirc: return CAMediaTimingFunction(controlPoints: 0.075, 0.82, 0.165, 1) + case .EaseInOutCirc: return CAMediaTimingFunction(controlPoints: 0.785, 0.135, 0.15, 0.86) + case .EaseInBack: return CAMediaTimingFunction(controlPoints: 0.6, -0.28, 0.735, 0.045) + case .EaseOutBack: return CAMediaTimingFunction(controlPoints: 0.175, 0.885, 0.32, 1.275) + case .EaseInOutBack: return CAMediaTimingFunction(controlPoints: 0.68, -0.55, 0.265, 1.55) + } + + return CAMediaTimingFunction(name: kCAMediaTimingFunctionDefault) +} + diff --git a/TuringChatMachine/LoginViewController.swift b/TuringChatMachine/LoginViewController.swift index f2ac0e0..9471cfc 100644 --- a/TuringChatMachine/LoginViewController.swift +++ b/TuringChatMachine/LoginViewController.swift @@ -8,74 +8,154 @@ import UIKit import Parse -class LoginViewController: UIViewController { +import Spring +import SVProgressHUD +class LoginViewController: UIViewController,UITextFieldDelegate { + @IBOutlet weak var loginPanle: SpringView! @IBOutlet weak var username: UITextField! @IBOutlet weak var password: UITextField! @IBAction func unwindToLogInScreen(segue:UIStoryboardSegue) { } + @IBOutlet weak var backGround: UIImageView! + override func viewWillAppear(animated: Bool) { + + + loginPanleShowAnimation() + self.navigationController?.navigationBarHidden = true + if PFUser.currentUser() != nil{ + username.text = PFUser.currentUser()?.username + password.text = PFUser.currentUser()?.password + delay(seconds: 1.0, completion: { () -> () in + self.navigationController?.popViewControllerAnimated(true) + }) + + } + } + func loginPanleShowAnimation(){ + loginPanle.animation = "fadeInLeft" + loginPanle.autostart = false + loginPanle.curve = "easeOut" + loginPanle.duration = 1.0 + loginPanle.damping = 0.6 + loginPanle.velocity = 0.0 + loginPanle.force = 1.0 + loginPanle.animate() + + + + } + func textFieldShouldReturn(textField: UITextField) -> Bool { + if textField == username{ //如果用户名输入框点击换行就跳到密码输入框 + textField.resignFirstResponder() + password.becomeFirstResponder() + }else if textField == password && username.hasText() && password.hasText(){//如果是密码输入框回车同时用户名完成输入,就进行登陆操作 + + textField.resignFirstResponder() + login() + } + return true + } + + + override func viewDidLoad() { super.viewDidLoad() self.navigationController?.navigationBarHidden = true - password.secureTextEntry = true + setUpTextField() + insertBlurView(loginPanle, style: UIBlurEffectStyle.Light) + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) + notificationCenter.addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) + // Do any additional setup after loading the view. } - + func setUpTextField(){ + password.delegate = self + username.delegate = self + username.addTextFieldLeftView("username", withLeftPandding: 10, andRightPandding: 10) + password.addTextFieldLeftView("userpassword", withLeftPandding:13.5, andRightPandding: 13.5) + + username.returnKeyType = .Next + password.secureTextEntry = true + password.returnKeyType = .Done + + } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } + func keyboardWillShow(notification: NSNotification) { + + let userInfo = notification.userInfo as NSDictionary! + let frameNew = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() + let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue + if duration > 0{ + let options = UIViewAnimationOptions(rawValue: UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) + UIView.animateWithDuration(duration, delay: 0.0, options: options, animations: { () -> Void in + self.loginPanle.transform = CGAffineTransformMakeTranslation(0,-frameNew.height/3) + + }, completion: nil) + } + + } + func keyboardWillHide(notification: NSNotification) { + + let userInfo = notification.userInfo as NSDictionary! + + let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue + if duration > 0{ + let options = UIViewAnimationOptions(rawValue: UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) + UIView.animateWithDuration(duration, delay: 0.0, options: options, animations: { () -> Void in + self.loginPanle.transform = CGAffineTransformIdentity + + }, completion: nil) + } + + } + @IBAction func loginAction(sender: UIButton) { + + login() + + + } + func login(){ let username = self.username.text let password = self.password.text guard username?.getLength() >= 4 else{ - let alert = UIAlertView(title: "登陆错误", message: "用户名长度必须大于4个字符", delegate: self, cancelButtonTitle: "确定") - alert.show() + SVProgressHUD.showErrorWithStatus("用户名长度必须大于4个字符") return } guard password?.getLength() >= 8 else{ - let alert = UIAlertView(title: "登陆错误", message: "密码长度必须大于8个字符", delegate: self, cancelButtonTitle: "确定") - alert.show() + SVProgressHUD.showErrorWithStatus("密码长度必须大于8个字符") return } - let spinner: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(self.view.frame.width/2 - 25,100, 50, 50)) as UIActivityIndicatorView - spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge - - self.view.addSubview(spinner) - spinner.startAnimating() + + PFUser.logInWithUsernameInBackground(username!, password: password!) { (user,error) -> Void in - spinner.stopAnimating() + guard user != nil else{ - let alert = UIAlertView(title: "错误 ", message: "\(error)", delegate: self, cancelButtonTitle: "确定") - alert.show() + print(error?.userInfo) + + + SVProgressHUD.showErrorWithStatus("登陆失败╮(╯﹏╰)╭") return } - + SVProgressHUD.dismiss() dispatch_async(dispatch_get_main_queue(), { () -> Void in -// let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("Home") -// self.presentViewController(viewController, animated: true, completion: nil) + + self.navigationController?.popViewControllerAnimated(true) }) } - - - } - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - */ } diff --git a/TuringChatMachine/Main.storyboard b/TuringChatMachine/Main.storyboard index 0f8ba92..c7f886b 100644 --- a/TuringChatMachine/Main.storyboard +++ b/TuringChatMachine/Main.storyboard @@ -1,7 +1,8 @@ - + + @@ -16,83 +17,97 @@ + + + + - + - - + + - - + + - - - - - - - - - + - + - + + + + - - - - - - - - - - - - - + + + + + + + + - - - - + - - - - - - + + + + + + - - - - - - - - - - + + + + @@ -147,47 +154,35 @@ - - + + + + + + - - + + - - + + - - + + - - + + - - + @@ -195,32 +190,43 @@ + + + + + + - - + + - + - + @@ -230,19 +236,46 @@ + @@ -256,41 +289,30 @@ - - + + - + + - + - - - - - - - - - - - - - + @@ -301,11 +323,17 @@ + + + + + + @@ -326,78 +354,38 @@ - + - + - - - - - - - - - - - - + + - - + + - - + + - - + + - - - + + - - + + @@ -408,6 +396,42 @@ + + + + + + + + + + + @@ -417,60 +441,64 @@ - + - + - + + - - - - - - - - - - - - - - - - + + + + + + + - - - - - - - + + + + + + - - - - - - - - + @@ -492,41 +520,24 @@ - + + + + + - - - + + - - - - - - - - - - - - - @@ -587,11 +606,16 @@ + + + + - + + @@ -604,7 +628,8 @@ - + + diff --git a/TuringChatMachine/Message.swift b/TuringChatMachine/Message.swift index 6f2dab8..305d6e6 100755 --- a/TuringChatMachine/Message.swift +++ b/TuringChatMachine/Message.swift @@ -5,31 +5,17 @@ class Message { let incoming: Bool let text: String let sentDate: NSDate + let messageType:String + var contents:NSData var url = "" - init(incoming: Bool, text: String, sentDate: NSDate) { + init(messageType:String,incoming: Bool, text: String,contents:NSData, sentDate: NSDate) { self.incoming = incoming self.text = text self.sentDate = sentDate - } -} -class MessageObject:PFObject,PFSubclassing{ - @NSManaged var incoming:Bool - @NSManaged var text:String - @NSManaged var sentDate:NSDate - @NSManaged var url:String - - override class func initialize() { - struct Static { - static var onceToken : dispatch_once_t = 0; - } - dispatch_once(&Static.onceToken) { - self.registerSubclass() - } - } + self.messageType = messageType + self.contents = contents + + + } - - static func parseClassName() -> String { - return "Message" - } - } diff --git a/TuringChatMachine/MessageBubbleTableViewCell.swift b/TuringChatMachine/MessageBubbleTableViewCell.swift index 18b7ce6..5bf7729 100755 --- a/TuringChatMachine/MessageBubbleTableViewCell.swift +++ b/TuringChatMachine/MessageBubbleTableViewCell.swift @@ -26,23 +26,25 @@ class MessageBubbleTableViewCell:UITableViewCell{ sentDateLabel.numberOfLines = 1 sentDateLabel.userInteractionEnabled = false sentDateLabel.textAlignment = .Center - sentDateLabel.textColor = UIColor(red: 142/255, green: 142/255, blue: 147/255, alpha: 1) + sentDateLabel.textColor = UIColor(red:0.95, green:0.98, blue:0.99, alpha:1) + super.init(style: .Default, reuseIdentifier: reuseIdentifier) selectionStyle = .None contentView.addSubview(bubbleImageView) contentView.addSubview(sentDateLabel) + bubbleImageView.addSubview(messageLabel) - + sentDateLabel.snp_makeConstraints { (make) -> Void in - make.top.equalTo(contentView.snp_top) + make.top.equalTo(contentView.snp_top).offset(6) make.centerX.equalTo(contentView.snp_centerX) - + } bubbleImageView.snp_makeConstraints { (make) -> Void in make.left.equalTo(contentView.snp_left).offset(10) - make.top.equalTo(sentDateLabel.snp_bottom).offset(4.5) + make.top.equalTo(sentDateLabel.snp_bottom).offset(6) make.width.equalTo(messageLabel.snp_width).offset(30) make.bottom.equalTo(contentView.snp_bottom).offset(-4.5) @@ -62,11 +64,21 @@ class MessageBubbleTableViewCell:UITableViewCell{ fatalError("init(coder:) has not been implemented") } - func configureWithMessage(message: Message) { + func configureWithMessage(message: Message,showSentDate:Bool) { messageLabel.text = message.text - //sentDateLabel.text = formatDate(message.sentDate) - if message.url != ""{ - url = message.url + + if showSentDate { + sentDateLabel.text = formatDate(message.sentDate) + contentView.needsUpdateConstraints() + }else { + sentDateLabel.text = nil + contentView.needsUpdateConstraints() + } + print(message.contents) + + if message.messageType == messageType.link.rawValue{ + url = NSString.init(data:message.contents, encoding: NSUTF8StringEncoding) as! String + } diff --git a/TuringChatMachine/ResetPasswordViewController.swift b/TuringChatMachine/ResetPasswordViewController.swift index 03a74fb..da29068 100644 --- a/TuringChatMachine/ResetPasswordViewController.swift +++ b/TuringChatMachine/ResetPasswordViewController.swift @@ -7,19 +7,72 @@ // import UIKit - +import Spring class ResetPasswordViewController: UIViewController { + @IBOutlet weak var panle: SpringView! + + @IBOutlet weak var emailTextField: UITextField! + override func viewWillAppear(animated: Bool) { + resetPasswordPanleShowAnimation() + } override func viewDidLoad() { super.viewDidLoad() + panle.clipsToBounds = true + insertBlurView(panle, style: UIBlurEffectStyle.Light) + + emailTextField.addTextFieldLeftView("email", withLeftPandding: 10.5, andRightPandding: 10.5) + + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) + notificationCenter.addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) + // Do any additional setup after loading the view. + } - + func keyboardWillShow(notification: NSNotification) { + + let userInfo = notification.userInfo as NSDictionary! + let frameNew = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() + let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue + if duration > 0{ + let options = UIViewAnimationOptions(rawValue: UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) + UIView.animateWithDuration(duration, delay: 0.0, options: options, animations: { () -> Void in + self.panle.transform = CGAffineTransformMakeTranslation(0,-frameNew.height/3) + + }, completion: nil) + } + + } + func keyboardWillHide(notification: NSNotification) { + + let userInfo = notification.userInfo as NSDictionary! + + let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue + if duration > 0{ + let options = UIViewAnimationOptions(rawValue: UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) + UIView.animateWithDuration(duration, delay: 0.0, options: options, animations: { () -> Void in + self.panle.transform = CGAffineTransformIdentity + + }, completion: nil) + } + + } + override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - + func resetPasswordPanleShowAnimation(){ + panle.animation = "fadeInUp" + panle.autostart = false + panle.curve = "easeOut" + panle.duration = 1.0 + panle.damping = 0.6 + panle.velocity = 0.0 + panle.force = 1.0 + panle.animate() + } /* // MARK: - Navigation diff --git a/TuringChatMachine/SignUpViewController.swift b/TuringChatMachine/SignUpViewController.swift index 3191e39..b779595 100644 --- a/TuringChatMachine/SignUpViewController.swift +++ b/TuringChatMachine/SignUpViewController.swift @@ -8,71 +8,144 @@ import UIKit import Parse -class SignUpViewController: UIViewController { +import Spring +import SVProgressHUD +class SignUpViewController: UIViewController,UITextFieldDelegate { + @IBOutlet weak var panle: SpringView! @IBOutlet weak var emailField: UITextField! @IBOutlet weak var usernameField: UITextField! @IBOutlet weak var passwordField: UITextField! + override func viewWillAppear(animated: Bool) { + signUpPanleShowAnimation() + } override func viewDidLoad() { super.viewDidLoad() + setUpTexFields() + insertBlurView(panle, style: UIBlurEffectStyle.Light) + + let notificationCenter = NSNotificationCenter.defaultCenter() + notificationCenter.addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) + notificationCenter.addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) // Do any additional setup after loading the view. } - + func setUpTexFields(){ + emailField.delegate = self + usernameField.delegate = self + passwordField.delegate = self + usernameField.addTextFieldLeftView("username", withLeftPandding: 10, andRightPandding: 10) + passwordField.addTextFieldLeftView("userpassword", withLeftPandding:13.5, andRightPandding: 13.5) + emailField.addTextFieldLeftView("email", withLeftPandding: 10.5, andRightPandding: 10.5) + + } + func keyboardWillShow(notification: NSNotification) { + + let userInfo = notification.userInfo as NSDictionary! + let frameNew = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() + let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue + if duration > 0{ + let options = UIViewAnimationOptions(rawValue: UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) + UIView.animateWithDuration(duration, delay: 0.0, options: options, animations: { () -> Void in + self.panle.transform = CGAffineTransformMakeTranslation(0,-frameNew.height/3) + + }, completion: nil) + } + + } + func keyboardWillHide(notification: NSNotification) { + + let userInfo = notification.userInfo as NSDictionary! + + let duration = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue + if duration > 0{ + let options = UIViewAnimationOptions(rawValue: UInt((userInfo[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber).integerValue << 16)) + UIView.animateWithDuration(duration, delay: 0.0, options: options, animations: { () -> Void in + self.panle.transform = CGAffineTransformIdentity + + }, completion: nil) + } + + } + func textFieldShouldReturn(textField: UITextField) -> Bool { + if textField == emailField{ //如果用户名输入框点击换行就跳到密码输入框 + print("email!") + textField.resignFirstResponder() + usernameField.becomeFirstResponder() + }else if textField == usernameField{//如果是密码输入框回车同时用户名完成输入,就进行登陆操作 + print("username!") + textField.resignFirstResponder() + passwordField.becomeFirstResponder() + + }else if textField == passwordField && emailField.hasText() && usernameField.hasText() && passwordField.hasText(){ + print("password") + textField.resignFirstResponder() + signUpAction(self) + + } + return true + } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } - + func signUpPanleShowAnimation(){ + panle.animation = "fadeInUp" + panle.autostart = false + panle.curve = "easeOut" + panle.duration = 1.0 + panle.damping = 0.6 + panle.velocity = 0.0 + panle.force = 1.0 + panle.animate() + } @IBAction func signUpAction(sender: AnyObject) { let username = self.usernameField.text! let password = self.passwordField.text! let email = self.emailField.text! let finalEmail = email.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) - guard username.getLength() >= 5 else{ - let alert = UIAlertView(title: "错误", message: "用户名必须大于5个字符!", delegate: self, cancelButtonTitle: "确定") - alert.show() + if username.getLength() < 5 { + SVProgressHUD.showErrorWithStatus("用户名长度必须大于5个字符") + return - } - guard password.getLength() >= 8 else{ - let alert = UIAlertView(title: "错误", message: "密码必须大于5个字符!", delegate: self, cancelButtonTitle: "确定") - alert.show() + }else if + password.getLength() < 8{ + SVProgressHUD.showErrorWithStatus("密码长度必须大于8个字符") return } - guard email.getLength() >= 8 else{ - let alert = UIAlertView(title: "错误", message: "请输入正确的电子邮箱地址!", delegate: self, cancelButtonTitle: "确定") - alert.show() + else if email.getLength() < 8 { + SVProgressHUD.showErrorWithStatus("请输入正确的电子邮箱地址") return } - let spinner: UIActivityIndicatorView = UIActivityIndicatorView(frame: CGRectMake(0, 0, 150, 150)) as UIActivityIndicatorView - spinner.startAnimating() + SVProgressHUD.showWithStatus("注册中") let newUser = PFUser() newUser.username = username newUser.password = password newUser.email = finalEmail - + // Sign up the user asynchronously - newUser.signUpInBackgroundWithBlock({ (succeed, error) -> Void in + newUser.signUpInBackgroundWithBlock({ (succees, error) -> Void in // Stop the spinner - spinner.stopAnimating() - guard ((error) != nil) else { - let alert = UIAlertView(title: "错误", message: "\(error)", delegate: self, cancelButtonTitle: "确定") - alert.show() - return + + SVProgressHUD.dismiss() + if error == nil { + print(error) + SVProgressHUD.showSuccessWithStatus("注册成功!") + dispatch_async(dispatch_get_main_queue(), { () -> Void in + self.dismissViewControllerAnimated(true, completion: nil) + }) + }else{ + + SVProgressHUD.showErrorWithStatus("注册失败") } - let alert = UIAlertView(title: "成功", message: "已注册! ", delegate: self, cancelButtonTitle: "确定") - alert.show() - dispatch_async(dispatch_get_main_queue(), { () -> Void in - let viewController:UIViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("Home") - self.presentViewController(viewController, animated: true, completion: nil) - }) + }) } - + } diff --git a/TuringChatMachine/WebViewController.swift b/TuringChatMachine/WebViewController.swift deleted file mode 100644 index 1a0e253..0000000 --- a/TuringChatMachine/WebViewController.swift +++ /dev/null @@ -1,130 +0,0 @@ -// -// WebViewController.swift -// TuringChatMachine -// -// -// -// ___ ___ -// ___ / /\ ___ / /\ -// / /\ / /::\ /__/\ / /:/_ -// / /:/ ___ ___ / /:/\:\ \ \:\ / /:/ /\ -// /__/::\ /__/\ / /\ / /:/ \:\ \ \:\ / /:/ /:/_ -// \__\/\:\__ \ \:\ / /:/ /__/:/ \__\:\ ___ \__\:\ /__/:/ /:/ /\ -// \ \:\/\ \ \:\ /:/ \ \:\ / /:/ /__/\ | |:| \ \:\/:/ /:/ -// \__\::/ \ \:\/:/ \ \:\ /:/ \ \:\| |:| \ \::/ /:/ -// /__/:/ \ \::/ \ \:\/:/ \ \:\__|:| \ \:\/:/ -// \__\/ \__\/ \ \::/ \__\::::/ \ \::/ -// \__\/ ~~~~ \__\/ -// ___ _____ ___ ___ ___ ___ -// / /\ / /::\ / /\ ___ / /\ /__/\ / /\ -// / /::\ / /:/\:\ / /::\ / /\ / /::\ \ \:\ / /::\ -// / /:/\:\ / /:/ \:\ / /:/\:\ / /:/ / /:/\:\ \ \:\ / /:/\:\ -// / /:/~/::\ /__/:/ \__\:| / /:/~/:/ /__/::\ / /:/~/::\ _____\__\:\ / /:/~/::\ -// /__/:/ /:/\:\ \ \:\ / /:/ /__/:/ /:/___ \__\/\:\__ /__/:/ /:/\:\ /__/::::::::\ /__/:/ /:/\:\ -// \ \:\/:/__\/ \ \:\ /:/ \ \:\/:::::/ \ \:\/\ \ \:\/:/__\/ \ \:\~~\~~\/ \ \:\/:/__\/ -// \ \::/ \ \:\/:/ \ \::/~~~~ \__\::/ \ \::/ \ \:\ ~~~ \ \::/ -// \ \:\ \ \::/ \ \:\ /__/:/ \ \:\ \ \:\ \ \:\ -// \ \:\ \__\/ \ \:\ \__\/ \ \:\ \ \:\ \ \:\ -// \__\/ \__\/ \__\/ \__\/ \__\/ -// -// -// -// -// -// Created by Huangjunwei on 15/9/9. -// Copyright (c) 2015年 codeGlider. All rights reserved. -// - -import UIKit -import SnapKit -class WebViewController: UIViewController{ - var webView:UIWebView! - var preButton:UIButton! - var nextButton:UIButton! - var closeButton:UIButton! - let url:String! - init(url:String){ - self.url = url - self.webView = UIWebView(frame: CGRectZero) - super.init(nibName: nil, bundle: nil) - - - - } - - required init(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - override func viewDidLoad() { - self.navigationController?.navigationBarHidden = true - super.viewDidLoad() - view.backgroundColor = UIColor.whiteColor() - preButton = UIButton(frame: CGRect(origin: CGPointZero, size: CGSize(width: 22.25, height: 25))) - preButton.setBackgroundImage(UIImage(named: "pre"), forState: UIControlState.Normal) - view.addSubview(preButton) - preButton.snp_makeConstraints { (make) -> Void in - make.left.equalTo(view.snp_left).offset(15) - make.top.equalTo(view.snp_top).offset(25) - } - preButton.addTarget(self, action: "goPrePage:", forControlEvents: UIControlEvents.TouchUpInside) - - nextButton = UIButton(frame: CGRect(origin: CGPointZero, size: CGSize(width: 22.25, height: 25))) - nextButton.setBackgroundImage(UIImage(named: "next"), forState: UIControlState.Normal) - view.addSubview(nextButton) - nextButton.snp_makeConstraints { (make) -> Void in - make.left.equalTo(preButton.snp_left).offset(35) - make.top.equalTo(view.snp_top).offset(25) - } - nextButton.addTarget(self, action: "goNextPage:", forControlEvents: UIControlEvents.TouchUpInside) - - closeButton = UIButton(frame: CGRect(origin: CGPointZero, size: CGSize(width: 22, height: 21.5))) - closeButton.setBackgroundImage(UIImage(named: "close"), forState: UIControlState.Normal) - view.addSubview(closeButton) - closeButton.snp_makeConstraints { (make) -> Void in - make.right.equalTo(view.snp_right).offset(-20.5) - make.top.equalTo(view.snp_top).offset(25) - } - closeButton.addTarget(self, action: "closeWebView:", forControlEvents: UIControlEvents.TouchUpInside) - - view.addSubview(webView) - webView.snp_makeConstraints { (make) -> Void in - make.top.equalTo(view.snp_top).offset(60) - make.left.equalTo(view.snp_left) - make.right.equalTo(view.snp_right) - make.bottom.equalTo(view.snp_bottom) - } - - let request = NSURLRequest(URL: NSURL(string: self.url)!) - webView.loadRequest(request) - - // Do any additional setup after loading the view. - } - func closeWebView(sender:UIButton){ - - self.dismissViewControllerAnimated(true, completion: nil) - } - func goPrePage(sender:UIButton){ - self.webView.goBack() - } - func goNextPage(sender:UIButton){ - self.webView.goForward() - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - - - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - - -} diff --git a/UITabelViewLoadAnimation.swift b/UITabelViewLoadAnimation.swift new file mode 100755 index 0000000..5fdfc7e --- /dev/null +++ b/UITabelViewLoadAnimation.swift @@ -0,0 +1,136 @@ + + +import Foundation +import UIKit +enum AnimationDirect{ + case DropDownFromTop + case LiftUpFromBottum + case FromRightToLeft + case FromLeftToRight +} +extension UITableView { + /** + * UITableView重新加载动画 + * + * @param direct cell运动方向 + * @param time 动画持续时间,设置成1.0 + * @param interval 每个cell间隔,设置成0.1 + * @example self.tableView.reloadDataWithAnimate(AnimationDirect.DropDownFromTop, animationTime: 0.5, interval: 0.05) + */ + func reloadDataWithAnimate(direct:AnimationDirect,animationTime:NSTimeInterval,interval:NSTimeInterval)->Void{ + self.setContentOffset(self.contentOffset, animated: false) + UIView.animateWithDuration(0.2, delay: 1.0, usingSpringWithDamping: 0.3, initialSpringVelocity: 1.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { () -> Void in + + self.hidden = true + + self.reloadData() + }) {(finished) -> Void in + self.hidden = false + + self.visibleRowsBeginAnimation(direct, animationTime: animationTime, interval: interval) + } + + } + func visibleRowsBeginAnimation(direct:AnimationDirect,animationTime:NSTimeInterval,interval:NSTimeInterval)->Void{ + let visibleArray : NSArray = self.indexPathsForVisibleRows! as NSArray + let count = visibleArray.count + switch direct{ + case .DropDownFromTop: + for i in 0...(count-1){ + let path : NSIndexPath = visibleArray.objectAtIndex(count - 1 - i) as! NSIndexPath + let cell : UITableViewCell = self.cellForRowAtIndexPath(path)! + cell.hidden = true + let originPoint : CGPoint = cell.center + cell.center = CGPointMake(originPoint.x, originPoint.y - 1000) + UIView.animateWithDuration(animationTime + NSTimeInterval(i) * interval, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x , originPoint.y + 2.0) + cell.hidden = false + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x , originPoint.y - 2.0) + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = originPoint + }, completion: { (finished) -> Void in + + }) + }) + + }) + } + case .LiftUpFromBottum: + for i in 0...(count-1){ + var path : NSIndexPath = visibleArray.objectAtIndex(i) as! NSIndexPath + var cell : UITableViewCell = self.cellForRowAtIndexPath(path)! + cell.hidden = true + let originPoint : CGPoint = cell.center + cell.center = CGPointMake(originPoint.x, originPoint.y + 1000) + UIView.animateWithDuration(animationTime + NSTimeInterval(i) * interval, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x , originPoint.y - 2.0) + cell.hidden = false + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x , originPoint.y + 2.0) + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0.0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = originPoint + }, completion: { (finished) -> Void in + + }) + }) + }) + } + case .FromLeftToRight: + + for i in 0...(count-1){ + var path : NSIndexPath = visibleArray.objectAtIndex(i) as! NSIndexPath + var cell : UITableViewCell = self.cellForRowAtIndexPath(path)! + cell.hidden = true + let originPoint : CGPoint = cell.center + cell.center = CGPointMake(-cell.frame.size.width, originPoint.y) + UIView.animateWithDuration(animationTime + NSTimeInterval(i) * interval, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x - 2.0, originPoint.y) + cell.hidden = false; + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x + 2.0, originPoint.y) + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = originPoint + }, completion: { (finished) -> Void in + + }) + }) + }) + + } + case .FromRightToLeft: + for i in 0...(count-1){ + var path : NSIndexPath = visibleArray.objectAtIndex(i) as! NSIndexPath + var cell : UITableViewCell = self.cellForRowAtIndexPath(path)! + cell.hidden = true + let originPoint : CGPoint = cell.center + cell.center = CGPointMake(cell.frame.size.width * 3.0, originPoint.y) + UIView.animateWithDuration(animationTime + NSTimeInterval(i) * interval, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x + 2.0, originPoint.y) + cell.hidden = false; + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = CGPointMake(originPoint.x - 5.0, originPoint.y) + }, completion: { (finished) -> Void in + UIView.animateWithDuration(0.1, delay: 0, options: UIViewAnimationOptions.CurveEaseIn, animations: { () -> Void in + cell.center = originPoint + }, completion: { (finished) -> Void in + + }) + }) + }) + + } + default: + return + } + + } + +}