You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI:如何实现iOS设置应用样式的列表分隔线内边距

实现iOS设置应用风格的列表(标题与分隔线对齐且带分组)

针对你想要的iOS设置应用列表效果——标题与分隔线对齐、带分组且无折叠按钮,这里提供两种可行方案:

方案一:用SidebarListStyle+禁用Section折叠(iOS 15+)

在SidebarListStyle的List中,给每个Section添加.collapsible(false)修饰符,就能保留标题对齐的效果,同时禁用默认的折叠按钮,还能保留Section的分组分隔。

修改后的代码如下:

import SwiftUI

struct Test3View: View {
    var body: some View {
        NavigationView{
            List() {
                Section() {
                    NavigationLink(destination: Text("")) {
                        Label("row1", systemImage: "pencil.circle.fill")
                    }
                    NavigationLink(destination: Text("")) {
                        Label("row2", systemImage: "pencil.circle.fill")
                    }
                    NavigationLink(destination: Text("")) {
                        Label("row3", systemImage: "pencil.circle.fill")
                    }
                }
                .collapsible(false) // 禁用折叠按钮
                
                Section() {
                    NavigationLink(destination: Text("")) {
                        Label("row4", systemImage: "pencil.circle.fill")
                    }
                    NavigationLink(destination: Text("")) {
                        Label("row5", systemImage: "pencil.circle.fill")
                    }
                    NavigationLink(destination: Text("")) {
                        Label("row6", systemImage: "pencil.circle.fill")
                    }
                }
                .collapsible(false) // 禁用折叠按钮
                
            }
            .listStyle(SidebarListStyle())
        }
    }
}

方案二:自定义普通List的内边距与分隔线(兼容低版本)

如果需要兼容iOS 15以下版本,可以通过自定义行内边距和分隔线来实现标题与分隔线对齐的效果:

import SwiftUI

struct CustomSettingsView: View {
    // 统一设置行内边距,让标题对齐左侧
    private let rowInsets = EdgeInsets(top: 0, leading: 16, bottom: 0, trailing: 16)
    
    var body: some View {
        NavigationView{
            List() {
                Section() {
                    NavigationLink(destination: Text("")) {
                        HStack(spacing: 16) {
                            Image(systemName: "pencil.circle.fill")
                                .frame(width: 24) // 固定图标宽度,保证标题对齐
                            Text("row1")
                        }
                    }
                    .listRowInsets(rowInsets)
                    
                    NavigationLink(destination: Text("")) {
                        HStack(spacing: 16) {
                            Image(systemName: "pencil.circle.fill")
                                .frame(width: 24)
                            Text("row2")
                        }
                    }
                    .listRowInsets(rowInsets)
                    
                    NavigationLink(destination: Text("")) {
                        HStack(spacing: 16) {
                            Image(systemName: "pencil.circle.fill")
                                .frame(width: 24)
                            Text("row3")
                        }
                    }
                    .listRowInsets(rowInsets)
                }
                
                Section() {
                    NavigationLink(destination: Text("")) {
                        HStack(spacing: 16) {
                            Image(systemName: "pencil.circle.fill")
                                .frame(width: 24)
                            Text("row4")
                        }
                    }
                    .listRowInsets(rowInsets)
                    
                    NavigationLink(destination: Text("")) {
                        HStack(spacing: 16) {
                            Image(systemName: "pencil.circle.fill")
                                .frame(width: 24)
                            Text("row5")
                        }
                    }
                    .listRowInsets(rowInsets)
                    
                    NavigationLink(destination: Text("")) {
                        HStack(spacing: 16) {
                            Image(systemName: "pencil.circle.fill")
                                .frame(width: 24)
                            Text("row6")
                        }
                    }
                    .listRowInsets(rowInsets)
                }
            }
            // 调整分隔线内边距,使其与标题对齐
            .onAppear {
                UITableView.appearance().separatorInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0)
            }
            .onDisappear {
                // 恢复默认设置,避免影响其他页面
                UITableView.appearance().separatorInset = UIEdgeInsets.zero
            }
        }
    }
}

说明

  • 方案一利用SwiftUI原生API实现,代码简洁,适合iOS 15及以上版本;
  • 方案二通过自定义布局和调整UITableView的系统样式实现,兼容性更强,但需要注意恢复系统默认设置避免影响其他页面。

内容的提问来源于stack exchange,提问作者mars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:45:36