自定义 UITableViewCell 的 viewDidLayoutSubviews

Posted

技术标签:

【中文标题】自定义 UITableViewCell 的 viewDidLayoutSubviews【英文标题】:viewDidLayoutSubviews for Custom UITableViewCell 【发布时间】:2017-10-24 08:25:34 【问题描述】:

我想为自定义 TableViewCell 的子视图制作动画。要执行此动画,单元格需要此子视图的宽度,该子视图由自动布局约束布局。

但是,当我在 cellForRowAtIndex 函数 (mycell.animate()) 中使用动画函数时,宽度为 0,因为子视图尚未布局,动画将不起作用。

在常规视图中,我会使用viewDidLayoutSubviews(),因为这样视图被布局,我可以获得宽度并执行动画。但是,自定义 UITableViewCell 的等效函数是什么?

我尝试了TableView的willDisplay委托功能,但是当我打印出单元格子视图的宽度时,它仍然显示0...

【问题讨论】:

您可能必须创建 UITableViewCell 的子类,然后从那里开始。 嗯,我确实有,如果不清楚,对不起 我知道这可能比这更深,但是,您是否尝试将宽度分配给cellForRow:at: 中的表格单元格? cell.frame.size.width = tableView.frame.size.width layoutSubviews 在单元格子类中可能会起作用。 哈哈谢谢@lu2302,它真的很管用!没想到这么容易:) 【参考方案1】:

正确的地方在layoutSubviews里面:

class MyCell : UITableViewCell 
    override func layoutSubviews() 
        super.layoutSubviews()
        // do your thing
    

【讨论】:

嗨,我正在尝试使用这种方法,同时将渐变添加到自定义 UITableViewCell。我在layoutSubviews() 内调用applyGradient() 函数我的问题是,当表格加载时,我看不到渐变,但是在单击单元格后,渐变会显示。知道为什么在单击之前渐变不会显示吗?我尝试从代码中的不同位置调用layoutSubviews(),但没有成功。 @luk2302 @Chamanhm 我遇到了你的问题,上面的代码不需要调用函数,只需将渐变代码放在上面的 tableViewCell 类中的函数中:) 我在为子视图设置阴影时遇到了类似的问题。显然,layoutSubviews 方法在视图被自动布局布局后不会被调用。 (或者由于某种原因它返回 0) layoutSubviews() 在我的情况下不起作用。重用单元格后,渐变框架是错误的,即使我删除了渐变并在重用中再次应用它。在draw(_ rect: CGRect) 中更新框架解决了我的问题【参考方案2】:

如果您在 tableViewCell 中的绘图函数中为视图设置动画,它将起作用

override func draw(_ rect: CGRect) 
    super.draw(rect)

    //Your code here

【讨论】:

以上是关于自定义 UITableViewCell 的 viewDidLayoutSubviews的主要内容,如果未能解决你的问题,请参考以下文章

##DAY12 UITableViewCell自定义

带有自定义 UITableViewCell 的 AVPlayer

自定义 UITableViewCell 的首选方式

自定义UITableViewCell

自定义 UITableViewCell 中的自定义 UIView

自定义 UITableViewCell 按钮单击