scrollview下拉刷新_SwiftUI之View Tree 实战3(下拉刷新)

不得不说,在SwiftUI中,Preference这项技术实在是太神奇了,这也是我为什么写这么多与其相关文章的原因,它的原理是如此的简单,但加上我们的想象力,它却又无所不能。

在本篇文章中,我们将再次基于此技术,来实现一个最常用的功能,如下图所示:

f093d98ee312b1f05524dd09bfb95a02.png

SwiftUI为ScrollView提供的功能非常有限,以至于在UIKit中很容易实现的功能,在SwiftUI中,却变得毫无头绪,本例的核心思想非常简单,看下图就可明白:

43f127382fd0ac622adf4ccfe34bde8b.png

核心思想就是,计算MovingView和FixedView两者之间的y的差,从而得到offset。

其中,FixedPositionView的代码如下:

/// 位置固定不变的view
struct FixedPositionView: View {
    
    var body: some View {
    
        GeometryReader {
     proxy in
            Color
                .clear
                .preference(key: MCRefreshablePreferenceTypes.MCRefreshablePreferenceKey.self,
                            value: [MCRefreshablePreferenceTypes.MCRefreshablePreferenceData(viewType: .fixedPositionView, bounds: proxy.frame(in: .global))])
        }
    }
}

可以看出,我们通过.preference为其绑定了一个MCRefreshablePreferenceData类型的数据,最重要的目的是保存该view的bounds。那么同理,MovingPositionView的代码如下:

/// 位置随着滑动变化的view,高度为0
struct MovingPositionView: View {
    
    var body: some View {
    
        GeometryReader {
     proxy in
            Color
                .clear
                .preference(key: MCRefreshablePreferenceTypes.MCRefreshablePreferenceKey.self,
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值