今天封装了一个View作为UITableView的footerView,但是footerView的高度是根据请求的数据动态决定的,但是发现最后显示的footerView的高度总是不对。
具体问题如下
设计一个SFFooterView,
@interface SFFooterView : UIView
@end
重载.m文件的initWithFrame:
方法,在该方法中通过afn请求数据,数据请求成功后假设将该View的高度设置为1000,背景色设置为红色。
- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
NSMutableDictionary *parameter = [NSMutableDictionary dictionary];
parameter[@"x"] = @"xxx";
parameter[@"xx"] = @"xxxx";
[manager GET:@"xxxxx" parameters:parameter progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// View的高度设置为1000,背景色设置为红色
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y,
self.frame.size.width, 1000);
self.backgroundColor = [UIColor redColor];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
}
return self;
}
在控制器中设置tableView的tableFooterView属性
self.tableView.tableFooterView = [[SFFooterView alloc] init];
运行程序看看效果,如下图,发现footerView的背景已经变为红色,但是高度不是1000。这是因为在设置self.tableView.tableFooterView = [[SFFooterView alloc] init];
时需要指定footerView的bounds,不然高度是不对的,因为在SFFooterView通过afn请求数据成功后在改变footerView的高度,此时tableView的footerView已经设置完成了,在改变高度也无济于事了。
解决方法
要想让footerView的高度根据请求数据动态改变高度,只需在afn请求数据成功的block中最后添加两行代码,即将self重新赋值给tableFooterView属性。
UITableView *tableView = (UITableView *)self.superview;
tableView.tableFooterView = self;
再次运行程序,效果如下,此时footerView的高度已经是1000啦。