UIImageView.layer.cornerRadius 在不同像素密度上创建圆形图像的问题 ios

Posted

技术标签:

【中文标题】UIImageView.layer.cornerRadius 在不同像素密度上创建圆形图像的问题 ios【英文标题】:issues with UIImageView.layer.cornerRadius to create rounded images on different pixel densities ios 【发布时间】:2015-02-15 00:33:35 【问题描述】:

我只是想创建一个完美的圆形图像。这是我的快速代码:

myImage.layer.cornerRadius = myImage.frame.size.width/2
myImage.layer.masksToBounds = true

这适用于 4s,但在 5s 上不是很圆,在 iphone 6 上显示为圆角矩形。

我假设这与 frame.size.width 以像素而不是点或类似的形式返回值有关,但我一直无法解决这个问题。

【问题讨论】:

你把这段代码放在哪里?我想知道这是否是自动布局问题,并且在您适当设置其角半径后图像正在拉伸......例如,如果它在 viewDidLoad 中,请尝试将其移动到 viewDidLayoutSubviews 【参考方案1】:

如果您将该代码放入 viewDidLoad,请尝试将其移至 viewDidLayoutSubviews

我猜这是一个自动布局问题 - 尽管您已经适当地使用了圆角半径属性并且实际上使图像框架为圆形,但在自动布局之后,圆角半径保持不变,但图像会拉伸这样它就不再是圆形的了。

【讨论】:

如何在 UICollection 视图中显示圆形 UIImage。我正在从 api 的 collectionView 的 cellForItemAtIndexPath 函数中加载图像。 @Dashrath 在设置图层属性之前调用 yourCell.layoutIfNeeded()。 我添加了 cell.itemThumb.layer.cornerRadius = cell.itemThumb.frame.size.height/2; cell.itemThumb.clipsToBounds = true;cell.itemThumb.layoutIfNeeded();但静止图像显示圆角。我又错过了什么吗? @Dashrath Set layoutIfNeeded before 设置层的属性。 @Dashrath 你是我的英雄!一直试图解决这个问题,认为问题出在 collectionViewLayout 并且尝试 invalidateLayout 无济于事【参考方案2】:

如果您的代码在viewDidLoad 中的ViewController 中,请尝试将其移至viewDidLayoutSubviews

如果您的圆形 imageView 在 tableViewCell 中,请尝试将其移动到 draw

override func draw(_ rect: CGRect) 
    avatarView.layer.cornerRadius = avatarView.frame.size.width / 2
    avatarView.layer.masksToBounds = true
    avatarView.clipsToBounds = true
    avatarView.contentMode = .scaleAspectFill

【讨论】:

【参考方案3】:

问题是,如果您更改 Any 视图的cornerRadius,并希望它看起来像一个圆形,那么该视图必须是一个正方形。

现在,由于不同的设备和不同的设备大小,你的图像视图的大小可能会改变,它可能是一个矩形。

例如 如果你查看的是 50 * 50

myImage.layer.cornerRadius = myImage.frame.size.width/2

这将在两侧添加 25 的角无线电以使其成为一个圆圈。

但由于设备更改的自动布局,您的视图可能是 50 * 80

拐角半径会加25,但是由于高度是80,所以两边加25,剩下的30不会是曲线,看起来是直的。

您可以尝试在故事板中以各种方向查看屏幕并更改自动布局约束(或结构和弹簧)以确保图像视图在所有设备中都是正方形

【讨论】:

但是 OP 没有使用 view.frame 大小来设置图像角半径,所以这不是问题......【参考方案4】:
override func viewDidLayoutSubviews() 
super.viewDidLayoutSubviews()

  myImage.layer.cornerRadius  = myImage.frame.size.width/2
  myImage.layer.masksToBounds = true

【讨论】:

你应该在函数的第一行添加super.viewDidLayoutSubviews()这一行。【参考方案5】:

这应该可行:

myImage.layer.cornerRadius = myImage.**bounds**.size.width/2
myImage.layer.masksToBounds = true

【讨论】:

以上是关于UIImageView.layer.cornerRadius 在不同像素密度上创建圆形图像的问题 ios的主要内容,如果未能解决你的问题,请参考以下文章