размер (контейнер forChildContentContainer: UIContentContainer, withParentContainerSize parentSize: CGSize) не работает

Apple говорит:

Контроллеры представлений-контейнеров используют этот метод для возврата размеров своих дочерних контроллеров представлений. UIKit вызывает метод как часть реализации по умолчанию метода viewWillTransition(to:with:) для контроллеров представления.

И когда я впервые запускаю программу:

class ViewController: UIViewController {
                       
override func viewDidLoad() {
    super.viewDidLoad()
    
    let child = ViewControllerChild()
    self.addChildViewController(child)
    self.view.addSubview(child.view)
                    
   
    child.view.translatesAutoresizingMaskIntoConstraints = true
    child.view.autoresizingMask = [.flexibleBottomMargin, .flexibleRightMargin]       
}

override func size(forChildContentContainer container: UIContentContainer, withParentContainerSize parentSize: CGSize) -> CGSize {
    return CGSize(width: 100, height: 100)
}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
}

} Я получаю полный размер родительского представления vc, а не представление контроллера дочернего представления (100, 100). Итак, какой реальный смысл переопределять его, если я могу реагировать на изменения свойств, переопределяя дочерний фрейм представления vc в (1-я загрузка в viewdidload), а затем в предпочтительной функции ContentSizeDidChange?

введите здесь описание изображения


person Ninja    schedule 11.12.2020    source источник
comment
пожалуйста, если вы думаете, что я ошибся в своих мыслях, дайте мне знать, пожалуйста!   -  person Ninja    schedule 16.12.2020
comment
или еще внимательно прочитайте вопрос   -  person Ninja    schedule 16.12.2020


Ответы (2)


Из примечаний, которые вы вставили в вопрос:

UIKit вызывает метод как часть реализации по умолчанию метода viewWillTransition(to:with:) для контроллеров представления.

Вопрос. Вы уверены, что вызываются переопределенные методы?

Чего не хватает?

let child = ViewControllerChild()
self.addChild(child)

/// Add this line
child.didMove(toParent: self)

self.view.addSubview(child.view)

Документы: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621405-didmovetoparentviewcontroller

Если вы реализуете свой собственный контейнерный контроллер представления, он должен вызывать метод didMove(toParent:) дочернего контроллера представления после завершения перехода на новый контроллер или, если перехода нет, сразу после вызова метода addChild(_: ) метод.

person Tarun Tyagi    schedule 17.12.2020

Вам нужно инициировать событие изменения размера или фактически изменить размер представления, чтобы можно было вызвать метод viewWillTransition. В вашем коде этот метод никогда не будет вызываться, потому что нет действия по изменению размера представления. viewWillTransition уведомляет контейнер о том, что размер его представления вот-вот изменится.

Используйте этот код для получения наилучшей практики. .

EDIT относительно метода sizeForChildContentContainer, вот подробный пример использования, с которым вы можете ознакомиться и который поможет вам понять использование.

person gmj    schedule 16.12.2020
comment
размер не изменится. до сих пор не видно причин. это была моя вина, я не упомянул о рассматриваемом вызове viewWillTransition. вы видели какие-либо явные последствия его переопределения, но не явного использования в коде? - person Ninja; 16.12.2020
comment
@Ninja, решение Таруна находится в моем справочном коде, поэтому я не понимаю, почему вы проголосовали против исходного ответа и проголосовали за ответ, который почерпнул идею из моего кода (возможно). - person gmj; 21.12.2020