图像视图不是一个完美的圆圈

时间:2018-06-04 14:04:48

标签: ios swift autolayout

我有UITableViewCell,其中包含UIImageView

图像视图应该是圆形,所以我使cornerRadius等于其高度的一半。问题是如果图像不够大(图像视图的宽度/高度约束,而不是图像本身),则不能正确舍入。如果我增加约束,一切都会正常工作。

图像是正方形,图像视图也具有1:1的比率约束。 知道问题是什么吗?

我在awakeFromNib中调用它:

private func setUpCellDesign() {
    profileImageView.layer.cornerRadius = profileImageView.frame.height / 2
    profileImageView.clipsToBounds = true
    mainView.layer.cornerRadius = 15

}

我注意到即使我在单元格中添加其他元素并尝试以相同方式对角落进行圆角处理(例如带圆角的按钮),它也无法正常工作。

4 个答案:

答案 0 :(得分:1)

这种情况正在发生,因为角半径大于min(view.frame.width, view.frame.height) / 2,这是因为在单元格具有最终帧之前调用了setUpCellDesign()

我建议创建一个UIImageView子类,我命名为CircularImageView,并按照以下方式实现:

class CircularImageView: UIImageView {
  override func layoutSubviews() {
    super.layoutSubviews()
    clipsToBounds = true
    layer.cornerRadius = min(frame.width, frame.height) / 2
  }
}

这将确保无论大小如何,图像视图都将尽可能为圆形,如果它是一个矩形,则角半径将适应最短边,以防止您获得尖角。

答案 1 :(得分:0)

您的单元格布局 - 子视图似乎有问题 - 您需要更多的自动布局机制周期

您可以通过覆盖layoutSubViews来解决此问题,并将您编写的剪辑代码放在那里。

  

只有在自动调整和时,才应覆盖此方法   子视图的基于约束的行为不提供行为   你要。您可以使用实现来设置框架矩形   您的子视图直接。

答案 2 :(得分:0)

Jsut在layoutSubviews中调用它,因为所有子视图现在都有其真实的框架

  override func layoutSubviews() {
              super.layoutSubviews()
                profileImageView.layer.cornerRadius = profileImageView.frame.height / 2
            profileImageView.clipsToBounds = true
            mainView.layer.cornerRadius = 15
    }

答案 3 :(得分:0)

如果您确切知道要显示的图片视图的大小,只需使用该尺寸而不是调用它profileImageView.frame.height。这样就无需覆盖layoutSubviews