如果ScrollView中没有很多对象,为什么我不能动态更改VStack中的内容?令人惊讶的是,如果有很多对象,那么一切都会发生漂亮的变化,但如果对象很少,那么滚动只会向下运行(因此,try 向上滚动时可能会出现故障)

我的代码:

import Introspect

struct SwiftUIView: View {

@StateObject var myCoord = MyCoord()

var body: some View {
    VStack {
        Color.red
            .frame(height: myCoord.height)

        ScrollView {
            ForEach(0..<20) { _ in
                Color.green
                    .frame(height: 20)

            }
            .background(Color.red)
        }
        .introspectScrollView { scroll in
            scroll.delegate = myCoord
        }
    }
  }
}

class MyCoord: NSObject, UIScrollViewDelegate, ObservableObject {

let maxSize: CGFloat = 76
let minSize: CGFloat = 56

@Published var height: CGFloat =  76

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let size = maxSize - scrollView.contentOffset.y
    height = min(maxSize, max(minSize, size))
}
}

推荐答案

ScrollView

解决方法是将所有视图放入ZStack,并在滚动视图中添加一些假视图.

import Introspect

struct ContentView: View {

@StateObject private var myCoord = MyCoord()

var body: some View {
    let sizeOfPlaceholder = myCoord.maxSize - myCoord.minSize
    
    ZStack(alignment: .top) {
        VStack(spacing: 0) {
            Color.black
                .frame(height: myCoord.minSize)
            
            ScrollView {
                Color.brown
                    .frame(height:sizeOfPlaceholder)
                
                ForEach(0..<20) { number in
                    Text("\(number)")
                        .background(Color.red)
                        .frame(height: 20)
                }
            }
            .padding(.vertical, 1)
            .introspectScrollView { scroll in
                scroll.delegate = myCoord
            }
        }
        
        Color.green
            .frame(height: myCoord.height)
    }
    
   }
}

class MyCoord: NSObject, UIScrollViewDelegate, ObservableObject {

let maxSize: CGFloat = 76
let minSize: CGFloat = 56

@Published var height: CGFloat =  76

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print(scrollView.contentOffset.y)
    let size = maxSize - scrollView.contentOffset.y
    height = min(maxSize, max(minSize, size))
}
}

Swift相关问答推荐

SwiftUI状态更新

如何分解阿拉伯字母?

如何异步返回视图?什么?

文件命名&NumberForMatter+扩展名&:含义?

在扩展中创建通用排序函数

如何根据 DatePicker 中选定的日期实现 TabView 页面切换?

计算 CoreData 中所有唯一对象的数量?

BLE 在 ESP32 和 Iphone 之间发送字符串

为什么 UITapGestureRecognizer 对于 Swift 集合视图中的单元格图像无法正常工作?

在 RealityKit 中查找特定模型的 findEntity(named:) 方法的替代方法?

将每个枚举 case 与 Swift 中的一个类型相关联

单击按钮后的计时器发布者初始化计时器

如何处理永远不会失败的 String.Encoding 初始化程序?

Swift 读写图片占用大量内存

异步等待不会在项目中触发,但在 Xcode playground 中工作正常

RealityKit – 无法加载 ARView(发现为零)

单元测试和私有变量

使用 Alamofire 4.0 (Swift 3) 下载文件

如何从 UITableViewCell 类中引用 UITableViewController?

Swift 中的可选数组与空数组