返回

让 SwiftUI 拥有丝滑顺畅的侧滑菜单 Side Menu

IOS

序幕:何为侧滑菜单?

侧滑菜单,也被称为侧边菜单、抽屉式菜单或汉堡包菜单,是一种常见的移动端导航模式,通过轻触或滑动屏幕边缘来打开或关闭一侧的菜单面板,同时主内容区域会被自动遮挡。这种交互方式在移动端应用中已广泛流行,为用户提供了一个简洁直观的导航体验。

SwiftUI 实践:从零构建侧滑菜单

1. 准备工作:

  • 确保使用 Xcode 11 以上版本和 iOS 13 SDK。
  • 在你的 Xcode 项目中创建新的 SwiftUI View 文件,命名为 ContentView
  • ContentView 中添加如下代码:
struct ContentView: View {
    @State private var isMenuOpen = false
    
    var body: some View {
        ZStack {
            Color.blue
            
            // Main content goes here
            Text("Main Content")
                .foregroundColor(.white)
                .font(.largeTitle)
                .padding()
            
            // Side menu
            SideMenu(isOpen: $isMenuOpen)
        }
    }
}
  • ContentView 中添加一个新的 SideMenu 结构体,如下所示:
struct SideMenu: View {
    @Binding var isOpen: Bool
    
    var body: some View {
        ZStack {
            // Menu background
            Color.white
            
            // Menu items
            VStack {
                Text("Menu Item 1")
                Text("Menu Item 2")
                Text("Menu Item 3")
            }
        }
        .frame(width: 200)
        .offset(x: isOpen ? 0 : -200) // Slide the menu in and out
        .animation(.spring()) // Add a spring animation for smooth sliding
    }
}
  • ContentView 中,将 SideMenu 添加到 ZStack 中,并设置 isOpen 绑定:
ZStack {
    Color.blue
    
    // Main content goes here
    Text("Main Content")
        .foregroundColor(.white)
        .font(.largeTitle)
        .padding()
    
    // Side menu
    SideMenu(isOpen: $isMenuOpen)
}

2. 实现手势控制:

  • ContentView 中,添加一个 gesture 修饰符到 ZStack 上,以启用手势控制:
ZStack {
    Color.blue
    
    // Main content goes here
    Text("Main Content")
        .foregroundColor(.white)
        .font(.largeTitle)
        .padding()
    
    // Side menu
    SideMenu(isOpen: $isMenuOpen)
}
.gesture(DragGesture()
    .onChanged { gesture in
        // Slide the menu open or closed based on the gesture
    }
    .onEnded { _ in
        // Close the menu when the gesture ends
    }
)
  • 在手势闭包中,根据手势方向和距离来控制 isMenuOpen 的状态,实现侧滑菜单的开关。

3. 优化视觉效果:

  • SideMenu 结构体中,可以根据自己的喜好调整菜单的视觉效果,比如改变背景颜色、菜单项的颜色和字体、增加边框等。
  • ContentView 中,可以为 ZStack 添加一个模糊效果,在侧滑菜单打开时为后面的主内容区域添加一个模糊背景。

4. 添加更多功能:

  • 可以为菜单项添加图标,使其更具视觉吸引力。
  • 可以为菜单项添加链接或操作,使其可以跳转到其他视图或执行某些操作。

结语

恭喜你!你已经成功地用 SwiftUI 创建了一个侧滑菜单,并学会了如何控制它的打开和关闭。SwiftUI 的强大之处在于它让这种复杂的功能变得如此简单易行,让你可以专注于构建更直观、更用户友好的应用。