photoshop画简单网站苏州网站推广如何
news/
2025/9/29 22:39:23/
文章来源:
photoshop画简单网站,苏州网站推广如何,上海网站建设哪家口碑好,生活服务手机网站开发ScrollViewReader是我最喜欢的SwiftUI新版本的新功能之一。在iOS 14发布之前#xff0c;控制ScrollView的滚动位置并不容易。如果希望滚动视图滚动到特定位置#xff0c;我们必须找到自己的解决方案。
使用ScrollViewReader#xff0c;只需几行代码#xff0c;就可以使滚动…ScrollViewReader是我最喜欢的SwiftUI新版本的新功能之一。在iOS 14发布之前控制ScrollView的滚动位置并不容易。如果希望滚动视图滚动到特定位置我们必须找到自己的解决方案。
使用ScrollViewReader只需几行代码就可以使滚动视图滚动到特定位置。本篇文章我们将探究一下ScrollViewReader的使用。
关于ScrollView的使用想必大家都不陌生了先看一下下面这个示例
struct ScrollViewReaderDemo: View {var body: some View {ScrollView {ForEach(0..50) { index inText(This is item \(index)).font(.headline).frame(height: 150).frame(maxWidth: .infinity).background(Color.white).cornerRadius(10).shadow(radius: 10).padding()}}}
}上面是一个比较简单的ScrollView使用方法我们可以手动滑动界面。如果我们想要代码控制滚到哪里或者是满足某个条件后自动滚动那如何处理呢以前在UIKit中我们能持有UIScrollView的实例变量然后调用相关方法那么在SwiftUI中有这么一个实例变量吗
答案是肯定有的那就是使用ScrollViewReader。
ScrollViewReader是通过使用代理来滚动到已知的子视图从而提供程序化滚动的视图。 ScrollViewReader的构造闭包里面返回了一个ScrollViewProxy类型的实例对象通过这个对象调用scrollTo(_:anchor:)方法实现滚动。
func scrollToID(_ id: ID,anchor: UnitPoint? nil
) where ID : Hashableid: 子视图的唯一标识。 anchor: 滚动动作的对齐行为。
如果anchor为nil则此方法会找到已标识视图并滚动最小值以使已标识视图完全可见。 如果anchor非nil它将定义已标识视图和滚动视图中要对齐的点。例如将anchor设置为top将标识视图的顶部与滚动视图的顶部对齐。类似地将anchor设置为bottom将标识视图的底部与滚动视图的底部对齐依此类推。
下面的代码中添加了一个Button点击后将ScrollView滚动指定的位置尤其要注意的是记得给每个子视图添加id修饰符要不然滚动的时候就找不到指定视图了。
struct ScrollViewReaderDemo: View {var body: some View {ScrollViewReader { proxy inScrollView {Button(Scroll to specific item) {withAnimation{proxy.scrollTo(30, anchor: .bottom)}}ForEach(0..50) { index inText(This is item \(index)).font(.headline).frame(height: 150).frame(maxWidth: .infinity).background(Color.white).cornerRadius(10).shadow(radius: 10).padding().id(index)}}}}
}上面的代码能够轻松的实现ScrollView的滚动ScrollViewReader闭包返回的proxy代理了ScrollView进而操作滚动问题来了proxy的作用域只在ScrollViewReader闭包内如果点击滚动的按钮在外面或者在导航栏上那该如何实现呢
struct ScrollViewReaderDemo: View {State private var scrollToIndex: Int?var body: some View {NavigationStack {ScrollViewReader { proxy inScrollView {ForEach(0..50) { index inText(This is item \(index)).font(.headline).frame(height: 150).frame(maxWidth: .infinity).background(Color.white).cornerRadius(10).shadow(radius: 10).padding().id(index)}}.onChange(of: scrollToIndex) { newValue inif let newValue {withAnimation {proxy.scrollTo(newValue, anchor: .top)}}}}.navigationTitle(Title).navigationBarTitleDisplayMode(.inline).toolbar(content: {ToolbarItem(placement: .topBarTrailing) {Button(Scroll) {scrollToIndex 30}}})}}
}上面代码中将点击滚动的按钮放到了导航栏的右侧这个时候在Button的点击事件内已经访问不到proxy代理了。 虽然访问不到了但是我们可以通过一个状态变量State修饰的变量的变化来触发滚动。
State private var scrollToIndex: Int?然后在能访问到proxy代理的区域内监听scrollToIndex的变化然后滚动视图。代码中给ScrollView添加了onChange修饰符并添加观察对象scrollToIndex当scrollToIndex变化的时候onChange修饰符闭包会被触发并返回最新的scrollToIndex的值。
.onChange(of: scrollToIndex) { newValue inif let newValue {withAnimation {proxy.scrollTo(newValue, anchor: .top)}}
}在Button的事件里面修改scrollToIndex的值即可。
.toolbar(content: {ToolbarItem(placement: .topBarTrailing) {Button(Scroll) {scrollToIndex 30}}
})通过这种方法就实现了外部点击内部ScrollView滚动的效果了。当然后上面代码只是提供了一个实现外部触发滚动的参考具体还得看大家的业务和设计需求了。
另外ScrollViewReader也可以和List组合使用滚动List。
写在最后
ScrollViewReader是SwiftUI框架的一个很好的补充。现在无需开发自己的解决方案就可以轻松地指示任何滚动视图滚动到特定位置。
最后希望能够帮助到有需要的朋友如果觉得有帮助还望点个赞添加个关注笔者也会不断地努力写出更多更好用的文章。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922310.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!