UihostingController должен расширяться в соответствии с содержанием.IOS

Программируем под IOS
Ответить
Anonymous
 UihostingController должен расширяться в соответствии с содержанием.

Сообщение Anonymous »

У меня есть пользовательский UiviewControllerRepresentable (код, связанный с макетом, показан ниже). Это пытается воспроизвести нативный Swiftui scrollview , за исключением того, что он прокручивается снизу, кроме верхнего.view: UIView
|
\- scrollView: UIScrollView
|
\- innerView: UIView
|
\- hostingController.view: SwiftUI hosting view
< /code>
Все это работает, как задумано, когда представление инициализируется. Представление хостинга заполняется его содержимым, и ограничения гарантируют, что содержимое представления прокрутки установлено правильно.
Однако, когда содержимое вида хостинга изменяется, hostingcontroller.view не решается, чтобы соответствовать его содержанию. Содержание контроллера хостинга, расширяющегося за границами самого вида хостинга, без надлежащего изменения размера ». src = "https://i.sstatic.net/oak9f.png"/>

green: как предполагалось, представление прокрутки соответствует размеру контроллера представления хостинга. Он сохраняет размер, который он имел, когда он был впервые загружен, и не тратит так, как это должно. В этом скриншоте контент был добавлен в стек, что привело к расширению. В результате вы можете увидеть разницу в размере. Ниже, если это помогает. < /p>
class UIBottomScrollViewController: UIViewController, UIScrollViewDelegate {
var hostingController: UIHostingController! = nil

init(rootView: Content) {
self.hostingController = UIHostingController(rootView: rootView)
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

var scrollView: UIScrollView = UIScrollView()
var innerView = UIView()

override func loadView() {
self.view = UIView()
self.addChild(hostingController)
view.addSubview(scrollView)
scrollView.addSubview(innerView)
innerView.addSubview(hostingController.view)

scrollView.delegate = self
scrollView.scrollsToTop = true
scrollView.isScrollEnabled = true
scrollView.clipsToBounds = false

scrollView.layoutMargins = .zero
scrollView.preservesSuperviewLayoutMargins = true

scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

innerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
innerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
innerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
innerView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
innerView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true
innerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true

hostingController.view.topAnchor.constraint(equalTo: innerView.topAnchor).isActive = true
hostingController.view.leftAnchor.constraint(equalTo: innerView.leftAnchor).isActive = true
hostingController.view.rightAnchor.constraint(equalTo: innerView.rightAnchor).isActive = true
hostingController.view.bottomAnchor.constraint(equalTo: innerView.bottomAnchor).isActive = true

hostingController.view.autoresizingMask = []
hostingController.view.layoutMargins = .zero
hostingController.view.insetsLayoutMarginsFromSafeArea = false
hostingController.view.translatesAutoresizingMaskIntoConstraints = false

scrollView.autoresizingMask = []
scrollView.layoutMargins = .zero
scrollView.insetsLayoutMarginsFromSafeArea = false
scrollView.translatesAutoresizingMaskIntoConstraints = false

innerView.autoresizingMask = []
innerView.layoutMargins = .zero
innerView.insetsLayoutMarginsFromSafeArea = false
innerView.translatesAutoresizingMaskIntoConstraints = false

hostingController.didMove(toParent: self)

scrollView.keyboardDismissMode = .interactive
}
}

struct BottomScrollView: UIViewControllerRepresentable {
var content: () -> Content

init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}

func makeUIViewController(context: Context) -> UIBottomScrollViewController {
let vc = UIBottomScrollViewController(rootView: self.content())
return vc
}
func updateUIViewController(_ viewController: UIBottomScrollViewController, context: Context) {
viewController.hostingController.rootView = self.content()
}
}


Подробнее здесь: https://stackoverflow.com/questions/583 ... t-contents
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»