self.view = mainView vs self.view.addSubview(mainView)关于角半径

时间:2018-01-02 06:03:36

标签: ios swift uiview uikit

我有一个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)时它很好?

1 个答案:

答案 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成为一个类实例变量才能在这里访问它。