自动将 UIView 的角半径设置为视图宽度的一半

Set UIView's corner radius to half of the view's width automatically

我有一些视图的大小不是硬编码的,而是通过约束确定的,我需要这些视图是圆形的。
有没有办法设置 cornerRadius 属性 "dynamically",例如取决于对象的实际大小?
我知道如果这个视图在 UIViewController 中,我可以通过 roundView.frame.width 获取宽度并在那里设置 layer.cornerRadius 属性,但是圆形视图不包含在 viewController, 但由另一个简单的 UIView 管理。
提前致谢!
戴夫

您可以覆盖 View class 的 layoutSubviews 方法并在那里设置 cornerRadius 值。假设您希望 cornerRadius 是视图宽度的一半:

override func layoutSubviews() {
    super.layoutSubviews()
    self.layer.cornerRadius = self.bounds.width * 0.5
}

只需通过包含它们的简单视图访问它们。如果您的简单容器视图没有将这些圆形视图作为实例,那么您可以通过遍历其子视图数组来访问它们。 当您获得视图时,您可以访问他们的 frame.size.width 并将 layer.corner 半径 属性 设置为该值。

通过观察 Key Path 使用 RxSwift 很容易实现这一点。

extension UIView{

    func cornerHalf(){
        clipsToBounds = true
        rx.observe(CGRect.self, #keyPath(UIView.bounds))
            .subscribe(onNext: { _ in
                self.layer.cornerRadius = self.bounds.width * 0.5
            }).disposed(by: rx.disposeBag)
    }
}

直接在init方法中调用,声明的代码看起来更简单,而不是分布在两个地方。尤其是你项目中普遍存在的逻辑。

这样调用:

 let update: UIButton = {
     let btn = UIButton()
     // more config
     btn.cornerHalf()
     return btn
 }()