iOS 14中如何隐藏列表分隔符?SidebarListStyle()未达预期
解决iOS 14中List分隔符隐藏失效的问题
我太懂你这种闹心的感觉了——本来想靠自定义的noSeparators()修饰符隐藏List分隔符,结果iOS 14里的SidebarListStyle()完全没达到预期效果,折腾半天还是不理想。咱们来一步步把这个问题捋顺解决:
问题根源
iOS 14的SidebarListStyle()从设计初衷就不是用来隐藏分隔符的,它主要是为侧边栏布局提供特定样式,分隔符的处理逻辑和PlainListStyle()完全不同。而且你原来的扩展里,iOS 14分支只替换了listStyle,根本没做实际的分隔符隐藏处理,这就是效果拉胯的核心原因。
修复方案
其实iOS 14已经新增了官方的分隔符控制修饰符.listRowSeparator(_:),用它来隐藏分隔符比旧的UITableView全局外观修改靠谱得多,还不会影响其他列表的样式。咱们直接调整你的noSeparators()扩展:
调整后的完整扩展代码
extension List { @ViewBuilder func noSeparators() -> some View { #if swift(>=5.3) // Xcode 12 if #available(iOS 14.0, *) { // iOS14+ 使用官方原生分隔符隐藏方案 self.listRowSeparator(.hidden) .listStyle(PlainListStyle()) // 避开Sidebar样式的干扰 } else { // iOS13 沿用原有的UITableView外观修改逻辑 self.listStyle(PlainListStyle()) .onAppear { UITableView.appearance().tableFooterView = UIView() UITableView.appearance().separatorStyle = .none } .onDisappear { UITableView.appearance().separatorStyle = .singleLine } } #else // Xcode 11.5 self.listStyle(PlainListStyle()) .onAppear { UITableView.appearance().tableFooterView = UIView() UITableView.appearance().separatorStyle = .none } .onDisappear { UITableView.appearance().separatorStyle = .singleLine } #endif } }
额外适配建议
如果你确实需要保留SidebarListStyle()的布局样式,那iOS 14+下可以给列表的每一行单独添加分隔符隐藏修饰符,比如:
List{ MessageDetail(messages: self.$viewModel.messages) .listRowSeparator(.hidden) // 给单个列表行隐藏分隔符 } .noSeparators() .modifier(DismissingKeyboard()) .scaleEffect(x: 1, y: -1, anchor: .center) .offset(y:-5)
这样修改后,就能稳定地隐藏List的分隔符,不会再出现之前的混乱效果了。
内容的提问来源于stack exchange,提问作者Halil İbrahim YÜCE
相关产品推荐
相关产品推荐

