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

Posted

技术标签:

【中文标题】如何向 swiftUI ScrollView 指示内容大小已更改?【英文标题】:How do I indicate to swiftUI ScrollView that content size has changed? 【发布时间】:2021-08-23 01:26:38 【问题描述】:

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

考虑这种情况:我有一个包含可调整大小的图像的滚动视图。如果我将窗口大小调整为小于图像,滚动视图条会按预期显示。如果我使用 .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 提供显式框架。缺点是您必须知道要发送到该修饰符的尺寸。 @jnpdx 提交这个作为答案,除了它。仅供参考,图像大小是在实际代码中计算的,因此设置 VStack 框架是一个非常简单且有效的修复。谢谢你的时间,我很感激! 【参考方案1】:

您可以使用.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)
    

【讨论】:

以上是关于如何向 swiftUI ScrollView 指示内容大小已更改?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI - 隐藏 ScrollView 的指示器使其停止滚动

如何在 SwiftUI 中删除列表选择指示器和分隔符?

带有点击和拖动手势的 SwiftUI ScrollView

SwiftUI - 淡出 ScrollView

SwiftUI ScrollView 滚动到相对位置

SwiftUI - 如何获取 ScrollView 内容的大小(高度)