删除阴影 SwiftUI 旁边的空格

Posted

技术标签:

【中文标题】删除阴影 SwiftUI 旁边的空格【英文标题】:Remove whitespace next to shadow SwiftUI 【发布时间】:2022-01-10 15:54:09 【问题描述】:

就像this 问题一样,我想在底部标签栏上方有一个阴影,所以我以类似的方式创建了一个自定义的。然而,在该示例和我的示例(如下所示)中,阴影正上方有一条不受欢迎的空白,阻止它直接在滚动视图顶部分层。

注意“45”是如何被空白而不是阴影覆盖的。有什么办法可以去掉空格,让我的影子直接覆盖滚动视图?

示例代码:

struct ContentView: View 
    @State var selectedTab: Tab = .events

    var body: some View 
        VStack 
            ScrollView 
                ForEach(0..<100, id: \.self)  index in
                    HStack 
                        Spacer()
                        Text("\(index)")
                        Spacer()
                    

                
            

            ZStack 
                Color.white
                    .frame(height: 30)
                    .shadow(color: .gray.opacity(0.2), radius: 1, x: 0, y: -2)

                HStack 
                    BottomTabBarItem(name: "square.stack", selectedName: "square.stack.fill", directedTab: .events, selectedTab: $selectedTab)
                        .padding(.leading, 20)
                    Spacer()
                    BottomTabBarItem(name: "person.3", selectedName: "person.3.fill", directedTab: .groups, selectedTab: $selectedTab)
                    Spacer()
                    BottomTabBarItem(name: "magnifyingglass", selectedName: "magnifyingglass", directedTab: .search, selectedTab: $selectedTab)
                    Spacer()
                    BottomTabBarItem(name: "bell", selectedName: "bell.fill", directedTab: .requests, selectedTab: $selectedTab)
                    Spacer()
                    BottomTabBarItem(name: "person", selectedName: "person.fill", directedTab: .profile, selectedTab: $selectedTab)
                        .padding(.trailing, 20)
                
            
        
    


struct BottomTabBarItem: View 
    let name: String
    let selectedName: String

    let directedTab: Tab
    @Binding var selectedTab: Tab

    private func getWeight() -> Font.Weight 
        if name != "magnifyingglass" 
            return .light
         else 
            if selectedTab == directedTab 
                return .bold
             else 
                return .light
            
        
     

     var body: some View 
        Button 
            selectedTab = directedTab
         label: 
            Image(systemName: selectedTab == directedTab ? selectedName: name)
                .font(.system(size: 20, weight: getWeight()))
                .foregroundColor(.black)
                .opacity(0.85)
        
    


enum Tab 
    case events
    case requests
    case profile
    case utilities
    case groups
    case search

编辑:

下面的答案解决了这个最小示例的问题,但是 对于我的实际应用程序代码,问题是由于ScrollViewTabBar 之间的Spacer。折叠时,Spacer 仍然有一个最小长度,它在阴影的正上方显示为空白。我将Spacer 更改为Spacer(minLength:0) 以解决此问题。

【问题讨论】:

【参考方案1】:

在您的情况下,只需要零间距(使用 Xcode 13 / ios 15 测试)

var body: some View 
    VStack(spacing: 0)       // << here !!
        ScrollView 
            ForEach(0..<100, id: \.self)  index in

【讨论】:

这在这个例子中绝对有效。问题是这是一个最小的可重现示例,在我的实际代码中它仍然无法正常工作。如果我无法弄清楚,我将使用不同的最小示例编辑问题以捕获其他问题 事实证明,我的应用程序中的问题是由默认 minLength 处的折叠 Spacer 引起的。不过感谢您的帮助!

以上是关于删除阴影 SwiftUI 旁边的空格的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:为按钮的文本添加阴影

SwiftUI 设置边框、透明度、阴影

在 TextField 中的空格后自动触发 shift 按钮 - SwiftUI

Swift/SwiftUI - 删除键盘上方的空间

在 SwiftUI 中的列表视图旁边绘制带有圆圈的垂直线

SwiftUI4.0在iOS 16中新添加的inner和drop阴影效果