为了补充
答案和
附加信息, 我用Swift创建了一个简单易用的
UIView
. 根据您的使用情况, 您可能需要进行修改(避免在每个布局上创建对象等), 但我想保持它尽可能简单。这个扩展可以让您更容易地将其应用于其他视图(例如
UIImageView
), 如果您不喜欢子类化的话。
extension UIView {
func roundCorners(_ roundedCorners: UIRectCorner, toRadius radius: CGFloat) {
roundCorners(roundedCorners, toRadii: CGSize(width: radius, height: radius))
}
func roundCorners(_ roundedCorners: UIRectCorner, toRadii cornerRadii: CGSize) {
let maskBezierPath = UIBezierPath(
roundedRect: bounds,
byRoundingCorners: roundedCorners,
cornerRadii: cornerRadii)
let maskShapeLayer = CAShapeLayer()
maskShapeLayer.frame = bounds
maskShapeLayer.path = maskBezierPath.cgPath
layer.mask = maskShapeLayer
}
}
class RoundedCornerView: UIView {
var roundedCorners: UIRectCorner = UIRectCorner.allCorners
var roundedCornerRadii: CGSize = CGSize(width: 10.0, height: 10.0)
override func layoutSubviews() {
super.layoutSubviews()
roundCorners(roundedCorners, toRadii: roundedCornerRadii)
}
}
以下是如何将其应用于UIViewController
:
class MyViewController: UIViewController {
private var _view: RoundedCornerView {
return view as! RoundedCornerView
}
override func loadView() {
view = RoundedCornerView()
}
override func viewDidLoad() {
super.viewDidLoad()
_view.roundedCorners = [.topLeft, .topRight]
_view.roundedCornerRadii = CGSize(width: 10.0, height: 10.0)
}
}
drawRect(_:)
方法,否则即使是空实现也会影响性能。每次创建新的遮罩层也是不必要的。你实际上只需要在视图边界发生变化时更新遮罩层的path
属性,而这个操作应该在layoutSubviews()
方法的重写中完成。 - Stuart