1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//
// GMBaseTableView.m
// Gengmei
//
// Created by 翟国钧 on 15/1/14.
// Copyright (c) 2015年 Wanmeichuangyi. All rights reserved.
//
#import "GMTableView.h"
#import "UIView+Layout.h"
@implementation GMTableView
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
[self setup];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style{
self = [super initWithFrame:frame style:style];
if (self) {
[self setup];
}
return self;
}
- (void)setup{
self.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.separatorStyle = UITableViewCellSeparatorStyleNone;
}
@end
@implementation GMTableView (FixWierdTableHeaderAnimation)
- (void)fixWierdTableHeaderAnimationWhenRefreshFinish {
if (self.tableHeaderView.height > 0) {
return;
}
// 我们希望在拖动时 section header 可以浮在上面,所以使用 scrollView.dragging 来区分。
if (self.dragging) {
// 在手动拖拽时,立即设置 contentInset 为 UIEdgeInsetsZero,就可以保证 section header 浮在上面。
self.contentInset = UIEdgeInsetsZero;
}else{
// 下拉时, 这两个分支保证在下拉过程及刷新后, section 及 table 能回复到正确位置
CGFloat sectionHeaderHeight = 64;
// 下拉刷新结束,scrollView 自动复位,那么此时也立即改变 UIEdgeInsetsMake 以保证 section header 能跟随 scroll view 一起动
if (self.contentOffset.y < sectionHeaderHeight && self.contentOffset.y >= 0) {
self.contentInset = UIEdgeInsetsMake(-self.contentOffset.y, 0, 0, 0);
}
// 当 table view 恢复到原来的位置,其实 contentInset,contentOffset 已经被我们改变,要恢复到初始状态
else if (self.contentOffset.y == sectionHeaderHeight) {
self.contentInset = UIEdgeInsetsZero;
self.contentOffset = CGPointZero;
}
}
}
@end
@implementation UITableView (Register)
- (void)registerCell:(Class)cellClass {
if ([cellClass isSubclassOfClass:[UITableViewCell class]]) {
[self registerClass:cellClass forCellReuseIdentifier:NSStringFromClass(cellClass)];
}
}
- (void)registerHeaderFooterView:(Class)aClass {
if ([aClass isSubclassOfClass:[UITableViewHeaderFooterView class]]) {
[self registerClass:aClass forHeaderFooterViewReuseIdentifier:NSStringFromClass(aClass)];
}
}
- (__kindof UITableViewCell *)dequeueCell:(Class)cellClass forIndexPath:(NSIndexPath *)indexPath {
return [self dequeueReusableCellWithIdentifier:NSStringFromClass(cellClass) forIndexPath:indexPath];
}
- (__kindof UITableViewHeaderFooterView *)dequeueHeaderFooterView:(Class)headerFooterViewClass {
return [self dequeueReusableHeaderFooterViewWithIdentifier:NSStringFromClass(headerFooterViewClass)];
}
@end