SwiftUI 3 更新细览:列表、自定义滑动动作、AsyncImage 等

1,379

苹果正在继续努力使SwiftUI的Swift的声明式UI框架,与UIKit和AppKit相提并论。在WWDC 2021上,SwiftUI获得了许多新功能,包括扩展的列表视图,支持拉动刷新,异步图像等。

列表是iOS应用设计的基石,但苹果花了两年时间才在SwiftUIList 中加入对自定义滑动操作和拉动刷新这两种最常见的交互模式的支持。

在SwiftUI 3中,自定义滑动动作可以被添加到列表项中。你可以添加多个按钮来支持不同的动作,也可以指定其中一个动作作为默认动作,在完全轻扫时执行。这样你就可以从显示屏的两个边缘添加轻扫动作。

List {
    ForEach(labels) { label in
        Text(label)
            .swipeActions(edge: .leading) {
                Button { doAction(message) } { buttonImage }
            }
            .swipeActions(edge: .trailing) {
                Button { doAnotherAction(message) } { anotherButtonImage }
            }
    }
}

同样,你现在可以使用refreshable modifier来在用户执行标准手势时触发一个异步操作。

List(mailbox.conversations) {
    ConversationCell($0)
}
.refreshable {
    await mailbox.fetch()
}

另一个与列表有关的重要新功能是支持使用searchable修改器进行搜索。你可以把它附加到一个NavigationView 或一个List ,并指定一个标签、一个位置提示和自动完成建议。

List {...}.searchable("Search", text: $value, placement: .automatic) {
    Text("moniker1").searchCompletion("fullValue1")
    Text("moniker2").searchCompletion("fullValue2")
    ...
}

对 SwiftUI 列表的其他有用的补充包括一些修改器,用于在部分和单元格中设计分隔符和色调,包括 \listRowSeparatorTint\

\listRowSeparator\

\listSectionSeparatorTint\

SwiftUI 3还带来了对视图内异步操作的支持。特别是,新的 task修改器允许你在第一次显示视图时启动一个异步操作。

Text(value).task { value = await asyncOp() }

task 类似于onAppear ,但它是专门针对异步操作的。例如,当视图消失时,异步任务会自动取消。

此外。 AsyncImage使得显示从远程位置下载的图片变得简单明了。你可以在下载远程图片时指定一个占位符图片来显示,并在一个闭包中操作后者,例如使其可调整大小。

AsyncImage(url: URL(string: "https://example.com/icon.png")) { image in
    image.resizable()
} placeholder: {
    ProgressView()
}
.frame(width: 50, height: 50)

SwiftUI 3中的一个非面向用户的功能将使开发者的生活变得更加轻松,那就是Self._printChanges() ,该方法可以从视图的body 方法中调用。这可以用来记录改变的属性名称,从而导致视图被重新渲染。正如其名称中的下划线所表示的那样,这个方法并不意味着可以在应用程序中使用。

SwiftUI的其他有用扩展包括 FocusState属性包装器,它可以管理控件是否被聚焦的状态; AttributedStringText 类中的标记支持材料背景类型,旨在模拟由几种材料(从超薄到超厚)在出现在背景中的视图上产生的玻璃般的模糊效果。

SwiftUI 3仍处于测试阶段,将在iOS 15和Xcode 13中使用。关于SwiftUI 3的内容还有很多,这里就不一一介绍了,所以不要错过WWDC 2021的SwiftUI的新功能视频。

原文链接:www.infoq.com/news/2021/0…