如何向 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 指示内容大小已更改?的主要内容,如果未能解决你的问题,请参考以下文章