- 目的:實現(xiàn)自定義的上下拉刷新動畫,盡可能少的代碼侵入性。
- 輪子:MJRefresh
- 大多數(shù)方案:繼承
MJRefresh
的相關(guān)組件瞧哟,如MJRefreshGifHeader
,MJRefreshAutoGifFooter
勤揩,然后使用自定義的控件咧党。 - 缺點:不夠雅觀陨亡,因為我還要自己取一個名字才行。负蠕。蛙埂≌谔牵總之,不如直接用MJ的6欲账。
- 解決方案:GifRefreshCategory屡江,里面有
MJRefreshGifHeader
和MJRefreshAutoGifFooter
的兩個分類赛不,把文件拖入項目后,再換一換圖片就能用了踢故,怎么用庞萍,當然是不用你寫一行代碼阵幸,還是用MJ系列的。
具體實現(xiàn)代碼(以header
為例):
@implementation MJRefreshGifHeader (Category)
+ (void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL swizzleSelectors[2] = {
@selector(prepare),
@selector(placeSubviews)
};
for (int i = 0; i < 1; i++) {
SEL selector = swizzleSelectors[i];
NSString *newSelectorStr = [NSString stringWithFormat:@"header_%@", NSStringFromSelector(selector)];
Method originMethod = class_getInstanceMethod(self, selector);
Method swizzledMethod = class_getInstanceMethod(self, NSSelectorFromString(newSelectorStr));
method_exchangeImplementations(originMethod, swizzledMethod);
}
});
}
- (void)header_prepare{
[self header_prepare];//先調(diào)用原來的方法
NSMutableArray *idleImages = [NSMutableArray array];//定義數(shù)組存儲圖片
for (int i = 0; i<6; i++) {
NSString *imgName = [NSString stringWithFormat:@"loading0%d",i+1];
UIImage *img = [UIImage imageNamed:imgName];
[idleImages addObject:img];
}
self.lastUpdatedTimeLabel.hidden = YES;
self.stateLabel.hidden = YES;
self.gifView.centerX = WIDTH/2;
// 設(shè)置普通狀態(tài)的動畫圖片
[self setImages:idleImages forState:MJRefreshStateIdle];
// 設(shè)置即將刷新狀態(tài)的動畫圖片(一松開就會刷新的狀態(tài))
[self setImages:idleImages forState:MJRefreshStatePulling];
// 設(shè)置正在刷新狀態(tài)的動畫圖片
[self setImages:idleImages forState:MJRefreshStateRefreshing];
}
- (void)header_placeSubviews{
[self header_placeSubviews];
}
@end
使用時不需要引入頭文件,直接用MJ的即可:
MJRefreshGifHeader *_refreshHeader;
_refreshHeader = [MJRefreshGifHeader headerWithRefreshingBlock:^{
[self requestData:1];
}];
_tableView.mj_header = _refreshHeader;
是不是很easy抓艳?