self.view = mainView vs self.view.addSubview(mainView)关于角半径
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了self.view = mainView vs self.view.addSubview(mainView)关于角半径相关的知识,希望对你有一定的参考价值。
我有一个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)
时它很好?
首先在哪里用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成为类实例变量才能在此处访问它。
以上是关于self.view = mainView vs self.view.addSubview(mainView)关于角半径的主要内容,如果未能解决你的问题,请参考以下文章
用于 UILabel 问题的 UITapGesture 选择器