Есть ли способ сделать постраничный ScrollView в SwiftUI? - PullRequest
0 голосов
/ 04 июля 2019

Я просматривал документы с каждой бета-версией, но не нашел способа сделать традиционный постраничный ScrollView. Я не знаком с AppKit, поэтому мне интересно, если это не существует в SwiftUI, потому что это в первую очередь конструкция UIKit. В любом случае, есть ли у кого-нибудь пример этого или кто-то может сказать мне, что это определенно невозможно, поэтому я могу перестать смотреть и кататься самостоятельно?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Начиная с бета-версии 3, нет собственного API SwiftUI для подкачки страниц. Я оставил отзыв и рекомендую сделать то же самое. Они изменили ScrollView API с бета-версии 2 на бета-версию 3, и я не удивлюсь, увидев дальнейшее обновление.

Можно обернуть UIScrollView, чтобы обеспечить эту функцию сейчас. К сожалению, вы должны обернуть UIScrollView в UIViewController, который дополнительно обернут в UIViewControllerRepresentable для поддержки содержимого SwiftUI.

Суть здесь

class UIScrollViewViewController: UIViewController {

    lazy var scrollView: UIScrollView = {
        let v = UIScrollView()
        v.isPagingEnabled = true
        return v
    }()

    var hostingController: UIHostingController<AnyView> = UIHostingController(rootView: AnyView(EmptyView()))

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(self.scrollView)
        self.pinEdges(of: self.scrollView, to: self.view)

        self.hostingController.willMove(toParent: self)
        self.scrollView.addSubview(self.hostingController.view)
        self.pinEdges(of: self.hostingController.view, to: self.scrollView)
        self.hostingController.didMove(toParent: self)

    }

    func pinEdges(of viewA: UIView, to viewB: UIView) {
        viewA.translatesAutoresizingMaskIntoConstraints = false
        viewB.addConstraints([
            viewA.leadingAnchor.constraint(equalTo: viewB.leadingAnchor),
            viewA.trailingAnchor.constraint(equalTo: viewB.trailingAnchor),
            viewA.topAnchor.constraint(equalTo: viewB.topAnchor),
            viewA.bottomAnchor.constraint(equalTo: viewB.bottomAnchor),
        ])
    }

}

struct UIScrollViewWrapper<Content: View>: UIViewControllerRepresentable {

    var content: () -> Content

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

    func makeUIViewController(context: Context) -> UIScrollViewViewController {
        let vc = UIScrollViewViewController()
        vc.hostingController.rootView = AnyView(self.content())
        return vc
    }

    func updateUIViewController(_ viewController: UIScrollViewViewController, context: Context) {
        viewController.hostingController.rootView = AnyView(self.content())
    }
}

А затем использовать его:

    var body: some View {
        GeometryReader { proxy in
            UIScrollViewWrapper {
                VStack {
                    ForEach(0..<1000) { _ in
                        Text("Hello world")
                    }
                }
                .frame(width: proxy.size.width) // This ensures the content uses the available width, otherwise it will be pinned to the left
            }
        }
    }
0 голосов
/ 05 июля 2019

Вот пример использования scrollView в swiftUI, вы можете использовать свой customView внутри цикла foreach и соответственно устанавливать режим вертикальной или горизонтальной прокрутки. Попробуйте это: -

var body: some View {
        VStack {
            ScrollView (alwaysBounceHorizontal: true, showsHorizontalIndicator: false, showsVerticalIndicator: false ) {
                VStack(spacing: 15){
                    ForEach(0...100) {_ in
                        Text("test")
                    }
                }.padding()
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...