如何设置imageView的圆角半径?

78

在 Objective-C 中,这条代码

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0f;

它很有效,我用类比法在Swift中尝试过

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0

并且它不会改变任何东西,四个角还是和以前一样。此外,Xcode没有显示任何语法错误。Swift是否支持其他方法来实现这个目标?我在这里检查了一些其他线程,通常都是用上面展示的方式在Swift中完成。


self.mainImageView.layer.cornerRadius = (self.mainImageView.frame)/2.0 - Kirit Modi
"CGRect 无法转换为 double" - theDC
self.mainImageView.layer.cornerRadius = (self.mainImageView.frame.size.height)/2.0 不起作用。 - theDC
10个回答

189

图层绘制超出剪裁区域,您需要将其设置为“遮罩边界”:

self.mainImageView.layer.masksToBounds = true

根据文档

默认情况下,圆角半径不适用于图层内容属性中的图像;它仅适用于图层的背景颜色和边框。然而,将masksToBounds属性设置为true会导致内容被剪切成圆角。


我错过了那一行,现在完美地运作了,谢谢 @DarthMike! - theDC
在从URL获取图像并将其设置到ImageView后,此答案对于RoundCorner是正确的。 - iman kazemayni
我的小伙子好棒啊! - rolandforbes

37

Swift 3.0Xcode8中有一个微小的区别。

每当您想将圆角应用于UIView时,请确保在调用cornerRadius之前调用yourUIView.layoutIfNeeded()

否则,它将返回UIView高度和宽度的默认值(1000.0),这可能会使您的View消失。

始终确保在设置任何图层属性之前应用所有更改UIView大小的效果(接口构建器约束等)。

UIView类实现示例

class BadgeView: UIView {

  override func awakeFromNib() {

    self.layoutIfNeeded()
    layer.cornerRadius = self.frame.height / 2.0
    layer.masksToBounds = true

   }
 }

在更新到Swift 3.0之后,我也需要使用masksToBounds才能使其正常工作。 - erics

26
您可以通过提供“用户定义的运行时属性”来定义任何视图的边框半径,提供类型为字符串的键路径“layer.cornerRadius”,然后提供所需的半径值 ;) 请参见下面附加的图片:

在XCode中配置

模拟器中的结果


这是一个简洁明了的解决方案。 - Vincent Gigandet

19

试一下

self.mainImageView.layer.cornerRadius = CGRectGetWidth(self.mainImageView.frame)/4.0
self.mainImageView.clipsToBounds = true

11

在Swift中使用@IBInspectable(或者Objective-C中的IBInspectable)标记,可以轻松地在Interface Builder的属性检查器面板中进行编辑。
您可以在属性检查器中直接设置borderWidthcornerRadiusborderColor

extension UIView {

  @IBInspectable var cornerRadius: CGFloat {

   get{
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
        layer.masksToBounds = newValue > 0
    }
  }

  @IBInspectable var borderWidth: CGFloat {
    get {
        return layer.borderWidth
    }
    set {
        layer.borderWidth = newValue
    }
  }

  @IBInspectable var borderColor: UIColor? {
    get {
        return UIColor(cgColor: layer.borderColor!)
    }
    set {
        layer.borderColor = borderColor?.cgColor
    }
  }
}

这里输入图片描述


边框颜色无法正常工作,始终返回黑色。 - Joe Sene
@JoeSene layer.borderColor = borderColor?.cgColor 是错误的,只需像这样更新它:layer.borderColor = newValue?.cgColor - Phuc Dang

7
在Swift 3中,'CGRectGetWidth'已被属性'CGRect.width'所取代。
    view.layer.cornerRadius = view.frame.width/4.0
    view.clipsToBounds = true

6

Swift 3、Xcode 8、iOS 10

DispatchQueue.main.async {
  self.mainImageView.layer.cornerRadius = self.mainImageView.bounds.size.width / 2.0
  self.mainImageView.clipsToBounds = true
}

1
从主线程调用对我很有帮助,因为我在willDisplay tableView代理方法中对我的tableView单元格的子视图containerView进行了四舍五入。如果不从主线程调用它,则框架会出错。 - fredericdnd

4
我创建了一个UIView扩展,允许圆角化特定的角落:
import UIKit

enum RoundType {
    case top
    case none
    case bottom
    case both
}

extension UIView {

    func round(with type: RoundType, radius: CGFloat = 3.0) {
        var corners: UIRectCorner

        switch type {
        case .top:
            corners = [.topLeft, .topRight]
        case .none:
            corners = []
        case .bottom:
            corners = [.bottomLeft, .bottomRight]
        case .both:
            corners = [.allCorners]
        }

        DispatchQueue.main.async {
            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
        }
    }

}

4
import UIKit

class BorderImage: UIImageView {

    override func awakeFromNib() {
        self.layoutIfNeeded()
        layer.cornerRadius = self.frame.height / 10.0
        layer.masksToBounds = true
    }
}

根据@DCDC的回答。

3

最简单的方法是创建一个UIImageView的子类(我已经尝试过,它在iPhone 7和Xcode 8上完美运行):

class CIRoundedImageView: UIImageView {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func awakeFromNib() {

        self.layoutIfNeeded()
        layer.cornerRadius = self.frame.height / 2.0
        layer.masksToBounds = true
    }
}

然后你也可以设置边框:

imageView.layer.borderWidth = 2.0

imageView.layer.borderColor = UIColor.blackColor().CGColor

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