今天封裝了一個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啦。
