3

我想在 UITableViewCell 内创建一个圆形 UIView (myView)

在 iOS 10 之前,我曾经func awakeFromNib()这样做过:

class MyCell: UITableViewCell {

@IBOutlet var myView: UIView!

    override func awakeFromNib() {
      super.awakeFromNib()

      print(myView.bounds.height)
      myView.layer.cornerRadius = myView.bounds.height/2
      myView.layer.masksToBounds = true
    }
}

myViewheight 和 with通过我的故事板中的 AutoLayout 约束设置为30 。

但在控制台中print(myView.bounds.height)显示1000.0 。所以圆角半径指令将半径设置为500myView完全消失。

iOS 10的UITableViewCell生命周期有变化吗?在 iOS 10 中设置 view.bounds 的功能是否发生了变化?如何cornerRadius在 iOS 10 中将我的视图高度设置为一半?

这是重现该问题的最小项目

为了得到接近我想要的结果,我需要在我的UITableViewController

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    tableView.reloadData()
}

但我很确定这不是最佳选择......

4

3 回答 3

3

我遇到了同样的问题,并找到了两种解决方法。两者都强制单元格布局子视图

第一个解决方案:

override func awakeFromNib() {
    super.awakeFromNib()
    self.setNeedsLayout()
    self.layoutIfNeeded()
 }

第二种方式:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
      cell.setNeedsLayout()
      cell.layoutIfNeeded()
return cell
}
于 2016-09-20T05:40:15.883 回答
0

我的观察是,iOS 10 / TVOS 10 在调用 awakeFromNib 之前没有布置基于自动布局的视图,而是在调用相同方法之前使用自动调整大小的掩码来布置视图。

删除自动布局约束并在情节提要中使用新的自动调整大小设置为我解决了这个问题。

自动调整大小设置

对我来说,这使得 Autolayout 不如 autoresizing mask 可靠。退出自动布局后,我还“感觉”到了性能提升。我不能肯定地说,因为我在 TVOS 上,而 Core Animation 工具不适用于 TVOS。

于 2016-09-24T22:56:53.930 回答
0

在询问子视图的边界时,我遇到了完全相同的问题,大小相同,为1000.0 。

由于框架边界值不再可靠,我不得不为我的故事板中定义的高度约束声明一个 IBOutlet 并使用它来设置我的子视图的角半径。

class MyCell: UITableViewCell {

@IBOutlet var myView: UIView!
@IBOutlet var myViewHeightConstraint: NSLayoutConstraint!

    override func awakeFromNib() {
        super.awakeFromNib()

        print(myView.bounds.height)
        myView.layer.cornerRadius = myViewHeightConstraint.constant / 2
        myView.layer.masksToBounds = true
      }
}

这将使您能够删除reloadData您所说的实际上不是最佳的呼叫。

于 2016-09-20T00:32:32.513 回答