And*_*rew 5 macos scroll scrollview swift swiftui
ScrollView(){
//no matter
}
Run Code Online (Sandbox Code Playgroud)
位置是左上角,但内容的宽度比我需要的要小
(红色矩形中的2个字符串必须是单个字符串,因此需要启用两个滚动)
ScrollView([Axis.Set.horizontal, Axis.Set.vertical]) {
//no matter
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ScrollView 的内容对我来说具有正确的大小。
但是scrollView内容的位置是居中的(水平和垂直)
如果 ScrollView 配置为两个滚动条,如何将默认位置更改为左上角?
问题仍然存在,但现在使用 ScrollViewReader 解决方案更简单:
struct TestTwoAxisScrollView: View {
var body: some View {
ScrollViewReader { sp in
ScrollView([.horizontal, .vertical]) {
VStack {
ForEach(0..<100) { _ in
self.row()
}
}
.border(Color.green)
.id("root")
}
.border(Color.gray)
.padding()
.onAppear {
sp.scrollTo("root", anchor: .topLeading)
}
}
}
func row() -> some View {
Text(test)
.border(Color.red) // uncomment to see border
}
}
Run Code Online (Sandbox Code Playgroud)
这是可能的方法。使用 Xcode 11.2 / macOS 10.15.3 进行测试
演示:

代码(完整的可测试模块,添加边框是为了更好地了解每个组件):
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()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1686 次 |
| 最近记录: |