initial
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// MJRefreshNormalTrailer.h
|
||||
// MJRefresh
|
||||
//
|
||||
// Created by kinarobin on 2020/5/3.
|
||||
// Copyright © 2020 小码哥. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<MJRefresh/MJRefreshStateTrailer.h>)
|
||||
#import <MJRefresh/MJRefreshStateTrailer.h>
|
||||
#else
|
||||
#import "MJRefreshStateTrailer.h"
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface MJRefreshNormalTrailer : MJRefreshStateTrailer
|
||||
|
||||
@property (weak, nonatomic, readonly) UIImageView *arrowView;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@@ -0,0 +1,80 @@
|
||||
//
|
||||
// MJRefreshNormalTrailer.m
|
||||
// MJRefresh
|
||||
//
|
||||
// Created by kinarobin on 2020/5/3.
|
||||
// Copyright © 2020 小码哥. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MJRefreshNormalTrailer.h"
|
||||
#import "NSBundle+MJRefresh.h"
|
||||
#import "UIView+MJExtension.h"
|
||||
|
||||
@interface MJRefreshNormalTrailer() {
|
||||
__unsafe_unretained UIImageView *_arrowView;
|
||||
}
|
||||
@end
|
||||
|
||||
@implementation MJRefreshNormalTrailer
|
||||
#pragma mark - 懒加载子控件
|
||||
- (UIImageView *)arrowView {
|
||||
if (!_arrowView) {
|
||||
UIImageView *arrowView = [[UIImageView alloc] initWithImage:[NSBundle mj_trailArrowImage]];
|
||||
[self addSubview:_arrowView = arrowView];
|
||||
}
|
||||
return _arrowView;
|
||||
}
|
||||
|
||||
- (void)placeSubviews {
|
||||
[super placeSubviews];
|
||||
|
||||
CGSize arrowSize = self.arrowView.image.size;
|
||||
// 箭头的中心点
|
||||
CGPoint selfCenter = CGPointMake(self.mj_w * 0.5, self.mj_h * 0.5);
|
||||
CGPoint arrowCenter = CGPointMake(arrowSize.width * 0.5 + 5, self.mj_h * 0.5);
|
||||
BOOL stateHidden = self.stateLabel.isHidden;
|
||||
|
||||
if (self.arrowView.constraints.count == 0) {
|
||||
self.arrowView.mj_size = self.arrowView.image.size;
|
||||
self.arrowView.center = stateHidden ? selfCenter : arrowCenter ;
|
||||
}
|
||||
self.arrowView.tintColor = self.stateLabel.textColor;
|
||||
|
||||
if (stateHidden) return;
|
||||
|
||||
BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0;
|
||||
CGFloat stateLabelW = ceil(self.stateLabel.font.pointSize);
|
||||
// 状态
|
||||
if (noConstrainsOnStatusLabel) {
|
||||
BOOL arrowHidden = self.arrowView.isHidden;
|
||||
CGFloat stateCenterX = (self.mj_w + arrowSize.width) * 0.5;
|
||||
self.stateLabel.center = arrowHidden ? selfCenter : CGPointMake(stateCenterX, self.mj_h * 0.5);
|
||||
self.stateLabel.mj_size = CGSizeMake(stateLabelW, self.mj_h) ;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setState:(MJRefreshState)state {
|
||||
MJRefreshCheckState
|
||||
// 根据状态做事情
|
||||
if (state == MJRefreshStateIdle) {
|
||||
if (oldState == MJRefreshStateRefreshing) {
|
||||
[UIView animateWithDuration:self.fastAnimationDuration animations:^{
|
||||
self.arrowView.transform = CGAffineTransformMakeRotation(M_PI);
|
||||
} completion:^(BOOL finished) {
|
||||
self.arrowView.transform = CGAffineTransformIdentity;
|
||||
}];
|
||||
} else {
|
||||
[UIView animateWithDuration:self.fastAnimationDuration animations:^{
|
||||
self.arrowView.transform = CGAffineTransformIdentity;
|
||||
}];
|
||||
}
|
||||
} else if (state == MJRefreshStatePulling) {
|
||||
[UIView animateWithDuration:self.fastAnimationDuration animations:^{
|
||||
self.arrowView.transform = CGAffineTransformMakeRotation(M_PI);
|
||||
}];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@end
|
||||
@@ -0,0 +1,28 @@
|
||||
//
|
||||
// MJRefreshStateTrailer.h
|
||||
// MJRefresh
|
||||
//
|
||||
// Created by kinarobin on 2020/5/3.
|
||||
// Copyright © 2020 小码哥. All rights reserved.
|
||||
//
|
||||
|
||||
#if __has_include(<MJRefresh/MJRefreshTrailer.h>)
|
||||
#import <MJRefresh/MJRefreshTrailer.h>
|
||||
#else
|
||||
#import "MJRefreshTrailer.h"
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
||||
@interface MJRefreshStateTrailer : MJRefreshTrailer
|
||||
|
||||
#pragma mark - 状态相关
|
||||
/** 显示刷新状态的label */
|
||||
@property (weak, nonatomic, readonly) UILabel *stateLabel;
|
||||
/** 设置state状态下的文字 */
|
||||
- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
@@ -0,0 +1,87 @@
|
||||
//
|
||||
// MJRefreshStateTrailer.m
|
||||
// MJRefresh
|
||||
//
|
||||
// Created by kinarobin on 2020/5/3.
|
||||
// Copyright © 2020 小码哥. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MJRefreshStateTrailer.h"
|
||||
#import "NSBundle+MJRefresh.h"
|
||||
#import "UIView+MJExtension.h"
|
||||
|
||||
@interface MJRefreshStateTrailer() {
|
||||
/** 显示刷新状态的label */
|
||||
__unsafe_unretained UILabel *_stateLabel;
|
||||
}
|
||||
/** 所有状态对应的文字 */
|
||||
@property (strong, nonatomic) NSMutableDictionary *stateTitles;
|
||||
@end
|
||||
|
||||
@implementation MJRefreshStateTrailer
|
||||
#pragma mark - 懒加载
|
||||
- (NSMutableDictionary *)stateTitles {
|
||||
if (!_stateTitles) {
|
||||
self.stateTitles = [NSMutableDictionary dictionary];
|
||||
}
|
||||
return _stateTitles;
|
||||
}
|
||||
|
||||
- (UILabel *)stateLabel {
|
||||
if (!_stateLabel) {
|
||||
UILabel *stateLabel = [UILabel mj_label];
|
||||
stateLabel.numberOfLines = 0;
|
||||
[self addSubview:_stateLabel = stateLabel];
|
||||
}
|
||||
return _stateLabel;
|
||||
}
|
||||
|
||||
#pragma mark - 公共方法
|
||||
- (instancetype)setTitle:(NSString *)title forState:(MJRefreshState)state {
|
||||
if (title == nil) return self;
|
||||
self.stateTitles[@(state)] = title;
|
||||
self.stateLabel.text = self.stateTitles[@(self.state)];
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)textConfiguration {
|
||||
// 初始化文字
|
||||
[self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshTrailerIdleText] forState:MJRefreshStateIdle];
|
||||
[self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshTrailerPullingText] forState:MJRefreshStatePulling];
|
||||
[self setTitle:[NSBundle mj_localizedStringForKey:MJRefreshTrailerPullingText] forState:MJRefreshStateRefreshing];
|
||||
}
|
||||
|
||||
#pragma mark - 覆盖父类的方法
|
||||
- (void)prepare {
|
||||
[super prepare];
|
||||
|
||||
[self textConfiguration];
|
||||
}
|
||||
|
||||
- (void)i18nDidChange {
|
||||
[self textConfiguration];
|
||||
|
||||
[super i18nDidChange];
|
||||
}
|
||||
|
||||
- (void)setState:(MJRefreshState)state {
|
||||
MJRefreshCheckState
|
||||
// 设置状态文字
|
||||
self.stateLabel.text = self.stateTitles[@(state)];
|
||||
}
|
||||
|
||||
- (void)placeSubviews {
|
||||
[super placeSubviews];
|
||||
|
||||
if (self.stateLabel.hidden) return;
|
||||
|
||||
BOOL noConstrainsOnStatusLabel = self.stateLabel.constraints.count == 0;
|
||||
CGFloat stateLabelW = ceil(self.stateLabel.font.pointSize);
|
||||
// 状态
|
||||
if (noConstrainsOnStatusLabel) {
|
||||
self.stateLabel.center = CGPointMake(self.mj_w * 0.5, self.mj_h * 0.5);
|
||||
self.stateLabel.mj_size = CGSizeMake(stateLabelW, self.mj_h) ;
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
Reference in New Issue
Block a user