New file |
| | |
| | | // |
| | | // MJRefreshNormalHeader.m |
| | | // MJRefreshExample |
| | | // |
| | | // Created by MJ Lee on 15/4/24. |
| | | // Copyright (c) 2015年 小码哥. All rights reserved. |
| | | // |
| | | |
| | | #import "MJRefreshNormalHeader.h" |
| | | #import "NSBundle+MJRefresh.h" |
| | | |
| | | @interface MJRefreshNormalHeader() |
| | | { |
| | | __unsafe_unretained UIImageView *_arrowView; |
| | | } |
| | | @property (weak, nonatomic) UIActivityIndicatorView *loadingView; |
| | | @end |
| | | |
| | | @implementation MJRefreshNormalHeader |
| | | #pragma mark - 懒加载子控件 |
| | | - (UIImageView *)arrowView |
| | | { |
| | | if (!_arrowView) { |
| | | UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_arrowImage]]; |
| | | [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 mark - 重写父类的方法 |
| | | - (void)prepare |
| | | { |
| | | [super prepare]; |
| | | |
| | | self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray; |
| | | } |
| | | |
| | | - (void)placeSubviews |
| | | { |
| | | [super placeSubviews]; |
| | | |
| | | // 箭头的中心点 |
| | | CGFloat arrowCenterX = self.mj_w * 0.5; |
| | | if (!self.stateLabel.hidden) { |
| | | CGFloat stateWidth = self.stateLabel.mj_textWith; |
| | | CGFloat timeWidth = 0.0; |
| | | if (!self.lastUpdatedTimeLabel.hidden) { |
| | | timeWidth = self.lastUpdatedTimeLabel.mj_textWith; |
| | | } |
| | | CGFloat textWidth = MAX(stateWidth, timeWidth); |
| | | arrowCenterX -= textWidth / 2 + self.labelLeftInset; |
| | | } |
| | | CGFloat arrowCenterY = self.mj_h * 0.5; |
| | | CGPoint arrowCenter = CGPointMake(arrowCenterX, arrowCenterY); |
| | | |
| | | // 箭头 |
| | | if (self.arrowView.constraints.count == 0) { |
| | | self.arrowView.mj_size = self.arrowView.image.size; |
| | | self.arrowView.center = arrowCenter; |
| | | } |
| | | |
| | | // 圈圈 |
| | | if (self.loadingView.constraints.count == 0) { |
| | | self.loadingView.center = arrowCenter; |
| | | } |
| | | |
| | | self.arrowView.tintColor = self.stateLabel.textColor; |
| | | } |
| | | |
| | | - (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 |