在viewcontrollers生命周期中添加子视图的位置

时间:2015-12-02 07:54:58

标签: swift uiview xcode7 addsubview

对我而言,在viewDidLoad中添加子视图是有意义的,因为它在视图加载时会调用,但我不能用我的子视图执行此操作。我有子视图哪个框架取决于另一个已经添加的子视图高度和宽度,并且在viewDidAppear之前高度和宽度不正确。所以我在viewDidAppear中添加了我的子视图,但每次出现视图时都会调用viewDidAppear,这是不好的。所以对于我的解决方案,我现在在viewDidAppear中添加我的子视图,当视图消失时,我删除了viewDidDisappear中的子视图。如果没有我从superview手动删除子视图,是否还有其他方法可以实现这一目标。

实施例

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()
        }
    }

UPDATE - 相反尝试了这个,但它就像在有帧之前无法添加子视图一样?

    @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 个答案:

答案 0 :(得分:2)

两个想法:

  1. 如果您使用自动布局来指定子视图的frame,那么您可以在viewDidLoad中添加它们,并且autolayout引擎会正确地调整它们的大小。

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

  2. 如果您确实想要手动调整框架,可以在viewDidLoad中添加子视图,然后在viewWillLayoutSubviews中调整框架。