知识点总结24:tableview设置footerview注意点

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];
}

你可能感兴趣的:(知识点总结24:tableview设置footerview注意点)