SwiftUI: Как установить положение ScrollView в верхнем левом углу? (оба свитка включены) - PullRequest
3 голосов
/ 09 марта 2020
ScrollView(){
//no matter
}

Позиция в верхнем левом углу, но содержимое будет иметь меньшую ширину, чем мне нужно

(2 строки в красном прямоугольнике должны быть одной строкой, поэтому необходимо включить оба прокрутки)

enter image description here


ScrollView([Axis.Set.horizontal, Axis.Set.vertical]) {
//no matter
}

В этом случае содержимое ScrollView имеет для меня правильный размер.

Но положение содержимого scrollView центрировано (как: горизонтально, так и горизонтально). по вертикали)

Как изменить положение по умолчанию на верхний левый в случае ScrollView, настроенного на оба прокрутки?

1 Ответ

3 голосов
/ 12 марта 2020

Здесь возможен подход. Протестировано с Xcode 11.2 / macOS 10.15.3

Демо:

demo

Код (полный тестируемый модуль, добавлены границы для лучшей видимости каждого компонента):

import SwiftUI

let test = """
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12118" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
"""

struct ScrollViewHelper: NSViewRepresentable {
    func makeNSView(context: NSViewRepresentableContext<ScrollViewHelper>) -> NSView {
        let view = NSView(frame: .zero)
        DispatchQueue.main.async { // << must be async, so view got into view hierarchy
            view.enclosingScrollView?.contentView.scroll(to: .zero)
            view.enclosingScrollView?.reflectScrolledClipView(view.enclosingScrollView!.contentView)
        }
        return view
    }

    func updateNSView(_ nsView: NSView, context: NSViewRepresentableContext<ScrollViewHelper>) {
    }
}

struct TestTwoAxisScrollView: View {
    var body: some View {
        ScrollView([.horizontal, .vertical]) {
            VStack {
                ForEach(0..<100) { _ in
                    self.row()
                }
            }
            .background(ScrollViewHelper()) // << active part !!
            .border(Color.green) // uncomment to see border
        }
        .border(Color.gray)
        .padding()
    }

    func row() -> some View {
        Text(test)
            .border(Color.red) // uncomment to see border
    }
}

struct TestTwoAxisScrollView_Previews: PreviewProvider {
    static var previews: some View {
        TestTwoAxisScrollView()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...