swiftui - Swiftui:带有多个图像的粘性、弹性标题?
问题描述
在详细视图中,我想创建一个粘性的、可拉伸的标题,其中包含多个可以水平滚动的图像。
我有粘性,有弹性的标题。我还有多个可以使用 TabView (PageTabViewStyle()) 水平查看的图像。但是,当结合这两个功能时,我遇到了一个问题:每当整个标题被拉伸时,TabView 都会重置为数组中的第一个图像。我希望它留在屏幕上的图像上。
任何想法将不胜感激!
标签视图:
struct DetailGalleryView: View {
let item: Item
let gallery: [ItemImage] = Bundle.main.decode("gallery.json")
var body: some View {
let detailPhotos = gallery.filter{$0.type == item.id}
ZStack {
TabView{
ForEach(detailPhotos) { photo in
ZStack(alignment: .bottomTrailing){
Image(photo.id)
.resizable()
.scaledToFill()
.frame(width: UIScreen.main.bounds.width)
.clipped()
Text("Photo: \(photo.licence)")
.padding(4)
.background(Color.black)
.font(.caption)
.foregroundColor(.white)
.offset(x: -5, y: -5)
.opacity(0.5)
}
}
}
.edgesIgnoringSafeArea(.all)
.tabViewStyle(PageTabViewStyle())
}
}
}
粘性标题:
struct StickyHeader<Content: View>: View {
var minHeight: CGFloat
var content: Content
init(minHeight: CGFloat = 200, @ViewBuilder content: () -> Content) {
self.minHeight = minHeight
self.content = content()
}
var body: some View {
GeometryReader { geo in
if(geo.frame(in: .global).minY <= 0) {
content
.frame(width: geo.size.width, height: geo.size.height, alignment: .center)
} else {
content
.offset(y: -geo.frame(in: .global).minY)
.frame(width: geo.size.width, height: geo.size.height + geo.frame(in: .global).minY)
}
}.frame(minHeight: minHeight)
}
}
在详细视图正文中使用它:
// ...
StickyHeader {
DetailGalleryView(item: item)
}
.frame(minHeight: UIScreen.main.bounds.height/2.1)
// ...
解决方案
尝试保留选择TabView
,例如
struct DetailGalleryView: View {
let item: Item
let gallery: [ItemImage] = Bundle.main.decode("gallery.json")
@State private var selection: ... // give it type of photo.id with some default value
var body: some View {
let detailPhotos = gallery.filter{$0.type == item.id}
ZStack {
TabView(selection: $selection){
ForEach(detailPhotos) { photo in
ZStack(alignment: .bottomTrailing){
Image(photo.id)
.resizable()
.scaledToFill()
.frame(width: UIScreen.main.bounds.width)
.clipped()
Text("Photo: \(photo.licence)")
.padding(4)
.background(Color.black)
.font(.caption)
.foregroundColor(.white)
.offset(x: -5, y: -5)
.opacity(0.5)
}.tag(photo.id)
}
}
.edgesIgnoringSafeArea(.all)
.tabViewStyle(PageTabViewStyle())
}
}
}
推荐阅读
- c - 如何从C中的文本文件中读取参数
- xamarin.forms - Xamarin Android - Java 在 VSTS 中内存不足,但在我的机器上没有
- excel - 一个 Excel 单元格中的多个 IF 函数
- android - BLE 在应用程序之外禁用配对
- selenium - Selenium-IDE 打开操作不解释变量
- sql-server - 错误消息:“消息 206,级别 16,状态 2,第 1 行操作数类型冲突:int 与日期不兼容”
- python - Mailjet:删除联系人
- java - java将返回类型强制为泛型类型,而不是使用收集器和流构造映射的对象类型
- javascript - 正则表达式在“as”关键字之前和之后获取值
- c - 如何在 x86-32 位中调用 sprintf() 函数?