在 viewDidLoad 中添加子视图有奇怪的行为 [重复]

Posted

技术标签:

【中文标题】在 viewDidLoad 中添加子视图有奇怪的行为 [重复]【英文标题】:Adding subview in viewDidLoad has strange bahavior [duplicate] 【发布时间】:2020-04-22 12:12:35 【问题描述】:

我在下面的viewDidload() 方法中手动创建greenView 并将其添加到miidLeView,但它在生成的屏幕中的坐标是错误的?这是什么原因?应该在哪里添加到middleView?谢谢。

class ViewController: UIViewController 

    @IBOutlet weak var redView: UIView!

    var greenRegion : UIView!
    let greenRegionHeight : CGFloat = 100.0

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.



        greenRegion = UIView(frame: CGRect(x: redView.bounds.size.width*1/8,
                                             y: redView.bounds.size.height/2 - greenRegionHeight/2,
                                             width: redView.bounds.size.width*3/4,
                                             height: greenRegionHeight))

        greenRegion.backgroundColor = UIColor.green
        redView.addSubview(greenRegion)
    

【问题讨论】:

这里的middleView 是什么? 你的预期输出是什么? middleView 是红色的。 greenView 应该在红色(中间)视图内垂直和水平居中。 你的greenRegion的宽度应该是多少,应该是动态的redView.bounds.size.width*3/4 programmingios.net/premature-layout 【参考方案1】:

您只需将frame 设置相关代码放入viewDidLayoutSubviews 方法中,然后一切都按预期工作。

override func viewDidLayoutSubviews() 
    greenRegion = UIView(frame: CGRect(x: redView.bounds.size.width*1/8,
                                       y: redView.bounds.size.height/2 - greenRegionHeight/2,
                                       width: redView.bounds.size.width*3/4,
                                       height: greenRegionHeight))


输出:

【讨论】:

是的,当您在 ViewDidAppear() 中执行此操作时它也可以工作,但有什么问题。这种行为伴随着新的 xcode 更新。 与 XCode 更新无关。您正在尝试在 UI 中设置的所有视图定位之前添加视图。它正在工作的另一件事是 ViewDidAppear,它在 viewDidLoad 方法中不起作用。如果您要使用自动布局,那么它也可以在 viewDidLoad 方法中使用。希望它会帮助你。另一种解决方案是设置帧有一些延迟。您可以将其视为特定于操作系统的问题而不是特定于 XCode 的问题

以上是关于在 viewDidLoad 中添加子视图有奇怪的行为 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 viewDidLoad 中添加子视图不起作用

loadView和viewDidLoad有什么区别?

iOS 超级奇怪的问题,子视图在我没有添加的情况下添加

在 Superview 中更改子视图的框架

如何在其父视图之上添加子视图中的视图?

何时将子视图从情节提要添加到超级视图?