更新UITableViewCell内的UILabel帧

时间:2017-01-27 22:28:30

标签: ios swift uitableview tableviewcell

我正在尝试更新包含待办事项标题的uilabel框架,以便在没有待办事项描述时将其垂直居中。

以下是cellForRowAt indexPath

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell : customCell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! customCell

    // Configure the cell...

    let todo = todos[indexPath.row]

    cell.setup(todo: todo.title, todoDescription : todo.todoDescription)

    return cell
}

并在自定义单元格类中:

import UIKit

class customCell: UITableViewCell {

let titleLabel: UILabel! = UILabel(...) //cenvenience initializer setting the uilabel frame
let descriptionLabel: UILabel! = UILabel(...)

func setup(todo : String, todoDescription : String?) {

    titleLabel.text = todo

    if let todo_descr = todoDescription {
        descriptionLabel.text = todo_descr
    } else {
        descriptionLabel.text = ""
        titleLabel.frame = ... //update the frame of the todo title to be centered vertically in the cell, basically change the y of the frame
    }

}

override func layoutSubviews() {
    super.layoutSubviews()
    titleLabel.frame = ... //initial frame, which is not centered vertically
    descriptionLabel.frame = ...

    contentView.addSubview(titleLabel)
    contentView.addSubview(descriptionLabel)
}

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
}

}

当我打印titleLabel帧时,它会打印所需的帧属性。但是在模拟器中,框架仍然是layoutSubviews中标签的框架。

我在self.layoutIfNeeded()函数中尝试了setup,但它无效。如果todo描述存在或缺乏,我如何更新单元格子视图?

2 个答案:

答案 0 :(得分:0)

在cellForRowAtIndexPath中调用

cell.setup(todo: todo.title, todoDescription : todo.todoDescription)

在此方法中,您可以垂直设置titleLabel中心的框架,并且一切正常。 但是在该单元格调用方法layoutSubviews()之后,在此方法中,您将标签框架设置为initial,而不是依赖于描述文本。

titleLabel.frame = ... //initial frame, which is not centered vertically
descriptionLabel.frame = ...

所有标签都设置在初始帧上。 问题是在setup()方法之后调用layoutSubviews()方法。 因此无需在layoutSubviews方法中设置标签框架。他们已经在label initializer或setup()方法中设置了右框架。

答案 1 :(得分:0)

这种方式非常少,请使用UITableViewCell

设计Auto Layout Constraints,如下所示

UItableViewCell Design

  1. Todo标题将是静态高度
  2. 在属性中将Todo描述的行数设置为0。因此,当没有描述时,Todo描述会自动将其高度降低到零。因为我们在高度计算方法中添加了UITableViewAutomaticDimension
  3. 然后在视图控制器中添加这两个数据源方法

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return UITableViewAutomaticDimension;
    }
    
    
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
        return UITableViewAutomaticDimension;
    }