开发网站价格,我要申请邮箱,做哪个网站的推广最好,东莞网站建设推广哪家好文章目录 前言视图修饰符应用场景可见性完整示例ContentViewVideoPlayerViewScrollViewVisibilityApp 总结 前言
我们的滚动 API 中又有一个重要的新增功能#xff1a;滚动可见性。现在#xff0c;你可以获取可见标识符列表#xff0c;或者快速检查并监控 ScrollView 内视图… 文章目录 前言视图修饰符应用场景可见性完整示例ContentViewVideoPlayerViewScrollViewVisibilityApp 总结 前言
我们的滚动 API 中又有一个重要的新增功能滚动可见性。现在你可以获取可见标识符列表或者快速检查并监控 ScrollView 内视图的可见性状态。本周我们将学习如何使用新的 onScrollTargetVisibilityChange 和 onScrollVisibilityChange 视图修饰符。
视图修饰符
让我们先从 onScrollTargetVisibilityChange 视图修饰符开始。它设计得易于使用允许你将其附加到具有滚动目标布局的任何 ScrollView 上。让我们通过一个示例来探讨这个修饰符的使用。
struct ContentView: View {State private var visible: [Int] []var body: some View {ScrollView {LazyVStack {ForEach(1..100, id: \.self) { item inText(verbatim: item.formatted())}}.scrollTargetLayout()}.onScrollTargetVisibilityChange(idType: Int.self) { identifiers invisible identifiers}.onChange(of: visible) {print(visible)}}
}如上例所示我们在懒加载栈LazyVStack上使用 scrollTargetLayout 视图修饰符以便允许 ScrollView 针对栈的子视图进行目标识别而不是针对栈本身。
要了解有关 scrollTargetLayout 视图修饰符的更多信息请查看我的文章《掌握 SwiftUI 中的 ScrollView滚动几何》。
应用场景
我们还将 onScrollTargetVisibilityChange 视图修饰符附加到 ScrollView 上提供标识符类型和操作闭包。在操作闭包内我们获取可见标识符列表并可以对可见项执行所需的操作。
有时视图需要在其可见性状态在 ScrollView 中发生变化时进行响应。对于这些情况SwiftUI 框架引入了 onScrollVisibilityChange 视图修饰符你可以将其附加到 ScrollView 内的任何视图上以处理其可见性。
struct VideoPlayerView: View {let url: URLState var player: AVPlayer?var body: some View {VideoPlayer(player: player).task {if player nil {player AVPlayer(url: url)}}.onScrollVisibilityChange { isVisible inif isVisible {player?.play()} else {player?.pause()}}}
}上例定义了 VideoPlayerView 视图该视图在其可见时自动播放视频内容。正如你所见我们将 onScrollVisibilityChange 视图修饰符附加到视图本身并提供一个操作闭包。我们在操作闭包内获得可见性参数并可以对其变化进行响应。
可见性
onScrollVisibilityChange 和 onScrollTargetVisibilityChange 修饰符都具有 threshold 参数。threshold 参数允许我们调整需要可见的视口部分的数量以触发操作闭包。默认情况下SwiftUI 框架使用 0.5 作为阈值这意味着至少 50% 的视图需要可见SwiftUI 才会运行操作。但你可以轻松调整此值。
struct VideoPlayerView: View {let url: URLState var player: AVPlayer?var body: some View {VideoPlayer(player: player).task {if player nil {player AVPlayer(url: url)}}.onScrollVisibilityChange(threshold: 0.1) { isVisible inif isVisible {player?.play()} else {player?.pause()}}}
}在上述示例中我们定义了阈值这意味着 SwiftUI 将在视图至少有 10% 可见时运行操作闭包。同样当视图从可见状态转换为不可见状态即显示的视口部分少于 10% 时也会运行该闭包。
完整示例
上面对视图修饰符有了初步了解它的设计得易于使用允许你将其附加到具有滚动目标布局的任何 ScrollView 上。让我们通过一个示例来探讨这个修饰符的使用。
示例代码如下
import SwiftUI
import AVKitstruct ContentView: View {State private var visible: [Int] []var body: some View {ScrollView {LazyVStack {ForEach(1..100, id: \.self) { item inText(verbatim: item.formatted()).frame(width: 100, height: 100).background(item % 2 0 ? Color.blue : Color.red).cornerRadius(10).padding(5)}}.scrollTargetLayout()}.onScrollTargetVisibilityChange(idType: Int.self) { identifiers invisible identifiers}.onChange(of: visible) { newVisible inprint(Visible items: \(newVisible))}.navigationTitle(ScrollView Demo)}
}struct VideoPlayerView: View {let url: URLState var player: AVPlayer?var body: some View {VideoPlayer(player: player).frame(height: 200).task {if player nil {player AVPlayer(url: url)}}.onScrollVisibilityChange { isVisible inif isVisible {player?.play()} else {player?.pause()}}}
}main
struct ScrollViewVisibilityApp: App {var body: some Scene {WindowGroup {NavigationView {VStack {ContentView()Spacer()VideoPlayerView(url: URL(string: https://www.example.com/video.mp4)!).padding()}}}}
}这个示例 Demo 展示了如何使用 onScrollTargetVisibilityChange 和 onScrollVisibilityChange 视图修饰符来跟踪 ScrollView 中的视图可见性。整个示例分为两个部分一个是显示带有多个文本视图的 ScrollView另一个是显示一个视频播放器视图。
ContentView
ScrollView 和 LazyVStack使用 ScrollView 包裹一个 LazyVStack在其中放置 1 到 99 的数字。每个数字都显示在一个 Text 视图中并有不同的背景颜色。scrollTargetLayout在 LazyVStack 上应用 scrollTargetLayout 视图修饰符以允许 ScrollView 针对栈的子视图进行目标识别。onScrollTargetVisibilityChange在 ScrollView 上应用 onScrollTargetVisibilityChange 视图修饰符并提供标识符类型和操作闭包。在操作闭包内获取可见标识符列表并赋值给 visible 状态变量。onChange监听 visible 状态变量的变化并打印当前可见的项。
VideoPlayerView
VideoPlayer定义一个视频播放器视图使用 AVPlayer 播放视频。task在 task 修饰符中初始化播放器。onScrollVisibilityChange在视频播放器视图上应用 onScrollVisibilityChange 视图修饰符并提供一个操作闭包。在操作闭包内根据可见性状态来播放或暂停视频。
ScrollViewVisibilityApp
主应用入口定义主应用入口 ScrollViewVisibilityApp将 ContentView 和 VideoPlayerView 组合到一个垂直堆栈中并通过 NavigationView 进行导航。
运行这个 Demo你会看到一个带有多个文本视图的 ScrollView当你滚动时控制台会打印当前可见的项。此外在页面底部有一个视频播放器当视频播放器出现在视口内时它会自动播放当其离开视口时会自动暂停。
总结
今天我们学习了如何跟踪 ScrollView 内特定视图的可见性并监控可见标识符列表。示例展示了如何使用 SwiftUI 的滚动可见性修饰符来增强用户体验和交互性。希望能对你有所帮助。