iOS 15 SwiftUI TabView选项卡栏外观不会在视图之间更新

jhdbpxl9  于 2023-05-19  发布在  iOS
关注(0)|答案(4)|浏览(172)

iOS 15根据加载视图的滚动位置设置TabView的外观。但是,在选项卡栏中切换的视图之间,这似乎不会更新。如何修复此问题以使外观正确更新?
1.打开不滚动内容的选项卡式视图(“无滚动视图”)时,选项卡栏使用透明背景。
1.在导航到具有滚动内容的选项卡式视图(“滚动视图”)之后,使用半透明背景。
1.然而,当回到“无滚动视图”时,半透明背景仍然保留,而不是被透明背景取代。
我确实注意到,当我打开控制中心或应用程序切换器并回来时,外观会正确更新。

复制:

enum Tab {
    case scroll
    case noScroll
}

struct ContentView: View {
    @State var selection: Tab = .noScroll
    
    var body: some View {
        TabView(selection: $selection) {     
            Text("Should have a transparent tab bar")
                .tabItem{ Label("No-scroll", systemImage: "xmark.circle") }
                .tag(Tab.noScroll)
            
            ScrollView {
                VStack(spacing: 10) {
                    ForEach(0..<100) {_ in
                        Text("Should have a translucent tab bar")
                    }
                }
            }
            .tabItem { Label("Scroll", systemImage: "circle") }
            .tag(Tab.scroll)
        }
    }
}
balp4ylt

balp4ylt1#

.onAppear {
    if #available(iOS 15.0, *) {
        let appearance = UITabBarAppearance()
        UITabBar.appearance().scrollEdgeAppearance = appearance
    }
}
8tntrjer

8tntrjer2#

这和@科尔的回答逻辑差不多,但我的解决方案是:

.introspectTabBarController(customize: { controller in

            let appearance = controller.tabBar.standardAppearance
            appearance.configureWithDefaultBackground()
            appearance.backgroundColor = .red
            if #available(iOS 15.0, *) {
                controller.tabBar.scrollEdgeAppearance = appearance
            } else {
                controller.tabBar.standardAppearance = appearance
            }
        })

使用introspectTabBarController SwiftUI-Introspect

a9wyjsp7

a9wyjsp73#

在更新到XCode 13和iOS 15之后,我也遇到了一些TabView问题,包括不同状态下的栏背景颜色和项目文本和图标颜色。我是这么解决的:

if #available(iOS 15, *) {
   let tabBarAppearance = UITabBarAppearance()
   tabBarAppearance.backgroundColor = backgroundColor
   tabBarAppearance.stackedLayoutAppearance.selected.titleTextAttributes = [.foregroundColor: selectedItemTextColor]
   tabBarAppearance.stackedLayoutAppearance.normal.titleTextAttributes = [.foregroundColor: unselectedItemTextColor]
   tabBar.standardAppearance = tabBarAppearance
   tabBar.scrollEdgeAppearance = tabBarAppearance
} else {
   UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor: selectedItemTextColor], for: .selected)
   UITabBarItem.appearance().setTitleTextAttributes([.foregroundColor: unselectedItemTextColor], for: .normal)
   tabBar.barTintColor = backgroundColor
 }
1szpjjfi

1szpjjfi4#

我有一个类似的问题here,通过在iOS 15中使用这个解决了

@available(iOS 15.0, *)
@NSCopying open var scrollEdgeAppearance: UITabBarAppearance?

描述当可观察的滚动视图滚动到底部时tabBar要使用的外观属性。如果未设置,则将使用standardAppearance。

//@available(iOS 15.0, *)
//@NSCopying open var scrollEdgeAppearance: UITabBarAppearance?

let appearance: UITabBarAppearance = UITabBarAppearance()
init() {
    UITabBar.appearance().scrollEdgeAppearance = appearance
}

相关问题