657 lines
21 KiB
Objective-C
657 lines
21 KiB
Objective-C
//
|
|
// RefreshTableView.m
|
|
// DJXRefresh
|
|
//
|
|
// Created by Founderbn on 14-7-18.
|
|
// Copyright (c) 2014年 Umeng 董剑雄. All rights reserved.
|
|
//
|
|
|
|
#import "UMComRefreshView.h"
|
|
#import "UMComResouceDefines.h"
|
|
#import <UMCommunitySDK/UMComSession.h>
|
|
|
|
NSString *const UMRefreshKeyPathContentOffset = @"contentOffset";
|
|
NSString *const UMRefreshKeyPathContentInset = @"contentInset";
|
|
NSString *const UMRefreshKeyPathContentSize = @"contentSize";
|
|
|
|
@interface UMComRefreshView ()
|
|
|
|
@property (nonatomic,copy) NSString *lastRefreshTime;
|
|
|
|
@end
|
|
|
|
@implementation UMComRefreshView
|
|
|
|
+ (UMComRefreshView *)refreshControllViewWithScrollView:(UIScrollView *)scrollView block:(void (^)())block
|
|
{
|
|
UMComRefreshView *refrehView = [[self alloc]initWithFrame:CGRectMake(0, 0, scrollView.frame.size.width, 60)];
|
|
refrehView.loadingBlock = block;
|
|
refrehView.scrollView = scrollView;
|
|
return refrehView;
|
|
}
|
|
|
|
- (id)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
|
|
self.statusLable = [[UILabel alloc]init];
|
|
self.dateLable = [[UILabel alloc]init];
|
|
self.activityIndicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
|
|
self.indicateImageView = [[UIImageView alloc]init];
|
|
self.statusLable.backgroundColor = [UIColor clearColor];
|
|
self.dateLable.backgroundColor = [UIColor clearColor];
|
|
self.statusLable.font = UMComFontNotoSansLightWithSafeSize(15);
|
|
self.dateLable.font = UMComFontNotoSansLightWithSafeSize(10);
|
|
self.statusLable.textAlignment = NSTextAlignmentCenter;
|
|
self.dateLable.textAlignment = NSTextAlignmentCenter;
|
|
self.statusLable.autoresizingMask = UIViewAutoresizingFlexibleWidth;
|
|
self.dateLable.autoresizingMask = UIViewAutoresizingFlexibleWidth;
|
|
self.indicateImageView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
|
|
self.activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
|
|
[self addSubview:self.dateLable];
|
|
[self addSubview:self.statusLable];
|
|
[self addSubview:self.indicateImageView];
|
|
[self addSubview:self.activityIndicatorView];
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.autoresizingMask = UIViewAutoresizingFlexibleWidth;
|
|
self.backgroundColor = [UIColor clearColor];
|
|
self.beginPullHeight = frame.size.height;
|
|
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)resetSubViews
|
|
{
|
|
CGRect frame = self.frame;
|
|
frame.size.width = self.scrollView.frame.size.width;
|
|
frame.size.height = self.beginPullHeight;
|
|
self.frame = frame;
|
|
}
|
|
|
|
//- (void)willMoveToSuperview:(UIView *)newSuperview
|
|
//{
|
|
// if (![newSuperview isKindOfClass:[UIScrollView class]] || newSuperview == self.scrollView) {
|
|
// return;
|
|
// }
|
|
//// [self removeObservers];
|
|
//
|
|
//}
|
|
|
|
|
|
- (void)setScrollView:(UIScrollView *)scrollView
|
|
{
|
|
if (![scrollView isKindOfClass:[UIScrollView class]]) {
|
|
return;
|
|
}
|
|
self.scrollViewOriginalInset = scrollView.contentInset;
|
|
_scrollView = scrollView;
|
|
[scrollView addSubview:self];
|
|
[self resetSubViews];
|
|
self.loadStatus = UMPullingStatus;
|
|
[self addObservers];
|
|
}
|
|
|
|
|
|
|
|
|
|
- (void)dealloc
|
|
{
|
|
[self removeObservers];
|
|
}
|
|
|
|
- (void)addObservers
|
|
{
|
|
[self.scrollView addObserver:self forKeyPath:UMRefreshKeyPathContentOffset options:NSKeyValueObservingOptionNew context:nil];
|
|
[self.scrollView addObserver:self forKeyPath:UMRefreshKeyPathContentSize options:NSKeyValueObservingOptionNew context:nil];
|
|
}
|
|
|
|
- (void)removeObservers
|
|
{
|
|
[self.scrollView removeObserver:self forKeyPath:UMRefreshKeyPathContentOffset];
|
|
[self.scrollView removeObserver:self forKeyPath:UMRefreshKeyPathContentSize];
|
|
}
|
|
|
|
|
|
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
|
|
{
|
|
if ([keyPath isEqualToString:UMRefreshKeyPathContentOffset]) {
|
|
[self scrollViewDidChangeOffset:change];
|
|
}else if ([keyPath isEqualToString:UMRefreshKeyPathContentSize]){
|
|
[self scrollViewDidChangeContentSize:change];
|
|
}
|
|
}
|
|
|
|
- (void)scrollViewDidChangeOffset:(NSDictionary *)change
|
|
{
|
|
|
|
}
|
|
|
|
- (void)scrollViewDidChangeContentSize:(NSDictionary *)change
|
|
{
|
|
|
|
}
|
|
|
|
|
|
- (NSString *)noticeForLoadStatus:(UMLoadStatus)loadStatus
|
|
{
|
|
if (self.noticeForLoadStatusBlock) {
|
|
return self.noticeForLoadStatusBlock(loadStatus);
|
|
}else{
|
|
return nil;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)beginLoading
|
|
{
|
|
[self setLoadStatus:UMLoadingStatus];
|
|
}
|
|
|
|
- (void)endLoading
|
|
{
|
|
[self setLoadStatus:UMNomalStatus];
|
|
}
|
|
|
|
- (void)noMoreData
|
|
{
|
|
[self setLoadStatus:UMNoMoredStatus];
|
|
|
|
}
|
|
|
|
- (void)setLoadStatus:(UMLoadStatus)loadStatus
|
|
{
|
|
_loadStatus = loadStatus;
|
|
self.statusLable.text = [self noticeForLoadStatus:loadStatus];
|
|
|
|
}
|
|
|
|
- (NSString *)nowDateString
|
|
{
|
|
NSDate *today = [NSDate date];
|
|
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
|
|
NSCalendar *calendar =
|
|
[[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
|
|
[formatter setCalendar:calendar];
|
|
[formatter setDateFormat:@"HH:mm:ss"];//yyyy-MM-dd HH:mm:ss
|
|
NSString *todayTime = [formatter stringFromDate:today];
|
|
if (todayTime) {
|
|
return [NSString stringWithFormat:UMComLocalizedString(@"um_com_lastRefreshTime", @"上次下拉刷新时间:%@"),todayTime];
|
|
}
|
|
return nil;
|
|
}
|
|
|
|
- (void)setRotation:(NSInteger)rotation animated:(BOOL)animated
|
|
{
|
|
if (rotation < -4)
|
|
rotation = 4 - abs((int)rotation);
|
|
if (rotation > 4)
|
|
rotation = rotation - 4;
|
|
if (animated)
|
|
{
|
|
[UIView animateWithDuration:0.1 animations:^{
|
|
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(rotation * M_PI / 2);
|
|
self.indicateImageView.transform = rotationTransform;
|
|
} completion:^(BOOL finished) {
|
|
}];
|
|
} else
|
|
{
|
|
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(rotation * M_PI / 2);
|
|
self.indicateImageView.transform = rotationTransform;
|
|
}
|
|
}
|
|
|
|
-(UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation
|
|
{
|
|
long double rotate = 0.0;
|
|
CGRect rect;
|
|
float translateX = 0;
|
|
float translateY = 0;
|
|
float scaleX = 1.0;
|
|
float scaleY = 1.0;
|
|
switch (orientation) {
|
|
case UIImageOrientationLeft:
|
|
rotate = M_PI_2;
|
|
rect = CGRectMake(0, 0, image.size.height, image.size.width);
|
|
translateX = 0;
|
|
translateY = -rect.size.width;
|
|
scaleY = rect.size.width/rect.size.height;
|
|
scaleX = rect.size.height/rect.size.width;
|
|
break;
|
|
case UIImageOrientationRight:
|
|
rotate = 3 * M_PI_2;
|
|
rect = CGRectMake(0, 0, image.size.height, image.size.width);
|
|
translateX = -rect.size.height;
|
|
translateY = 0;
|
|
scaleY = rect.size.width/rect.size.height;
|
|
scaleX = rect.size.height/rect.size.width;
|
|
break;
|
|
case UIImageOrientationDown:
|
|
rotate = M_PI;
|
|
rect = CGRectMake(0, 0, image.size.width, image.size.height);
|
|
translateX = -rect.size.width;
|
|
translateY = -rect.size.height;
|
|
break;
|
|
default:
|
|
rotate = 0.0;
|
|
rect = CGRectMake(0, 0, image.size.width, image.size.height);
|
|
translateX = 0;
|
|
translateY = 0;
|
|
break;
|
|
}
|
|
UIGraphicsBeginImageContext(rect.size);
|
|
CGContextRef context = UIGraphicsGetCurrentContext();
|
|
//做CTM变换
|
|
CGContextTranslateCTM(context, 0.0, rect.size.height);
|
|
CGContextScaleCTM(context, 1.0, -1.0);
|
|
CGContextRotateCTM(context, rotate);
|
|
CGContextTranslateCTM(context, translateX, translateY);
|
|
CGContextScaleCTM(context, scaleX, scaleY);
|
|
//绘制图片
|
|
CGContextDrawImage(context, CGRectMake(0, 0, rect.size.width, rect.size.height), image.CGImage);
|
|
UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
|
|
return newPic;
|
|
}
|
|
@end
|
|
|
|
|
|
@interface UMComHeadView ()
|
|
|
|
@end
|
|
|
|
@implementation UMComHeadView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
self.indicateImageView.image = UMComImageWithImageName(@"grayArrow1");
|
|
self.noticeForLoadStatusBlock = ^(UMLoadStatus loadStatus){
|
|
switch (loadStatus) {
|
|
case UMNomalStatus:
|
|
return @"刷新完成";
|
|
break;
|
|
case UMPullingStatus:
|
|
return @"下拉可以刷新";
|
|
break;
|
|
case UMPreLoadStatus:
|
|
return @"松手即可刷新";
|
|
break;
|
|
case UMLoadingStatus:
|
|
return @"正在刷新";
|
|
break;
|
|
case UMNoMoredStatus:
|
|
return @"已经是最新数据了";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
};
|
|
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)scrollViewDidChangeOffset:(NSDictionary *)change
|
|
{
|
|
[super scrollViewDidChangeOffset:change];
|
|
if (self.loadStatus == UMLoadingStatus) {
|
|
return;
|
|
}
|
|
// 跳转到下一个控制器时,contentInset可能会变
|
|
self.scrollViewOriginalInset = self.scrollView.contentInset;
|
|
|
|
// 当前的contentOffset
|
|
CGFloat offsetY = self.scrollView.contentOffset.y;
|
|
// 头部控件刚好出现的offsetY
|
|
CGFloat happenOffsetY = - self.scrollViewOriginalInset.top;
|
|
|
|
// 如果是向上滚动到看不见头部控件,直接返回
|
|
if (offsetY >= happenOffsetY) return;
|
|
|
|
// 普通 和 即将刷新 的临界点
|
|
CGFloat normal2pullingOffsetY = happenOffsetY - self.frame.size.height;
|
|
CGFloat pullingPercent = (happenOffsetY - offsetY) / self.frame.size.height;
|
|
|
|
if (self.scrollView.isDragging) { // 如果正在拖拽
|
|
self.pullingPercent = pullingPercent;
|
|
if (self.loadStatus == UMNomalStatus && offsetY < happenOffsetY) {
|
|
// 转为即将刷新状态
|
|
self.loadStatus = UMPullingStatus;
|
|
}else if (self.loadStatus == UMPullingStatus && offsetY < normal2pullingOffsetY){
|
|
self.loadStatus = UMPreLoadStatus;
|
|
}else if (self.loadStatus == UMPreLoadStatus && offsetY >= normal2pullingOffsetY) {
|
|
// 转为普通状态
|
|
self.loadStatus = UMNomalStatus;
|
|
}
|
|
} else if (self.loadStatus == UMPreLoadStatus) {// 即将刷新 && 手松开
|
|
// 开始刷新
|
|
// 执行代理方法
|
|
[self setLoadStatus:UMLoadingStatus];
|
|
} else if (pullingPercent < 1) {
|
|
self.pullingPercent = pullingPercent;
|
|
}
|
|
}
|
|
|
|
- (void)resetSubViews
|
|
{
|
|
[super resetSubViews];
|
|
CGRect frame = self.frame;
|
|
frame.origin.y = - self.scrollViewOriginalInset.top - self.beginPullHeight;
|
|
self.frame = frame;
|
|
CGFloat defualtHeight = 50;
|
|
CGFloat height = frame.size.height;
|
|
CGFloat width = frame.size.width;
|
|
CGFloat dateLabelHeight = defualtHeight /3;
|
|
CGFloat statusLableHeight = defualtHeight - dateLabelHeight;
|
|
CGFloat commonLabelOriginX = 60;
|
|
self.statusLable.frame = CGRectMake(commonLabelOriginX, height-defualtHeight-5, width-commonLabelOriginX*2, statusLableHeight);
|
|
|
|
self.dateLable.frame = CGRectMake(commonLabelOriginX,self.statusLable.frame.size.height+self.statusLable.frame.origin.y, width-commonLabelOriginX*2, dateLabelHeight);
|
|
self.activityIndicatorView.frame = CGRectMake(10, height-(defualtHeight-(defualtHeight-40)/2), 40, 40);
|
|
self.indicateImageView.frame = CGRectMake(20, height-(defualtHeight-(defualtHeight-40)/2), 15, 35);
|
|
}
|
|
|
|
#pragma mark -
|
|
- (void)setLoadStatus:(UMLoadStatus)loadStatus
|
|
{
|
|
|
|
if (self.loadStatus == loadStatus) {
|
|
return;
|
|
}
|
|
[super setLoadStatus:loadStatus];
|
|
|
|
switch (loadStatus) {
|
|
case UMPullingStatus:
|
|
{
|
|
if (self.indicateImageView.superview != self) {
|
|
[self.indicateImageView removeFromSuperview];
|
|
[self addSubview:self.indicateImageView];
|
|
}
|
|
|
|
if (self.lastRefreshTime) {
|
|
self.dateLable.text = self.lastRefreshTime;
|
|
}else{
|
|
|
|
self.dateLable.text = [self nowDateString];
|
|
}
|
|
self.lastRefreshTime = [self nowDateString];
|
|
}
|
|
break;
|
|
case UMPreLoadStatus:
|
|
{
|
|
[self setRotation:-2 animated:YES];
|
|
|
|
}
|
|
break;
|
|
case UMLoadingStatus:
|
|
{
|
|
|
|
[self.indicateImageView removeFromSuperview];
|
|
self.indicateImageView.transform = CGAffineTransformIdentity;
|
|
[self.activityIndicatorView startAnimating];
|
|
[UIView animateWithDuration:0.25 animations:^{
|
|
// 增加滚动区域
|
|
CGFloat top = self.scrollViewOriginalInset.top + self.beginPullHeight;
|
|
UIEdgeInsets contentInsets = self.scrollView.contentInset;
|
|
// self.scrollView.mj_insetT = top;
|
|
contentInsets.top = top;
|
|
self.scrollView.contentInset = contentInsets;
|
|
|
|
// // 设置滚动位置
|
|
CGPoint contentOffset = self.scrollView.contentOffset;
|
|
contentOffset.y = -top;
|
|
self.scrollView.contentOffset = contentOffset;
|
|
|
|
} completion:^(BOOL finished) {
|
|
if (self.loadingBlock) {
|
|
self.loadingBlock();
|
|
}else{
|
|
[self endLoading];
|
|
}
|
|
}];
|
|
}
|
|
break;
|
|
case UMNomalStatus:
|
|
{
|
|
[self resetSubViewWhenLoadFinsh];
|
|
if (self.indicateImageView.superview != self) {
|
|
[self.indicateImageView removeFromSuperview];
|
|
[self addSubview:self.indicateImageView];
|
|
}
|
|
}
|
|
break;
|
|
case UMNoMoredStatus:
|
|
{
|
|
[self resetSubViewWhenLoadFinsh];
|
|
[self.indicateImageView removeFromSuperview];
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
- (void)resetSubViewWhenLoadFinsh
|
|
{
|
|
[UIView animateWithDuration:0.4 animations:^{
|
|
UIEdgeInsets edgeInset = self.scrollView.contentInset;
|
|
edgeInset.top = self.scrollViewOriginalInset.top;
|
|
self.scrollView.contentInset = edgeInset;
|
|
} completion:^(BOOL finished) {
|
|
self.pullingPercent = 0.0;
|
|
}];
|
|
[self.activityIndicatorView stopAnimating];
|
|
self.indicateImageView.transform = CGAffineTransformIdentity;
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
|
|
@interface UMComFootView ()
|
|
|
|
@end
|
|
|
|
@implementation UMComFootView
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame
|
|
{
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
self.hidden = YES;
|
|
UIImage *downImage = UMComImageWithImageName(@"grayArrow1");
|
|
self.indicateImageView.image = [self image:downImage rotation:UIImageOrientationDown];;
|
|
self.noticeForLoadStatusBlock = ^(UMLoadStatus loadStatus){
|
|
switch (loadStatus) {
|
|
case UMNomalStatus:
|
|
return @"加载完成";
|
|
break;
|
|
case UMPullingStatus:
|
|
return @"上拉可以加载更多";
|
|
break;
|
|
case UMPreLoadStatus:
|
|
return @"松手即可加载更多";
|
|
break;
|
|
case UMLoadingStatus:
|
|
return @"正在加载";
|
|
break;
|
|
case UMNoMoredStatus:
|
|
return @"已经是最后一页数据了";
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
};
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)resetSubViews
|
|
{
|
|
[super resetSubViews];
|
|
CGRect frame = self.frame;
|
|
frame.origin.y = self.scrollViewOriginalInset.bottom + self.scrollView.contentSize.height;
|
|
self.frame = frame;
|
|
[self.dateLable removeFromSuperview];;
|
|
self.statusLable.frame = CGRectMake(60, 0, self.frame.size.width-120, self.frame.size.height);
|
|
self.activityIndicatorView.frame = CGRectMake(10, (self.frame.size.height - 40)/2, 40, 40);
|
|
self.indicateImageView.frame= CGRectMake(20,(self.frame.size.height - 35)/2, 15, 35);
|
|
}
|
|
|
|
- (void)scrollViewDidChangeOffset:(NSDictionary *)change
|
|
{
|
|
if (self.scrollView.contentInset.top + self.scrollView.contentSize.height > self.scrollView.frame.size.height) {
|
|
if (self.hidden) {
|
|
self.hidden = NO;
|
|
}
|
|
}else if(self.hidden == NO){
|
|
self.hidden = YES;
|
|
return;
|
|
}
|
|
if (self.scrollView.contentOffset.y <= 0) {
|
|
return;
|
|
}
|
|
if (self.loadStatus == UMLoadingStatus) {
|
|
return;
|
|
}
|
|
if (self.loadStatus == UMNoMoredStatus) {
|
|
return;
|
|
}
|
|
if (self.scrollView.isDragging) {
|
|
if ( self.frame.origin.y == 0) return;
|
|
//上拉加载
|
|
if ([self isBeginScrollBottom:self.scrollView] && ![self isScrollToBottom:self.scrollView] && self.loadStatus != UMLoadingStatus) {
|
|
if (self.loadStatus == UMNomalStatus) {
|
|
self.loadStatus = UMPullingStatus;
|
|
}else if(self.loadStatus == UMPreLoadStatus){
|
|
|
|
self.loadStatus = UMNomalStatus;
|
|
}
|
|
}else if ([self isScrollToBottom:self.scrollView] && self.loadStatus == UMPullingStatus){
|
|
self.loadStatus = UMPreLoadStatus;
|
|
}
|
|
// else if ([self isBeginScrollBottom:self.scrollView] && self.loadStatus == UMPreLoadStatus){
|
|
// self.indicateImageView.transform = CGAffineTransformIdentity;
|
|
//
|
|
// }
|
|
|
|
}else{
|
|
if (self.loadStatus == UMPreLoadStatus){
|
|
[self setLoadStatus:UMLoadingStatus];
|
|
}
|
|
}
|
|
}
|
|
- (BOOL)isBeginScrollBottom:(UIScrollView *)scrollView
|
|
{
|
|
if (scrollView.contentOffset.y>0 && (scrollView.contentSize.height <scrollView.contentOffset.y +scrollView.bounds.size.height-scrollView.contentInset.bottom)) {
|
|
return YES;
|
|
}else{
|
|
return NO;
|
|
}
|
|
}
|
|
|
|
- (BOOL)isScrollToBottom:(UIScrollView *)scrollView
|
|
{
|
|
if (scrollView.contentOffset.y>0 && (scrollView.contentSize.height< scrollView.contentOffset.y +scrollView.bounds.size.height -scrollView.contentInset.bottom - self.beginPullHeight)) {
|
|
return YES;
|
|
}else{
|
|
return NO;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)scrollViewDidChangeContentSize:(NSDictionary *)change
|
|
{
|
|
CGRect frame = self.frame;
|
|
frame.origin.y = self.scrollView.contentSize.height;
|
|
self.frame = frame;
|
|
}
|
|
|
|
- (void)setLoadStatus:(UMLoadStatus)loadStatus
|
|
{
|
|
if (self.loadStatus == loadStatus) {
|
|
return;
|
|
}
|
|
[super setLoadStatus:loadStatus];
|
|
switch (loadStatus) {
|
|
case UMPullingStatus:
|
|
{
|
|
if (self.indicateImageView.superview != self) {
|
|
[self.indicateImageView removeFromSuperview];
|
|
[self addSubview:self.indicateImageView];
|
|
}
|
|
}
|
|
break;
|
|
case UMPreLoadStatus:
|
|
{
|
|
[self setRotation:2 animated:YES];
|
|
}
|
|
break;
|
|
case UMLoadingStatus:
|
|
{
|
|
[self.indicateImageView removeFromSuperview];
|
|
self.indicateImageView.transform = CGAffineTransformIdentity;
|
|
[self.activityIndicatorView startAnimating];
|
|
[UIView animateWithDuration:0.25 animations:^{
|
|
// 增加滚动区域
|
|
CGFloat bottom = self.scrollViewOriginalInset.bottom + self.beginPullHeight;
|
|
UIEdgeInsets contentInsets = self.scrollView.contentInset;
|
|
// self.scrollView.mj_insetT = top;
|
|
contentInsets.bottom = bottom;
|
|
self.scrollView.contentInset = contentInsets;
|
|
|
|
// // // 设置滚动位置
|
|
// CGPoint contentOffset = self.scrollView.contentOffset;
|
|
// contentOffset.y = -top;
|
|
// self.scrollView.contentOffset = contentOffset;
|
|
|
|
} completion:^(BOOL finished) {
|
|
|
|
if (self.loadingBlock) {
|
|
self.loadingBlock();
|
|
}else{
|
|
[self endLoading];
|
|
}
|
|
}];
|
|
}
|
|
break;
|
|
case UMNomalStatus:
|
|
{
|
|
[self resetSubViewWhenLoadFinsh];
|
|
if (self.indicateImageView.superview != self) {
|
|
[self addSubview:self.indicateImageView];
|
|
}
|
|
}
|
|
case UMNoMoredStatus:
|
|
{
|
|
[self resetSubViewWhenLoadFinsh];
|
|
|
|
[self.indicateImageView removeFromSuperview];
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
- (void)resetSubViewWhenLoadFinsh
|
|
{
|
|
self.indicateImageView.transform = CGAffineTransformIdentity;
|
|
[self.activityIndicatorView stopAnimating];
|
|
[UIView animateWithDuration:0.4 animations:^{
|
|
UIEdgeInsets edgeInset = self.scrollView.contentInset;
|
|
edgeInset.bottom = self.scrollViewOriginalInset.bottom;
|
|
self.scrollView.contentInset = edgeInset;
|
|
} completion:^(BOOL finished) {
|
|
self.pullingPercent = 0.0;
|
|
}];
|
|
}
|
|
|
|
@end
|
|
|
|
|