如何让 SwiftUI 循环中的元素全屏显示?与 Apple 一样,今日应用

Posted

技术标签:

【中文标题】如何让 SwiftUI 循环中的元素全屏显示?与 Apple 一样,今日应用【英文标题】:How do you make an element in a SwiftUI loop full screen? Like Apple's, App of the day 【发布时间】:2019-11-24 21:16:10 【问题描述】:

Here's a gif of what I currently have

在这里尝试了一堆东西,比如 offset 和 zIndex 但它们不会改变位置,我正在寻找像 css 中的绝对位置这样的东西来使卡片全屏显示。

    var body: some View 
    VStack 
        Text("")
    
    .frame(minWidth: 0, maxWidth: .infinity)
    .frame(height: show ? UIScreen.main.bounds.height : 200)
    .zIndex(show ? 1 : 0)
    .background(/*@START_MENU_TOKEN@*/Color.blue/*@END_MENU_TOKEN@*/)
    .cornerRadius(show ? 0 : 20)
    .padding(show ? 0 : 30)
    .offset(y: show ? 0 : viewState.height)
    .animation(.easeInOut(duration: 0.3))

【问题讨论】:

【参考方案1】:

您可能想改用GeometryReader,像这样结合edgesIgnoringSafeArea

struct ContentView: View 

    @State var show = false

    var body: some View 
        GeometryReader  geo in
            VStack  Text("") 
                .frame(minWidth: 0, maxWidth: .infinity)
                .frame(height: self.show ? geo.size.height : 200)
                .background(/*@START_MENU_TOKEN@*/Color.blue/*@END_MENU_TOKEN@*/)
                .cornerRadius(self.show ? 0 : 20)
                .padding(self.show ? 0 : 30)
                .offset(y: self.show ? 0 : 0)
                .animation(.easeInOut(duration: 0.3))
                .onTapGesture 
                    self.show.toggle()
            
        .edgesIgnoringSafeArea(.all)
    

输出:


注意这只是对原始问题和原始提供的代码的回答,如果您想以其他方式嵌入卡片,例如使用 ScrollView,您应该考虑对原始内容进行一些更改当然是代码。例如:

struct CardView: View 
    @Binding var show: Bool

    var body: some View 

        Rectangle()
            .foregroundColor(.blue)
            .cornerRadius(self.show ? 0 : 20)
            .padding(self.show ? 0 : 30)
            .animation(.easeInOut(duration: 0.3))
    


extension Int: Identifiable  public var id: Int  self  

struct ContentView: View 

    @State var show = false

    var body: some View 
        GeometryReader  geo in
            ScrollView 
                VStack 
                    ForEach(0..<1)  item in
                        CardView(show: self.$show)
                            .frame(height: self.show ? geo.size.height : 200)
                        .onTapGesture  self.show.toggle() 


                    
                
            
        .edgesIgnoringSafeArea(.all)
    

【讨论】:

非常感谢您的帮助@mojtaba-hosseini!我可以用一张卡片复制你的动画,但是当它是一个带有卡片循环的 ScrollView 时,它不适用,有什么想法吗? ScrollView ForEach() item in Card(item: item) 在这种情况下卡片组件没有动画全屏 Output for me when in a loop. 因为几何体代表父视图。当您将其嵌入到另一个视图中时,您应该考虑到几何数据会相应地发生变化。我为您添加了另一个示例。希望它能指导您实现所需的目标。

以上是关于如何让 SwiftUI 循环中的元素全屏显示?与 Apple 一样,今日应用的主要内容,如果未能解决你的问题,请参考以下文章

在 swiftUI 中点击列表条目时呈现全屏视图

如何全屏显示 SwiftUI 子视图?

SwiftUI List 和 For Each 循环与空白元素

如何使用 SwiftUI 显示全栈模式?

如何让WebView中的Html5 Video全屏播放

SwiftUI - 列出嵌套数组中的元素