我有一个自定义单元格的tableview,它是使用AutoLayout从带有标识符的storyboard构建的.
其中一个子视图需要是圆形的(layer.cornerRadius = width / 2),它在开头是一个正方形.
我在layoutSubviews()中尝试过,但似乎在AutoLayout改变其大小之前调用…同样的事情为didMoveToSuperview()
在AutoLayout更改其大小后,将此类内容更新到我的子视图的正确功能在哪里?
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell_small") as! Cell ... return cell } // In Cell override func layoutSubviews() { rankLabel.layer.cornerRadius = rankLabel.bounds.width/2 rankLabel.layer.masksToBounds = true } override func didMoveToSuperview() { rankLabel.layer.cornerRadius = rankLabel.bounds.width/2 rankLabel.layer.masksToBounds = true }
结果:
解决方法
我最终做的是创建一个名为RoundView的类
class RoundView:UIView { override func layoutSubviews() { super.layoutSubviews() self.layer.cornerRadius = self.bounds.width/2 self.layer.masksToBounds = true } }
然后我将它应用于我需要绕过的每个视图.所以在Storyboard中我将RoundView添加到Custom Class.
发生的事情是,如果您查看故事板(XML)的源代码,每个视图都具有整个屏幕的大小,您可以查看自己的SB代码.因此,通过尝试在其父layoutSubviews()内添加等于width / 2的角半径,子视图未正确设置其框架.所以角半径的值为320/2而不是50/2,这就是它变形的原因.