gpt4 book ai didi

ios - self.view = mainView 与 self.view.addSubview(mainView) 关于角半径

转载 作者:行者123 更新时间:2023-11-30 11:53:39 30 4
gpt4 key购买 nike

我有一个 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 View :self.view = mainView(mainView是MainView的子类,其中包含一些其他 subview ),那么圆角半径的结果不再是圆: Resulting "circle" .

但是,如果我使用 self.view.addSubview(mainView) (并向 mainView 添加自动布局约束)并将 self.view.addSubview(v) 替换为 self.mainView.addSubview(v) 那么圆圈就很好了。

为什么只有当我设置 self.view = mainView 时,圆圈才会变得奇怪,而当我设置 self.view.addSubview(mainView) 时,圆圈就正常了?

最佳答案

首先,您在哪里用 mainView 替换 UIViewControllers View ?您应该重写 UIViewController 的 loadView 方法,而不是在 viewDidLoad 方法中执行此操作。

其次,如果您要更改 UIViewControllers View ,那么当您像原来一样进入 viewDidLoad 时,它不会有框架设置,因此 UIView v 会获取不正确的布局大小,然后使用该大小来确定其角半径。

第三,您不应该在 viewDidLoad 中使用layoutIfNeeded,因为这是尝试确定主视图的最终布局的方式(一切仍在加载中)。您应该做的是重写 viewDidLLayoutSubviews 方法并在那里设置角半径,如下所示:

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
v.layer.cornerRadius = v.frame.width / 2
}

它的作用还在于,如果 UIView v 的大小发生变化(方向变化等),那么它将保持新大小的圆形,否则它将只有圆角。

当然,您必须将 UIView v 设为类实例变量才能在此处访问它。

关于ios - self.view = mainView 与 self.view.addSubview(mainView) 关于角半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48056226/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com