如何设置 image 视图的角半径?

在 Objective-C 中,这样的行

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

它的工作,我尝试它在斯威夫特使用类比

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

这并没有改变什么,弯道还是和以前一样。此外,Xcode 不显示任何语法错误。斯威夫特是否支持任何其他方式来实现这一目标?我在这里检查了一些其他的线程,通常是在 Swift 中完成的,如上所示。

153197 次浏览

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

self.mainImageView.layer.masksToBounds = true

来自 医生:

默认情况下,角半径不适用于 图层的内容属性; 它只适用于背景颜色和 但是,将 masksToBound 属性设置为 True 会导致内容被剪切到圆角

试试这个

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

快速3中的“ CGRectGetWidth”已被属性“ CGRect.width”取代

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

Swift 3.0Xcode8之间有一个微小的差异

无论何时您想将角半径应用到 UIView,请确保调用 在调用 cornerRadius之前。

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

在设置任何图层属性之前,一定要确保所有改变 UiView 大小的效果(Interface Builder 约束等)都被应用。

UIView 类实现示例

class BadgeView: UIView {


override func awakeFromNib() {


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


}
}

Swift 3 Xcode 8 iOS 10

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

最简单的方法是创建一个 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

标记为快速 @IBInspectable(或在 Objective-C 中标记为 IBspectable) ,它们很容易在 Interface Builder 的属性检查员面板中编辑。
可以直接在属性检查器中设置 边界宽度角落半径边界颜色

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

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

Configuring in XCode

Result in emulator

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


}
import UIKit


class BorderImage: UIImageView {


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

根据@DCDC 的回答