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

How do I indicate to swiftUI ScrollView that content size has changed?

我正在为 macOS 编写一个 swiftUI 应用程序。

考虑这种情况:我有一个包含可调整大小的图像的滚动视图。如果我将 window 的大小调整为小于图像,则滚动视图栏会按预期显示。如果我使用 .scaleEffect(someStateVar) 调整图像大小(通过更改 someStateVar),滚动视图内容不会更新为图像的新大小。

除了将 NSScrollView 包装到 swiftUI 视图之外,我如何向 swiftUI 滚动视图指示内容大小已更改?

显示缩放图像的示例未设置滚动视图的“内容大小”。当您将时钟设置为大于滚动视图时,滚动条不会出现并且您无法滚动。当您尝试滚动时,您会短暂地看到隐藏区域,但视图会跳回原始位置。

import SwiftUI

struct MyImageView: View {
    
    @State var scale: CGFloat = 1
    
    var theImage: some View{
        ScrollView([.horizontal, .vertical]){
            VStack{
                HStack{
                    Image(systemName: "clock.fill")
                        .scaleEffect(scale)
                }
            }
        }
    }
    
    var body: some View {
        theImage
        Slider(value: $scale, in: 1...1000)
    }
}

struct ContentView: View {
    var body: some View {
        MyImageView()
    }
}

您可以使用 .frame 修饰符明确设置 VStack 的大小。缺点是你必须知道完整的尺寸。

var theImage: some View{
    ScrollView([.horizontal, .vertical]){
        VStack{
            HStack{
                Image(systemName: "clock.fill")
                    .scaleEffect(scale)
            }
        }
        .frame(width: 50 * scale, height: 50 * scale, alignment: .center)
    }
}