2015-12-02 3 views
1

Для меня имеет смысл добавить subviews в viewDidLoad, потому что он получает вызов при загрузке представления, но я не могу сделать это с моими областями. У меня есть subviews, кадр которого зависит от другой уже добавленной высоты и ширины subviews, а высота и ширина не верны перед viewDidAppear. Поэтому я добавляю свои subviews в viewDidAppear, но viewDidAppear получает вызов каждый раз, когда появляется представление, которое плохо. Поэтому для моего решения прямо сейчас я добавляю свои subviews в viewDidAppear, и когда исчезает представление, я удаляю subviews в viewDidDisappear. Есть ли другой способ архивировать это без моего ручного удаления subviews из супервизора.Где добавить subviews в жизненном цикле 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. Если вы используете autolayout диктовать frame из подвидов, то вы можете добавить их в viewDidLoad и autolayout двигатель будет заботиться о калибровке их соответствующим образом.

    Просто установите translatesAutoresizingMaskIntoConstraints для подземелий на false, а затем добавьте соответствующие ограничения, а не значения frame значений вручную.

  2. Если вы действительно хотите вручную отрегулировать рамки, вы можете добавить subviews в viewDidLoad, но затем отрегулируйте рамки в viewWillLayoutSubviews.

+0

Благодарим Вас за ответ @Rob, но я пытался добавить подвид в viewDidLoad, а затем установить рамки с CGRectMake в viewWillLayoutSubviews, но программа падает. См. Мой вопрос редактирования –

+0

Хм. Я попробовал, и он отлично работает: https://gist.github.com/robertmryan/8af2c98902e39a60e177. Рассматривая образец кода, вы разворачиваете 'MinLabel' в' viewDidLoad', но вы не создаете экземпляр до 'viewWillLayoutSubviews'. Реализация должна произойти до того, как вы попытаетесь сделать 'addSubview'. – Rob

+0

Мой плохой. Я забыл запустить subview. Спасибо за помощь! –

Смежные вопросы