1.tableview设置footerview之前一定要先设置高度,不然tableview的contentsize是没有将footerview的高度计算入内的.
// 控制器.m文件,该控制器有个tableview要设置footer view
@implementation ZGKMeViewController
// 重写init方法,将Group样式封装起来
- (instancetype)init{
// 因为是封装起来,所以不是调用super的方法
return [self initWithStyle:UITableViewStyleGrouped];
}
- (void)viewDidLoad {
footerView.backgroundColor = [UIColor greenColor];
// 设置footerview前要设置其高度,或者封装在footerview内部完成高度的设置,否则footer是正常无法滚动
self.tableView.tableFooterView = footerView;
footerView.tableview = self.tableView;
}
- footerview内部完成高度的设置,还要tableview的reloadData方法配合,单单改变tableview的contentsize是有bug的
// 在footerview的.m文件
// 6.根据返回的数据,重新设置footerview的高度,高度=最后一个按钮的bottom的最大y值
// 6.1设置了footerview的高度,但是tabelview的contentsize没有设置,所以无法滚动
self.zgk_height = self.subviews.lastObject.zgk_bottom;
// 6.2设置重新设置tableView的contentsize,但是跳转其他界面再返回的时候,就不管用了
NSLog(@"self.tableView = %@", self.tableview);
// 方法一:通过属性传入(bug:仅仅修改contentsize,再次返回我的控制器时,就不能上下滚动了)
// self.tableview.contentSize = CGSizeMake(0, self.zgk_bottom);
// 方法二:通过小面包观察,知道footerview的superview就是tableview(bug:仅仅修改contentsize,再次返回我的控制器时,就不能上下滚动了)
// UITableView *tableView = (UITableView *)self.superview;
// tableView.contentSize = CGSizeMake(0, self.zgk_bottom);
// 方法三:使用reloadData,让tableview重新计算tableview的contentsize
[self.tableview reloadData];
// 注意:如果这里重新设置tableview的footerview,则tableview的content size会比实际的contentsize多20的高度,这可能是苹果的bug
// self.tableview.footerview= self;
- 强制改变tableview的contentsize会有bug,虽然第一次footer view正常滚动,但是再次跳转该控制器的时候footerview仍然无法正常滚动,所以请求数据完毕后,要调用tableview的reloadData方法,重写计算tableview的高度和contentsize.相类似的还有如下:
[self.tableview reloadData];
[self.tableview setNeedsLayout];
[self.tableview setNeedsDisplay];
[self.tableview layoutIfNeeded];
2.footerview自定义button需要注意的2点
#import "ZGKMeFooterviewButton.h"
@implementation ZGKMeFooterviewButton
// 一次性初始化设置,写在initWithFrame,xib写在awakeFromNib,tableViewCell写在initWithStyle
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.font = [UIFont systemFontOfSize:12];
// 设置按钮标题颜色
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
return self;
}
- (void)layoutSubviews{
[super layoutSubviews];
// 注意1:通过用比例来设定,可以使得不同尺寸的屏幕可以自适应
self.imageView.zgk_y = self.zgk_height * 0.1;
self.imageView.zgk_height = self.zgk_height * 0.5;
self.imageView.zgk_width = self.imageView.zgk_height;
self.imageView.zgk_centerX = self.zgk_width * 0.5;
self.titleLabel.zgk_y = self.imageView.zgk_bottom;
self.titleLabel.zgk_height = self.zgk_height - self.imageView.zgk_bottom;
// 注意2:重写layoutSubviews时最好,x,y,width,height都重写一遍
// 后面两句虽然没有改,但是也要补上,不然会出错
self.titleLabel.zgk_x = 0;
self.titleLabel.zgk_width = self.zgk_width;
}
@end
3.九宫格的分割线实现(3种方案)
- 1.用宽度为1~2的UIView添加到footerview
- 2.每列的按钮宽度width-1,但是最后一列不减,用底色来形成分割线
- 3.通过美工做的背景四角方框图片来实现
@implementation ZGKMeFooterviewButton
// 一次性初始化设置,写在initWithFrame,xib写在awakeFromNib,tableViewCell写在initWithStyle
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.titleLabel.textAlignment = NSTextAlignmentCenter;
self.titleLabel.font = [UIFont systemFontOfSize:12];
// 设置按钮标题颜色
[self setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
// 注意:设置按钮的背景图片作为分隔线
[self setBackgroundImage:[UIImage imageNamed:@"mainCellBackground"] forState:UIControlStateNormal];
}
return self;
}
4.关于九宫格按钮的处理
// 3.创建按钮并设置模型数据
// 注意1: 为了美观,添加3个空白按钮
for (int index = 0; index < count + 3; index ++) {
// NSLog(@"index = %d", index);
ZGKMeFooterviewButton *btn = [ZGKMeFooterviewButton buttonWithType:UIButtonTypeCustom];
[self addSubview:btn];
// 设置btn的frame
btn.zgk_x = (index % maxColsCount) * maxWidth;
btn.zgk_y = (index / maxColsCount) * maxHeight;
btn.zgk_width = maxWidth;
btn.zgk_height = maxHeight;
// 注意2:给按钮添加背景颜色,区别于footerview的背景颜色
btn.backgroundColor = [UIColor whiteColor];
// 4.拿到模型数据,并赋值()
// 注意3: 判断如果超过了count个btn,则模型为nil
ZGKMeSquareModel *square = index >= 33 ? nil : squares[index];
[btn setTitle:square.name forState:UIControlStateNormal];
}
网友评论