如何在 SwiftUI 中使用文本旋转(或类似的东西)构建可滚动的侧边菜单?

How to build scrollable side menu using text rotation (or something similar) in SwiftUI?

我想构建一个如下图所示的菜单,我可以在菜单之间滚动。我确实在 ScrollView 中尝试了 HStack/VStack 和 Text and/or 堆栈上的旋转修饰符的多种组合。但是,none 我的尝试确实按预期工作。

尝试 1

代码

struct ContentView: View {

    let sections = ["Exclusives", "Apple", "Android", "Videos", "Got a leak ?"].reversed()

    var body: some View {
        VStack(spacing: 0) {
        
            // Header
            Rectangle()
                .fill(Color(UIColor.quaternaryLabel))
                .frame(height: UIScreen.main.bounds.width * 0.2)
        
            // Vertical Menu + Content
            HStack(spacing: 0) {
            
                // Menu using VStack and rotation on Text
                ScrollView(.vertical) {
                    VStack(spacing: 32) {
                        ForEach(sections, id: \.self) { section in
                            Text(section)
                                // padding added on workingdog suggestion.
                                // But steal not producing exactly what I'm looking for. 
                                .padding()
                                .rotationEffect(.degrees(-90), anchor: .center)
                        }
                    }
                }
            
                // Content Placeholder
                Rectangle()
                    .fill(Color(UIColor.tertiarySystemFill))
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
            }
            .ignoresSafeArea(.all, edges: .bottom)
        }
    }
}

结果

尝试 2

代码

struct ContentView: View {

    let sections = ["Exclusives", "Apple", "Android", "Videos", "Got a leak ?"].reversed()

    var body: some View {
        VStack(spacing: 0) {
        
            // Header
            Rectangle()
                .fill(Color(UIColor.quaternaryLabel))
                .frame(height: UIScreen.main.bounds.width * 0.2)
        
            // Vertical Menu + Content
            HStack(spacing: 0) {
            
                // Menu using rotation on HStack
                ScrollView(.vertical) {
                    HStack(spacing: 32) {
                        ForEach(sections, id: \.self) { section in
                            Text(section)
                        }
                    }
                    .rotationEffect(.degrees(-90), anchor: .center)
                }
            
                // Content Placeholder
                Rectangle()
                    .fill(Color(UIColor.tertiarySystemFill))
                    .frame(maxWidth: .infinity, maxHeight: .infinity)
            }
            .ignoresSafeArea(.all, edges: .bottom)
        }
    }
}

结果

问题

我确实尝试了其他方法,并从这两个概念派生出微小的变化。但据我了解,问题来自于使用旋转修饰符,它旋转内容,而不是视图本身(导致不需要的行为)。

感谢您的帮助!

也许这样更接近图片:

struct ContentView: View {
                                                                      // added this space
    let sections = ["Exclusives", "Apple", "Android", "Videos", "Got a leak ?", ""].reversed()
    
    var body: some View {
        HStack { 
            // Menu using HStack 
        ScrollView(.horizontal) {
            HStack(spacing: 32) {
                ForEach(sections, id: \.self) { section in
                    Text(section)
                        .padding().border(.red)
                }
            }
        }.rotationEffect(.degrees(-90), anchor: .center)
            VStack(spacing: 0) {
                // Header
                Rectangle()
                    .fill(Color(UIColor.quaternaryLabel))
                    .frame(height: UIScreen.main.bounds.width * 0.2)
                // Vertical Content
                HStack(spacing: 0) {
                    // Content Placeholder
                    Rectangle()
                        .fill(Color(UIColor.tertiarySystemFill))
                        .frame(maxWidth: .infinity, maxHeight: .infinity)
                }
            }
        }.ignoresSafeArea(.all, edges: .bottom)
    }
}

我确实找到了一个很好的解决方案,使用尝试 2 并使用@robniper 旋转整个文本视图这里有详细的答案: