UITabelView 加载数据,导致其他视图的Frame不正确

2019-04-30  本文已影响0人  生命不止运动不息

看如下代码。运行后,bottomView的y坐标始终是0.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if( self.bottomView.isHidden) return 20;
    return _datas.count;
}

- (UITableView *)tableView{
    if( !_tableView ){
        _tableView = [[UITableView alloc] init];
        _tableView.dataSource = self;
        [self.view addSubview:_tableView];

        CGFloat ix = 0,iy = 50;
        CGFloat ih = 160;
        _tableView.frame = CGRectMake(ix, iy, SCREEN_WIDTH-2*ix, ih);
    }
    return _tableView;
}

- (UIView *)bottomView{
    if( !_ bottomView ){
        _ bottomView = [[UIView alloc] init];
        [self.view addSubview: _bottomView];

        CGFloat iy = self.tableView.bottom;
        CGFloat ih = 100;
        _bottomView.frame = CGRectMake(0, iy, 180, ih);
    }
    return _bottomView;
}

原因是,设置bottomview的frame时,取到的tableview的bottom是0.
按常理来说,即无论我先调用bottomview还是tableview,最后bottom的y都不应该是0.
最后打断点发现:

当执行 [self.view addSubview:_tableView];这行代码时,会调用tableview的数据源代理方法,此时tableview还没有设置frame,而在tableview的数据源方法中,调用了bottomview,所以此时会设置其frame,但此时因tableview还么有设置frame, 所以取不到 tableview的bottom的值。

总结:当把tableView添加至父视图时,会调用其数据源代理方法。尽量避免在数据源方法中,初始化view的frame。最好把frame设置放在被添加到父视图之前。
上一篇下一篇

猜你喜欢

热点阅读