Центрирование не работает для вида, добавленного в раскадровку

#ios #swift

#iOS #swift

Вопрос:

Я добавил вложенный просмотр в свой исходный вид в раскадровке. Я установил высоту и ширину моего подвида в раскадровке и принял их ограничения.

     @IBOutlet var childViewHeightConstraint: NSLayoutConstraint!
    @IBOutlet var childViewWidthConstraint: NSLayoutConstraint!
  

Я хочу изменить центр моего подвида в viewDidLoad, но он не работает.

    subView.center = parentView.center
   childViewHeightConstraint.constant = 400
   childViewWidthConstraint.constant = 500
  

Также обратите внимание, что я изменяю высоту и ширину своих дочерних просмотров в viewDidLoad. Ограничения childViewHeightConstraint и childViewWidthConstraint работают, но центрирование не работает.

Комментарии:

1. Почему вы не добавили ограничения centerHorizontally и centervertically в саму раскадровку?

2. Потому что я хочу изменить его центр в другом месте моего кода.

3. попробуйте так DispatchQueue.main.asyncAfter(крайний срок: .now() 0,5) { subView.center = родительский просмотр.center childViewHeightConstraint.constant = 400 childViewWidthConstraint.constant = 500 }

Ответ №1:

Вам нужно добавить centerX и centerY ограничения subView с parentView , т.е.

 subView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
subView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true
  

Ответ №2:

Если вы настаиваете на использовании subView.center = parentView.center , попробуйте поместить его в viewDidAppear. Родительский вид еще не «отображается» в viewDidLoad, поэтому при настройке центра подвида ничего не происходит.

 override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear()
    subView.center = parentView.center
}
  

Но я думаю, что это не лучшее решение для изменения положения вложенного представления, вы можете рассмотреть возможность использования ограничения центра, как @PGDev упомянул в своем ответе.

Ответ №3:

Хорошо, ответ @dhawal сработал для меня.

  DispatchQueue.main.asyncAfter(deadline: .now()   0.5) { 
subView.center = parentView.center 
childViewHeightConstraint.constant = 400 
childViewWidthConstraint.constant = 500 
}