Files
ManagerDemo/ManagerDemo/Common/MJRefresh/MJRefreshBaseView.m
T
2014-08-11 16:29:18 +08:00

242 lines
6.4 KiB
Objective-C
Executable File

//
// MJRefreshBaseView.m
// MJRefresh
//
// Created by mj on 13-3-4.
// Copyright (c) 2013年 itcast. All rights reserved.
//
#import "MJRefreshBaseView.h"
#import "MJRefreshConst.h"
#import "UIView+Extension.h"
#import "UIScrollView+Extension.h"
#import <objc/message.h>
@interface MJRefreshBaseView()
{
__weak UILabel *_statusLabel;
__weak UIImageView *_arrowImage;
__weak UIActivityIndicatorView *_activityView;
}
@end
@implementation MJRefreshBaseView
#pragma mark - 控件初始化
/**
* 状态标签
*/
- (UILabel *)statusLabel
{
if (!_statusLabel) {
UILabel *statusLabel = [[UILabel alloc] init];
statusLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
statusLabel.font = [UIFont boldSystemFontOfSize:13];
statusLabel.textColor = MJRefreshLabelTextColor;
statusLabel.backgroundColor = [UIColor clearColor];
statusLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:_statusLabel = statusLabel];
}
return _statusLabel;
}
/**
* 箭头图片
*/
- (UIImageView *)arrowImage
{
if (!_arrowImage) {
UIImageView *arrowImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MJRefreshSrcName(@"pull_arrow_down_black.png")]];
arrowImage.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
[self addSubview:_arrowImage = arrowImage];
}
return _arrowImage;
}
/**
* 状态标签
*/
- (UIActivityIndicatorView *)activityView
{
if (!_activityView) {
UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityView.bounds = self.arrowImage.bounds;
activityView.autoresizingMask = self.arrowImage.autoresizingMask;
[self addSubview:_activityView = activityView];
}
return _activityView;
}
#pragma mark - 初始化方法
- (instancetype)initWithFrame:(CGRect)frame {
frame.size.height = MJRefreshViewHeight;
if (self = [super initWithFrame:frame]) {
// 1.自己的属性
self.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.backgroundColor = [UIColor clearColor];
// 2.设置默认状态
self.state = MJRefreshStateNormal;
}
return self;
}
- (void)layoutSubviews
{
[super layoutSubviews];
// 1.箭头
CGFloat arrowX = self.width * 0.5 - 100;
self.arrowImage.center = CGPointMake(arrowX, self.height * 0.5);
// 2.指示器
self.activityView.center = self.arrowImage.center;
}
- (void)willMoveToSuperview:(UIView *)newSuperview
{
[super willMoveToSuperview:newSuperview];
// 旧的父控件
[self.superview removeObserver:self forKeyPath:MJRefreshContentOffset context:nil];
if (newSuperview) { // 新的父控件
[newSuperview addObserver:self forKeyPath:MJRefreshContentOffset options:NSKeyValueObservingOptionNew context:nil];
// 设置宽度
self.width = newSuperview.width;
// 设置位置
self.x = 0;
// 记录UIScrollView
_scrollView = (UIScrollView *)newSuperview;
// 记录UIScrollView最开始的contentInset
_scrollViewOriginalInset = _scrollView.contentInset;
}
}
#pragma mark - 显示到屏幕上
- (void)drawRect:(CGRect)rect
{
if (self.state == MJRefreshStateWillRefreshing) {
self.state = MJRefreshStateRefreshing;
}
}
#pragma mark - 刷新相关
#pragma mark 是否正在刷新
- (BOOL)isRefreshing
{
return MJRefreshStateRefreshing == self.state;
}
#pragma mark 开始刷新
- (void)beginRefreshing
{
if (self.window) {
self.state = MJRefreshStateRefreshing;
} else {
#warning 不能调用set方法
_state = MJRefreshStateWillRefreshing;
[super setNeedsDisplay];
}
}
#pragma mark 结束刷新
- (void)endRefreshing
{
double delayInSeconds = 0.3;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
self.state = MJRefreshStateNormal;
});
}
#pragma mark - 设置状态
- (void)setPullToRefreshText:(NSString *)pullToRefreshText
{
_pullToRefreshText = [pullToRefreshText copy];
[self settingLabelText];
}
- (void)setReleaseToRefreshText:(NSString *)releaseToRefreshText
{
_releaseToRefreshText = [releaseToRefreshText copy];
[self settingLabelText];
}
- (void)setRefreshingText:(NSString *)refreshingText
{
_refreshingText = [refreshingText copy];
[self settingLabelText];
}
- (void)settingLabelText
{
switch (self.state) {
case MJRefreshStateNormal:
// 设置文字
self.statusLabel.text = self.pullToRefreshText;
break;
case MJRefreshStatePulling:
// 设置文字
self.statusLabel.text = self.releaseToRefreshText;
break;
case MJRefreshStateRefreshing:
// 设置文字
self.statusLabel.text = self.refreshingText;
break;
default:
break;
}
}
- (void)setState:(MJRefreshState)state
{
// 0.存储当前的contentInset
if (self.state != MJRefreshStateRefreshing) {
_scrollViewOriginalInset = self.scrollView.contentInset;
}
// 1.一样的就直接返回
if (self.state == state) return;
// 2.根据状态执行不同的操作
switch (state) {
case MJRefreshStateNormal: // 普通状态
{
// 显示箭头
self.arrowImage.hidden = NO;
// 停止转圈圈
[self.activityView stopAnimating];
break;
}
case MJRefreshStatePulling:
break;
case MJRefreshStateRefreshing:
{
// 开始转圈圈
[self.activityView startAnimating];
// 隐藏箭头
self.arrowImage.hidden = YES;
// 回调
if ([self.beginRefreshingTaget respondsToSelector:self.beginRefreshingAction]) {
objc_msgSend(self.beginRefreshingTaget, self.beginRefreshingAction, self);
}
if (self.beginRefreshingCallback) {
self.beginRefreshingCallback();
}
break;
}
default:
break;
}
// 3.存储状态
_state = state;
// 4.设置文字
[self settingLabelText];
}
@end