【问题标题】:Swift 3 incorrect initial UITableViewCell row heightSwift 3 不正确的初始 UITableViewCell 行高
【发布时间】:2017-03-03 10:55:27
【问题描述】:

我正在尝试以编程方式设计我的自定义 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
}

打印语句打印:

单元格高度:44.0

单元格高度:44.0

单元格高度:44.0

单元格高度:44.0

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

单元格高度:166.75

...

我创建了一个名为 GameCell 的自定义表格视图单元格

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,但在我尝试过的任何地方都不起作用。

【问题讨论】:

    标签: ios uitableview swift3


    【解决方案1】:

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

    1. 检查单元格组件的Content Hugging Priority(特别是如果您使用单元格内的堆栈视图
    2. 在你的单元格中添加:

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

    【讨论】:

      【解决方案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
      }
      

      【讨论】:

        【解决方案3】:

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

        func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
            return UITableViewAutomaticDimension;
        }
        

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

        【讨论】:

        • 我希望单元格的高度根据设备的高度而变化,所以我尝试在初始化时设置 rowHeight 成员。但是,每一行都应该具有相同的高度,这就是为什么出于性能原因我避免使用该功能
        • 嗯,我出于好奇尝试了这种方法,但它仍然不起作用。奇怪
        • 那个方法被调用了吗? tableview 的初始化有选项-estimatedRowHeight
        • 是的,刚刚验证了 heightForRow 被调用。但行为仍然相同。也许这是一个苹果的错误?这是我第一次完全在 swift 中创建 tableviewcells(通常我使用 IB),也是我第一次遇到这个问题
        【解决方案4】:

        我在使用 UITableViewDiffableDataSource 时遇到了同样的问题。在我尝试手动滚动内容后,tableView 设置了正确的cell 高度。

        tableView 位于 UIViewController 内部。 dataSource 应用于 viewDidLoad 方法。

        我在viewWillAppear 中使用tableView.reloadData() 重新加载了tableView 内容,问题就解决了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-29
          • 2016-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多