美文网首页
UITabelView 加载数据,导致其他视图的Frame不正确

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

作者: 生命不止运动不息 | 来源:发表于2019-04-30 19:29 被阅读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设置放在被添加到父视图之前。

    相关文章

      网友评论

          本文标题:UITabelView 加载数据,导致其他视图的Frame不正确

          本文链接:https://www.haomeiwen.com/subject/qeqbnqtx.html