【问题标题】:Set UIView's corner radius to half of the view's width automatically自动将 UIView 的角半径设置为视图宽度的一半
【发布时间】:2019-01-22 23:58:31
【问题描述】:

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

【问题讨论】:

    标签: ios swift cornerradius


    【解决方案1】:

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

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

    【讨论】:

    • 添加super.layoutSubviews()imo 通常是个好主意。
    • @TravisGriggs 啊,当然,感谢您的评论。我更新了答案:))
    • 我实际上没有考虑就这样做了,几乎就像标准程序恕我直言:D 但是感谢提示和更新的答案伙计们?
    【解决方案2】:

    通过观察 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
     }()
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 问题是容器视图什么时候才能知道子视图的实际大小?因为在 init() 方法中,它告诉我 512px 而实际上它是 60。
      • 好吧,我认为它无法知道 init 方法中的实际大小,因为它的框架是由呈现它的控制器设置的。您可以在 init 中设置框架,但它可以由控制器更改。因此,您可以尝试在控制器中访问它并添加圆角半径,而不是在 init 方法中。
      猜你喜欢
      • 2015-01-02
      • 2015-04-10
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2019-05-14
      • 2020-09-23
      相关资源
      最近更新 更多