如何在iOS Swift中为UIImage而非UIImageView设置圆角半径

13

有人可以帮我吗...! 我只想为图像设置一个圆角,并且图像还必须适合AspectFit比例。

如果我使用scaleToFill模式,我可以使用下面的代码并且它能正常工作。但是图像会被拉伸。

self.productImg.layer.cornerRadius = 7
self.productImg.clipsToBounds = true

但是当将比例设置为AspectFit时,它显示如下图所示。

绿色所示的是图像视图,在其中图像被设置为aspectFit。

实际图像

Actual image

当给出aspectFit模式时的图像

Image when giving the aspectFit mode

我需要按照实际给定的方式呈现图像,并且还必须带有圆角。因此,请任何人为我提供解决方案。

提前感谢...!


你设置了UIImageView的背景颜色吗? - Anjali Bhimani
是的,但它是为了向您突出显示ImageView。(用于发布) - Abirami Bala
如果有帮助的话,请参考此链接:https://dev59.com/LWkv5IYBdhLWcg3wfA0P - Anjali Bhimani
尝试过了,问题仍然存在。 - Abirami Bala
我还没有找到这个问题的正确解决方案..!有人能帮帮我吗....? - Abirami Bala
3个回答

30
这是一个UIImage的扩展,用于设置其圆角,而不涉及UIImageView。
extension UIImage {
    // image with rounded corners
    public func withRoundedCorners(radius: CGFloat? = nil) -> UIImage? {
        let maxRadius = min(size.width, size.height) / 2
        let cornerRadius: CGFloat
        if let radius = radius, radius > 0 && radius <= maxRadius {
            cornerRadius = radius
        } else {
            cornerRadius = maxRadius
        }
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        let rect = CGRect(origin: .zero, size: size)
        UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).addClip()
        draw(in: rect)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}   

使用方法:

yourUIImage.withRoundedCorners(radius: 10)

2
仅提供代码不是答案,请提供解释(并正确格式化)。 - matt
谢谢,它运行得很好,为你的努力点赞! - Abirami Bala
第4行中的size是什么?! - Mor4eza
1
size是UIImage的一个属性(self.size,其中self是UIImage)。它可用,因为我们在UIImage的扩展内部。 - astghik

2
您可以尝试使用AspectFill模式,而不是AspectFit。 使用AspectFill,图像将完全填充imageView,并且会有圆角。

是的,我已经尝试过了。但是这样会裁剪图像。(完整的图像没有显示) - Abirami Bala
1
在这种情况下,如果需要完整显示图像而不裁剪任何小部分,则应在Storyboard中为您的imageView设置适当的约束条件。 检查您的图像的纵横比(例如在Photoshop中),并将“Aspect Ratio”约束条件设置为相同的值。 - Anton Novoselov
我已经尝试了,问题依然存在。 - Abirami Bala

-2

与安东的答案类似,但有一个小变化:

将UIImageView放置在通用UIView中,该UIView充当容器,您可以控制其圆角半径。

示例:

let containerView = UIView()
containerView.layer.cornerRadius = 15
containerView.layer.masksToBounds = true //maybe not necessary
//set some width and height in a CGRect()

let imageView = UIImageView()
containerView.addSubview(imageView)
imageView.frame = containerView.bounds
imageView.contentMode = .scaleAspectFill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接