swiftui 列表部分中的圆角

Posted

技术标签:

【中文标题】swiftui 列表部分中的圆角【英文标题】:Rounded corners in swiftui list sections 【发布时间】:2019-09-15 16:11:28 【问题描述】:

这是 ios 13 Health 应用程序 - 用户个人资料的屏幕截图。我最近从swiftui 开始,想知道如何开发如下所示的屏幕。我尝试了简单和分组的列表样式。但是我看不到下面的布局。

这样的 UI 可以纯粹使用 swiftui-list 开发吗?

我正在专门寻找圆形部分并在列表中包含图像。

【问题讨论】:

是的,这样的 UI 可以完全使用 SwiftUI 制作。您能否提供您已有的代码以便我们为您提供帮助? 我刚刚在 swift ui 中玩过 List。没有具体的代码可以分享。 【参考方案1】:

从 iOS 14 开始,您可以使用以下代码。它工作得非常完美,就像在 UIKit 中一样。

List 
    Section 
        Text("Item 1")
        Text("Item 2")
        Text("Item 3")
    
    
    Section 
        Text("Item 4")
        Text("Item 5")
        Text("Item 6")
    
.listStyle(InsetGroupedListStyle()) // this has been renamed in iOS 14.*, as mentioned by @Elijah Yap
.environment(\.horizontalSizeClass, .regular)

谢谢。

【讨论】:

不知道为什么会这样(我猜框架当时会根据屏幕尺寸选择默认值)但它确实有效。对于另辟蹊径的人(强制在 iPad 上缺少边框)使用 .compact 而不是 .regular 感谢@AndrewL 的评论。这是非常正确的。 当我旋转手机时,使用它会导致列表内容延伸到视图之外 @KyleBradley 你是对的,列表行的内容延伸到屏幕之外,当你旋转到横向时会被剪掉。一旦发生这种情况,当您旋转回纵向时,内容仍会被剪裁。 我认为内容超出屏幕的问题是 SwiftUI 问题,而不是解决方案代码的问题。 SwiftUI 仍然相当新,并且有很多错误。我不认为有办法解决这个问题。希望这能消除一些困惑。【参考方案2】:

截至iOS 14.0,此列表样式为.listStyle(InsetGroupedListStyle())

【讨论】:

【参考方案3】:

根据我的发现和从 Xcode 11 GM 种子 2 (11A420a) 开始,仅从 swiftui 列表中制作此 UI 是不可能的。

有一种新的列表样式可用于名为 insetGrouped 的故事板。它具有完全相同的外观。 https://developer.apple.com/documentation/uikit/uitableview/style

【讨论】:

【参考方案4】:

我遇到了同样的问题,看起来您无法通过列表或部分来实现这一点。

当您将cornerRadius 修饰符放在一个部分或列表上时,它只会应用于内部使单元格变圆而部分本身未更改的任何内容。

我的解决方案是完全避免列表和部分,并构建自定义的。

有点像

SectionView: View 

    body: some View = 
        VStack 
            ForEach 
                CellView()
            
        
        .background(Color.white)
        .cornerRadius(10)
        .padding()
    

然后将这些部分放在Color 视图中的某些ZStack 上,以具有灰色背景。

考虑到最大的缺点是ForEach 将立即渲染所有单元格,就像如果您有一千个单元格,那么将为每个单元格调用onAppear(),奇怪的是它们会被调用倒序。

希望对你有帮助。

【讨论】:

以上是关于swiftui 列表部分中的圆角的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中圆角并减小列表的大小?

SwiftUI 中的上下文菜单预览没有圆角

如何根据 SwiftUI 中的日期将事件分成列表的不同部分?

在 SwiftUI 中使用绑定值添加和删除列表部分

重新排序列表部分 SwiftUI

SwiftUI for MacOS 窗口,带圆角,不带标题栏