Как правильно воспользоваться uihostingcontroller, когда изменения корня меняется? [дублировать]IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно воспользоваться uihostingcontroller, когда изменения корня меняется? [дублировать]

Сообщение Anonymous »

Swiftui scrollview не имеет нескольких функций, которые мне нужны (например, обработка клавиатуры). Таким образом, я решил создать пользовательскую uiscrollview обертку с использованием uiviewcontrollerRepresentable
  • UIViewControllerRepresentable creates a baseVC
  • an UIScrollView is placed in baseVC.view
  • an UIHostingController hosts the SwiftUI content and is placed in the UIScrollView
While this works fine В общем, он ломается, когда контент Swiftui обновляется. В этом случае представление UihostingController < /code> S не изменяется в соответствии с его содержанием, но сохраняет его начальный размер. < /P>
Демо (см. Ниже): < /p>
  • Начните с 15 элементов в представлении контента. Высота применяется правильно, и Scrollview может быть прокрут от пункта от 0 до 14. Контентвк S Соответственно, его высота остается прежней.
Я уже использую UpdateUiviewCoNtroller , чтобы обновить ContentVc.RootView . Однако изменение размера не применяется должным образом. Обновление ограничений здесь, не имеет никакого эффекта. < /P>
Любая идея, как это исправить?struct ScrollTest: View {
@State private var items: Int = 15

var body: some View {
VStack {
HStack {
Button("Small") { items = 3 }
Button("Medium") { items = 15 }
Button("Large") { items = 40 }
}
.frame(height: 200)
.frame(maxWidth: .infinity)
.background(.background)

CustomScrollView {
VStack {
ForEach(0.. Content) {
self.content = content()
}

func makeUIViewController(context: Context) -> UIViewController {
let baseVC = UIViewController()
baseVC.view.backgroundColor = .clear

let scrollView = UIScrollView()
scrollView.backgroundColor = .clear

let contentVC = UIHostingController(rootView: self.content)
contentVC.view.backgroundColor = .green

context.coordinator.contentVC = contentVC
context.coordinator.scrollView = scrollView

// Add scrollView to baseVC
scrollView.translatesAutoresizingMaskIntoConstraints = false
baseVC.view.addSubview(scrollView)

NSLayoutConstraint.activate([
scrollView.topAnchor.constraint(equalTo: baseVC.view.topAnchor),
scrollView.bottomAnchor.constraint(equalTo: baseVC.view.bottomAnchor),
scrollView.leadingAnchor.constraint(equalTo: baseVC.view.leadingAnchor),
scrollView.trailingAnchor.constraint(equalTo: baseVC.view.trailingAnchor)
])

// Add contentVC to scrollView
contentVC.willMove(toParent: baseVC)
baseVC.addChild(contentVC)

contentVC.view.translatesAutoresizingMaskIntoConstraints = false
scrollView.addSubview(contentVC.view)

NSLayoutConstraint.activate([
contentVC.view.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
contentVC.view.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor),
contentVC.view.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor),
contentVC.view.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),

contentVC.view.widthAnchor.constraint(equalTo: scrollView.frameLayoutGuide.widthAnchor)
])

contentVC.didMove(toParent: baseVC)

return baseVC
}

func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
context.coordinator.contentVC?.rootView = content
}

func makeCoordinator() -> Coordinator {
return Coordinator()
}

class Coordinator {
var contentVC: UIHostingController?
var scrollView: UIScrollView?
}
}

#Preview {
ScrollTest()
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... ew-changes
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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