Swift 3不正确的初始UITableViewCell行高

时间:2017-03-03 10:55:28

标签: ios uitableview swift3

我正在尝试以编程方式设计我的自定义UITableView单元格的布局。但是,我得到一些奇怪的行为:尽管设置了rowHeight,前四行是默认高度,然后其余的是我指定的。这会影响我的单元格的设计,因为我会以编程方式部署行高度来布置标签。

我按如下方式初始化tableview:

func gameTableInit() {
    gameTableView = UITableView()
    gameTableView.delegate = self
    gameTableView.dataSource = self

    let navFrame = self.navigationController?.view.frame
    gameTableView.frame = CGRect(x: navFrame!.minX, y: navFrame!.maxY, width: self.view.frame.width, height: self.view.frame.height - navFrame!.height - (self.tabBarController?.view.frame.height)!)
    gameTableView.rowHeight = gameTableView.frame.height/4 //HEIGHT OF TABLEVIEW CELL
    gameTableView.register(GameCell.self, forCellReuseIdentifier: "cell")

    self.view.addSubview(gameTableView)

}

这是我的cellForRowAtIndexPath函数:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! GameCell
    print("height of cell: \(cell.frame.height)")
    var game = Game()
    game.awayTeam = "CLE"
    game.homeTeam = "GSW"
    cell.setUIFromGame(g: game)
    return cell
}

print语句打印:

  

细胞高度:44.0

     

细胞高度:44.0

     

细胞高度:44.0

     

细胞高度:44.0

经过一些滚动后,它会打印出预期的:

  

细胞高度:166.75

     

...

我创建了一个名为GameCell

的自定义tableview单元格
class GameCell: UITableViewCell {

    override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        positionUIElements()
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }


    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    //on left
    var awayTeamAbbrev = UILabel()
    var awayTeamLogo: UIImage!

    //on right
    var homeTeamAbbrev = UILabel()
    var homeTeamLogo: UIImage!



    func positionUIElements() {
        //away team abbreviation is centered on upper left half of cell
        awayTeamAbbrev.frame = CGRect(x: self.frame.minX, y: self.frame.minY, width: self.frame.midX, height: self.frame.height/4)
        awayTeamAbbrev.textAlignment = .center
        awayTeamAbbrev.adjustsFontSizeToFitWidth = true
        //awayTeamLogo

        //home team abbreviation is centered on upper right half of cell
        homeTeamAbbrev.frame = CGRect(x: self.frame.midX, y: self.frame.minY, width: self.frame.midX, height: self.frame.height/4)
        homeTeamAbbrev.textAlignment = .center
        homeTeamAbbrev.adjustsFontSizeToFitWidth = true

        //homeTeamLogo

        self.contentView.addSubview(awayTeamAbbrev)
        self.contentView.addSubview(homeTeamAbbrev)
    }

    func setUIFromGame(g: Game) {
        awayTeamAbbrev.text = g.awayTeam!
        homeTeamAbbrev.text = g.homeTeam!
    }

}

我在网上尝试了许多建议的答案,比如调用layoutIfNeeded,但是在我尝试的任何地方都没有用。

3 个答案:

答案 0 :(得分:2)

我找到了一个有效的解决方案:在我的GameCell课程中,我重写了布局子视图:

override func layoutSubviews() {
    super.layoutSubviews()
    self.contentView.layoutIfNeeded()
    positionUIElements()
    self.awayTeamAbbrev.preferredMaxLayoutWidth = self.awayTeamAbbrev.frame.size.width
    self.homeTeamAbbrev.preferredMaxLayoutWidth = self.homeTeamAbbrev.frame.size.width
}

答案 1 :(得分:2)

虽然接受的答案在某些情况下可能会有所帮助,但我想分享一些其他方法来解决此问题:

  1. 检查单元格组件的 Content Hugging Priority (尤其是在单元格内部使用 stack视图的情况下)
  2. 在您的单元格中添加:

    override func didMoveToSuperview() {
    super.didMoveToSuperview()
    layoutIfNeeded() 
    

答案 2 :(得分:0)

44是UITableView中UITableViewCell的defailt高度,尝试覆盖func

df.groupby(0).rank().style.background_gradient()

或返回准确值,在您的情况下为166.75

相关问题