【问题标题】:UITableViewCell - When are the bounds properly set in iOS 10UITableViewCell - 何时在 iOS 10 中正确设置边界
【发布时间】:2017-01-20 07:14:14
【问题描述】:

我想在 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
    }
}

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

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

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

Here is a minimal projet to reproduce the issue

要获得接近我想要的结果,我需要在UITableViewController 中添加:

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

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

【问题讨论】:

    标签: uitableview ios10 swift2.3


    【解决方案1】:

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

    由于 framebounds 值不再可靠,我不得不为我的故事板中定义的高度约束声明一个 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 调用,这确实不是您所说的最佳选择。

    【讨论】:

    • 是的,我也使用这个解决方案,它可以工作......,但它仍然是我的工作:/
    • 有点,是的,但它是最有效的,因为它不需要任何代价高昂的重新加载或重新布局。
    【解决方案2】:

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

    第一个解决方案:

    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
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多