如何设置imageView的角半径?

时间:2015-01-09 13:13:31

标签: ios swift uiimageview cornerradius

在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中完成的。

11 个答案:

答案 0 :(得分:143)

图层绘制出剪辑区域,您需要将其设置为屏蔽边界:

self.mainImageView.layer.masksToBounds = true

来自docs

  

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

答案 1 :(得分:27)

Swift 3.0 Xcode8

之间存在一个微小差异

每当您想要将角半径应用于UIView时,请务必致电 在致电yourUIView.layoutIfNeeded()之前cornerRadius

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

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

UIView类实现的示例

class BadgeView: UIView {

  override func awakeFromNib() {

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

   }
 }

答案 2 :(得分:13)

试试这个

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

答案 3 :(得分:12)

您可以定义任何视图的边界半径,提供"用户定义的运行时属性",提供关键路径" layer.cornerRadius"类型字符串,然后你需要的半径值;) 见下面的附图:

Configuring in XCode

Result in emulator

答案 4 :(得分:5)

在swift 3中'CGRectGetWidth'已被属性'CGRect.width'取代

    view.layer.cornerRadius = view.frame.width/4.0
    view.clipsToBounds = true

答案 5 :(得分:5)

在swift中标记为@IBInspectable(或在Objective-C中标记为IBInspectable),可以在Interface Builder的属性检查器面板中轻松编辑它们。
您可以在属性检查器中直接设置 borderWidth cornerRadius borderColor

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
    }
  }
}

enter image description here

答案 6 :(得分:4)

Swift 3,Xcode 8,iOS 10

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

答案 7 :(得分: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

答案 8 :(得分:3)

我创建了一个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
        }
    }

}

答案 9 :(得分:1)

import UIKit

class BorderImage: UIImageView {

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

基于@DCDC的答案

答案 10 :(得分:-1)

在Swift中尝试:

self.photoView.layer.cornerRadius = self.photoView.frame.height/2