在视图控制器生命周期中的何处添加子视图
Where to add subviews in a viewcontrollers lifecycle
对我来说,在 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()
}
}
更新 - 试过这个,但好像它不能在有框架之前添加子视图?
@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
}
两个想法:
如果您使用自动布局来指示子视图的 frame
,那么您可以将它们添加到 viewDidLoad
中,自动布局引擎将负责适当调整它们的大小。
只需将子视图的 translatesAutoresizingMaskIntoConstraints
设置为 false
,然后添加适当的约束,而不是手动设置 frame
值。
如果确实要手动调整frame,可以在viewDidLoad
中添加子视图,然后在viewWillLayoutSubviews
中调整frames。
对我来说,在 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()
}
}
更新 - 试过这个,但好像它不能在有框架之前添加子视图?
@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
}
两个想法:
如果您使用自动布局来指示子视图的
frame
,那么您可以将它们添加到viewDidLoad
中,自动布局引擎将负责适当调整它们的大小。只需将子视图的
translatesAutoresizingMaskIntoConstraints
设置为false
,然后添加适当的约束,而不是手动设置frame
值。如果确实要手动调整frame,可以在
viewDidLoad
中添加子视图,然后在viewWillLayoutSubviews
中调整frames。