在视图控制器生命周期中添加子视图的位置

Posted

技术标签:

【中文标题】在视图控制器生命周期中添加子视图的位置【英文标题】:Where to add subviews in a viewcontrollers lifecycle 【发布时间】:2015-12-02 07:54:58 【问题描述】:

对我来说,在 viewDidLoad 中添加子视图是有意义的,因为它会在视图加载时被调用,但我不能对我的子视图执行此操作。我有子视图,哪个框架取决于另一个已经添加的子视图高度和宽度,并且在 viewDidAppear 之前高度和宽度不正确。所以我在 viewDidAppear 中添加了我的子视图,但是每次视图出现时都会调用 viewDidAppear,这很糟糕。因此,对于我现在的解决方案,我在 viewDidAppear 中添加了我的子视图,当视图消失时,我删除了 viewDidDisappear 中的子视图。有没有另一种方法可以在没有我手动从超级视图中删除子视图的情况下进行归档。

例子

override func viewDidAppear(animated: Bool) 

        print(PercentageView.frame.width)
        print(PercentageView.frame.height)
        CreateInfoRecipeLabels()//Add subviews
        CreateCircleDiagram() //Add subviews

    

    override func viewDidDisappear(animated: Bool) 
        //When view disappear deallocate subviews
        for view in PercentageView.subviews 
            view.removeFromSuperview()
        
    

更新 - 尝试了这个,但它好像不能在有框架之前添加子视图?

    @IBOutlet weak var RecipeInfoContain: UIView!
var MinLabel: SMIconLabel?
    var Min = "15"

    override func viewDidLoad() 
        super.viewDidLoad()

        RecipeInfoContain.addSubview(MinLabel!)

        // Do any additional setup after loading the view.
    

override func viewWillLayoutSubviews() 
        MinLabel = SMIconLabel(frame: CGRectMake(RecipeInfoContain.frame.width/4 - 50, RecipeInfoContain.frame.height/2 - 10, 100, 20))
        MinLabel!.text = Min + " min"
        //MinLabel.backgroundColor = UIColor.redColor()
        MinLabel!.font = UIFont(name: "OpenSans", size: 11)
        MinLabel!.textColor = UIColor.whiteColor()
        MinLabel!.icon = UIImage(named: "Clock")
        MinLabel!.clipsToBounds = true
        MinLabel!.iconPadding = 5
        MinLabel!.iconPosition = .Left
        MinLabel!.textAlignment = .Left
    

【问题讨论】:

【参考方案1】:

两个想法:

    如果您使用自动布局来指定子视图的frame,那么您可以将它们添加到viewDidLoad 中,自动布局引擎会适当调整它们的大小。

    只需将子视图的translatesAutoresizingMaskIntoConstraints 设置为false,然后添加适当的约束,而不是手动设置frame 值。

    如果你真的要手动调整框架,可以在viewDidLoad中添加子视图,然后在viewWillLayoutSubviews中调整框架。

【讨论】:

感谢@Rob的回答,但是我尝试在viewDidLoad中添加子视图,然后在viewWillLayoutSubviews中用CGRectMake设置框架,但是程序崩溃了。查看我的编辑问题 嗯。我试过了,效果很好:gist.github.com/robertmryan/8af2c98902e39a60e177。查看您的代码示例,您在viewDidLoad 中解包MinLabel,但直到viewWillLayoutSubviews 才实例化它。实例化应该在您尝试执行 addSubview 之前发生。 我的错。我忘了初始化子视图。感谢您的帮助!

以上是关于在视图控制器生命周期中添加子视图的位置的主要内容,如果未能解决你的问题,请参考以下文章

iOS中视图控制器生命周期和视图生命周期有啥区别?

SwiftUI |如何覆盖 viewWillAppear 等生命周期方法

UITableViewCell 在视图生命周期中何时创建它的出口/标签/子视图?

视图控制器的生命周期(精简)

IOS7笔记-5视图控制器生命周期

当自动布局约束在视图控制器生命周期中设置框架?