gpt4 book ai didi

ios - 获取 SwiftUI 中 List 的内容偏移量

转载 作者:行者123 更新时间:2023-12-02 07:18:30 25 4
gpt4 key购买 nike

我正在尝试在 SwiftUI 中创建视差标题效果,如下所示 https://twitter.com/KhaosT/status/1140814602017464320 ,但真的不知道如何在滚动时获取列表的内容偏移量。

有谁知道如何计算滚动时列表的内容偏移量?

最佳答案

我为这个 answer 上的 ScrollView 案例提供了一个可重用的解决方案它利用 View 首选项作为通知 View 层次结构上游布局信息的方法。

有关查看首选项如何工作的详细说明,我建议阅读此文章 3 articles series关于该主题kontiki

不幸的是,这样的解决方案不适用于List(可能是一个错误),因为View Preferences被困在List内并且不它的祖先可见。

到目前为止,唯一可行的解​​决方案是观察列表内 View 上的框架变化。您可以通过两种方式实现这一目标:

您可以报告和监听列表中每个 View (单元格)的布局更改(并对其进行操作):

struct TestView1: View {
var body: some View {
GeometryReader { geometry in
List(TestEnum.allCases) { listValue in
Text(listValue.id)
.padding(60)
.transformAnchorPreference(key: MyKey.self, value: .bounds) {
$0.append(MyFrame(id: listValue.id, frame: geometry[$1]))
}
.onPreferenceChange(MyKey.self) {
print($0)
// Handle content frame changes here
}
}
}
}
}

或者,如果您不需要每个单元格上的框架更改,则报告并监听某些表标题 View (或空标题)上的框架更改:

struct TestView2: View {
var body: some View {
GeometryReader { geometry in
List {
Text("")
.transformAnchorPreference(key: MyKey.self, value: .bounds) {
$0.append(MyFrame(id: "tableTopCell", frame: geometry[$1]))
}
.onPreferenceChange(MyKey.self) {
print($0)
// Handle top view frame changes here.
// This only gets reported as long as this
// top view is part of the content. This could be
// removed when not visible by the List internals.
}

ForEach(TestEnum.allCases) {
Text($0.rawValue)
.padding(60)
}
}
}
}
}

在下面找到上述解决方案的支持代码:PreferenceKey 符合结构、可识别的 View 框架结构和作为数据源的测试枚举:

struct MyFrame : Equatable {
let id : String
let frame : CGRect

static func == (lhs: MyFrame, rhs: MyFrame) -> Bool {
lhs.id == rhs.id && lhs.frame == rhs.frame
}
}

struct MyKey : PreferenceKey {
typealias Value = [MyFrame] // The list of view frame changes in a View tree.

static var defaultValue: [MyFrame] = []

/// When traversing the view tree, Swift UI will use this function to collect all view frame changes.
static func reduce(value: inout [MyFrame], nextValue: () -> [MyFrame]) {
value.append(contentsOf: nextValue())
}
}

enum TestEnum : String, CaseIterable, Identifiable {
case one, two, three, four, five, six, seven, eight, nine, ten

var id: String {
rawValue
}
}

关于ios - 获取 SwiftUI 中 List 的内容偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56726369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com