2015-12-02 70 views
1

对于我来说,在viewDidLoad中添加子视图是有意义的,因为它在视图加载时获取调用,但我无法通过子视图来实现。我有子视图哪个框架取决于另一个已经添加的子视图的高度和宽度,高度和宽度在viewDidAppear之前是不正确的。所以我在viewDidAppear中添加了我的子视图,但viewDidAppear在每次出现视图时都会调用它,这很糟糕。所以现在我的解决方案,我添加我的子视图在viewDidAppear和视图消失时,我删除viewDidDisappear中的子视图。如果没有我从超级视图手动删除子视图,是否有另一种方法来实现这一点。在viewcontrollers生命周期中添加子视图的位置

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 
    } 

回答

2

两个想法:

  1. 如果使用自动布局来决定子视图的frame,那么您可以在viewDidLoad将它们添加和自动布局引擎将带他们合适的尺寸的照顾。

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

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

+0

感谢您的回答@Rob,但我试图在viewDidLoad中添加子视图,然后在viewWillLayoutSubviews中使用CGRectMake设置框架,但程序崩溃。看到我的编辑问题 –

+0

嗯。我试了一下,它工作正常:https://gist.github.com/robertmryan/8af2c98902e39a60e177。看看你的代码示例,你正在'viewDidLoad'中展开'MinLabel',但是你没有实例化它,直到viewWillLayoutSubviews。实例化应该在尝试执行'addSubview'之前发生。 – Rob

+0

我的不好。我忘了初始化子视图。感谢您的帮助! –