Ios 获取SwiftUI中列表的内容偏移量
我试图在SwiftUI中创建一个视差标题效果,就像这样,但我真的不知道如何在滚动时获得列表的内容偏移量Ios 获取SwiftUI中列表的内容偏移量,ios,list,offset,swiftui,Ios,List,Offset,Swiftui,我试图在SwiftUI中创建一个视差标题效果,就像这样,但我真的不知道如何在滚动时获得列表的内容偏移量 有人知道如何在滚动时计算列表的内容偏移量吗?我为ScrollView案例提供了一个可重用的解决方案,它利用视图首选项作为通知视图层次结构上游布局信息的方法 有关查看首选项如何工作的详细说明,我建议您在 不幸的是,这种解决方案不适用于列表(可能是一个bug),因为视图首选项被困在列表中,并且它的祖先不可见 到目前为止,唯一可行的解决方案是观察列表中视图的帧更改。您可以通过两种方式实现这一点: 您
有人知道如何在滚动时计算列表的内容偏移量吗?我为
ScrollView
案例提供了一个可重用的解决方案,它利用视图首选项作为通知视图层次结构上游布局信息的方法
有关查看首选项如何工作的详细说明,我建议您在
不幸的是,这种解决方案不适用于列表
(可能是一个bug),因为视图首选项被困在列表
中,并且它的祖先不可见
到目前为止,唯一可行的解决方案是观察列表中视图的帧更改。您可以通过两种方式实现这一点:
您可以报告和侦听列表中每个视图(单元格)的布局更改(并对其执行操作):
struct testview 1:视图{
var body:一些观点{
GeometryReader{中的几何体
List(TestEnum.allCases){listValue in
文本(listValue.id)
.填充(60)
.TransformAnchorReference(键:MyKey.self,值:.bounds){
$0.append(MyFrame(id:listValue.id,frame:geometry[$1]))
}
.onPreferenceChange(MyKey.self){
印刷品(0美元)
//在此处处理内容框架更改
}
}
}
}
}
或者,如果不需要对每个单元格进行框架更改,则报告并侦听某些表头视图(或空表头)上的框架更改:
struct testview 2:视图{
var body:一些观点{
GeometryReader{中的几何体
名单{
正文(“”)
.TransformAnchorReference(键:MyKey.self,值:.bounds){
$0.append(MyFrame(id:“tabletocell”,frame:geometry[$1]))
}
.onPreferenceChange(MyKey.self){
印刷品(0美元)
//在此处处理俯视图框架的更改。
//这只会在
//俯视图是内容的一部分。这可能是
//当列表内部不可见时移除。
}
ForEach(TestEnum.allCases){
文本($0.rawValue)
.填充(60)
}
}
}
}
}
在下面找到上述解决方案的支持代码:PreferenceKey
一致性结构、可识别的图幅结构和作为数据源的测试枚举:
struct MyFrame:equalable{
let id:String
让帧:CGRect
静态函数==(左:MyFrame,右:MyFrame)->Bool{
lhs.id==rhs.id&&lhs.frame==rhs.frame
}
}
结构MyKey:PreferenceKey{
typealias值=[MyFrame]//视图树中的图幅更改列表。
静态变量defaultValue:[MyFrame]=[]
///在遍历视图树时,Swift UI将使用此功能收集所有图幅更改。
静态函数reduce(值:inout[MyFrame],nextValue:()->[MyFrame]){
append(contentsOf:nextValue())
}
}
enum TestEnum:字符串,可大小写,可识别{
一、二、三、四、五、六、七、八、九、十
变量id:String{
原值
}
}
在那条推特上的回复中,作者建议使用GeometryReader
来获取它。您测试过这种方法吗?是的,我设法使用GeometryReader
从滚动视图中获取内容偏移量,仍在研究如何将相同的技术应用于列表
。ScrollView
的源代码在这里:仍在寻找列表的解决方案。任何人都发现了什么(我正在使用Beta3,但就我所能找到的而言,仍然没有爱)。这可能会有所帮助@我想你的要点回答了最初的问题。你不应该回答并接受正确的答案吗?或者需要完整的解决方案?上面的文本(“”)左偏移量