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一样,但谢谢你们的提示和更新的答案