SwiftUI:如何将 ScrollView 的位置设置为左上角? (两个滚动都已启用)

Posted

技术标签:

【中文标题】SwiftUI:如何将 ScrollView 的位置设置为左上角? (两个滚动都已启用)【英文标题】:SwiftUI: How to set position of ScrollView to Top Left? (both scrolls is enabled) 【发布时间】:2020-03-09 06:17:02 【问题描述】:
ScrollView()
//no matter

位置是左上角,但内容的宽度会比我需要的要小

(红色矩形中的2个字符串必须是单个字符串,所以需要启用两个滚动)


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

在这种情况下,ScrollView 的内容对我来说具有正确的大小。

但是scrollView的内容的位置是居中的(水平和垂直)

如果 ScrollView 配置为两个滚动条,如何将默认位置更改为左上角?

【问题讨论】:

这篇文章可能对你有所帮助:swiftui-lab.com/a-powerful-combo 如果有帮助,请检查此方式。 ***.com/a/71113955/5655043 【参考方案1】:

这是可能的方法。使用 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()
    

【讨论】:

以上是关于SwiftUI:如何将 ScrollView 的位置设置为左上角? (两个滚动都已启用)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中使用 NSAttributedString 和 ScrollView?

如何在 SwiftUI 中设置 ScrollView 的 contentInset

如何在 SwiftUI 的 ScrollView 中制作动画? SwiftUI 中的手风琴风格动画

SwiftUI: ScrollView offset

如何向 swiftUI ScrollView 指示内容大小已更改?

在 SwiftUI 中,如何通过动态变化的滚动区域来缩放 scrollView 内的内容?