使用BezierPath圆角化UITableViewCell的子视图时显示错误

时间:2018-10-25 12:08:39

标签: ios swift

即使我已经解决了这个问题,我仍然想问这个问题的原因和/或解决方案。因为将来很有可能我需要一种更好的方法。我所拥有的解决方案将发布在帖子的末尾。

问题是,当我调整标签视图(容器)的宽度约束时,将其延长,backgroundColor不会填充整个视图(或更确切地说,视图(容器)正在被切割,但是调试视图层次结构,容器等于imageView的尾随。请参见屏幕截图:

enter image description here

该错误是由使用UIBezierPath引起的:

/// Round the corner radius with bezier path.
func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
    let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
    let mask = CAShapeLayer()
    mask.path = path.cgPath
    self.layer.mask = mask
}

我习惯使用UIBezierPathlayer.cornerRadius自动布局和圆角化。如果我不使用UIBezierPath,则不会发生该错误。

更多信息是,我通常在setupCell()期间在称为cellForRow的单元格中调用一个方法。在这种方法中,我根据数据确定约束值之类的东西。然后更新约束。

我尝试过的事情:

  1. 在单元格的UIBezierPath内使用drawRect()来圆角化。
  2. 在覆盖的UIBezierPath内使用func layoutSubviews()来拐角。
  3. 将所有内容放入主线程。
  4. 确定视图(容器)的新宽度常数后,调用self.setNeedsDisplay()

我已实施且有效的当前解决方案:

不要使用UIBezierPath而不是layer.cornerRadius,使用它可以绕过所有角落,但是由于视图(容器)位于imageView的底部和尾部,因此我只添加了一个偏移量/ inset以使其超出imageView的底部和尾部,并且imageView的clipsToBounds设置为true。

所以问题是:为什么会发生这种情况,又有什么其他方法可以解决呢?

该问题的目的是为了将来的情况,例如假设视图(容器)位于单元格的中心,并且topLeft角是唯一要舍入的角? :)

谢谢!

0 个答案:

没有答案