在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中完成的。
答案 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)
答案 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
}
}
}
答案 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