我有一个UIView,其周围有一个圆形边框。这是代码:
let v = UIView()
self.view.addSubview(v)
v.backgroundColor = .orange
v.translatesAutoresizingMaskIntoConstraints = false
v.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true
v.rightAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true
v.topAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true
v.heightAnchor.constraint(equalTo: v.widthAnchor).isActive = true
self.view.layoutIfNeeded()
v.layer.cornerRadius = v.frame.width / 2
如果我像这样设置ViewController视图:self.view = mainView
(mainView是MainView的子类,其中包含一些其他子视图),则角半径的结果不再是圆形:Resulting "circle"。
但是,如果我使用self.view.addSubview(mainView)
(并向mainView添加自动布局约束)并将self.view.addSubview(v)
替换为self.mainView.addSubview(v)
,那么该圈就可以了。
为什么只有当我设置self.view = mainView
时,圆圈变得怪异,但是当我self.view.addSubview(mainView)
时它很好?
答案 0 :(得分:0)
首先在哪里用mainView替换UIViewControllers视图?您应该覆盖UIViewController的loadView方法而不是在viewDidLoad方法中执行它。
其次,如果您要更改UIViewControllers视图,那么当您像原始文件一样访问viewDidLoad时,它将不会进行框架设置,因此UIView v获取的布局大小不正确,然后用于确定它的角半径。
第三,你不应该在viewDidLoad中使用layoutIfNeeded,因为这是早期尝试确定主视图的最终布局(一切仍在加载)的方法。你应该做的是重写viewDidLLayoutSubviews方法并在那里设置角半径,如下所示:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
v.layer.cornerRadius = v.frame.width / 2
}
如果UIView v的大小发生变化(方向改变等),那么它也将保持一个圆圈,否则它将只有圆角。
当然,你必须让UIView v成为一个类实例变量才能在这里访问它。