Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设置UIView';s角半径为视图的一半';自动调整宽度_Ios_Swift_Cornerradius - Fatal编程技术网

Ios 设置UIView';s角半径为视图的一半';自动调整宽度

Ios 设置UIView';s角半径为视图的一半';自动调整宽度,ios,swift,cornerradius,Ios,Swift,Cornerradius,我有一些视图的大小不是硬编码的,而是通过约束确定的,我需要这些视图是圆形的。 是否有方法“动态”设置cornerRadius属性,例如根据对象的实际大小设置? 我知道,如果此视图位于UIViewController中,我可以通过roundView.frame.width获取宽度,并在其中设置layer.cornerRadius属性,但圆形视图不包含在viewController中,而是由另一个简单的UIView管理。 提前谢谢你 Dave您可以覆盖视图类的layoutSubviews方法并在那里

我有一些视图的大小不是硬编码的,而是通过约束确定的,我需要这些视图是圆形的。
是否有方法“动态”设置cornerRadius属性,例如根据对象的实际大小设置?
我知道,如果此视图位于UIViewController中,我可以通过
roundView.frame.width
获取宽度,并在其中设置layer.cornerRadius属性,但圆形视图不包含在viewController中,而是由另一个简单的UIView管理。
提前谢谢你

Dave

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

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

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

通过观察关键路径,使用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
method,通过声明代码似乎更简单,而不是分布在两个地方。特别是,逻辑通常存在于项目中

这样称呼:

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

问题是容器视图何时知道子视图的实际大小?因为在init()方法中,它告诉我512px,而实际上它是60。我认为它无法知道init方法中的实际大小,因为它的帧是由呈现它的控制器设置的。你可以在init中设置帧,但它可以由控制器更改。因此,您可以尝试在控制器中访问它并添加角半径,而不是在init方法中。通常,添加
super.layoutSubviews()
imo是个好主意。@TravisGriggs啊,当然,谢谢您的评论。我更新了答案:))实际上我没有考虑就这么做了,几乎就像标准程序imho:D一样,但谢谢你们的提示和更新的答案