SwiftUI 和 UIKit 无限 ScrollView 组件,还包括分页版本

无限滚动视图

InfiniteScrollViews 组合了一些有用的 SwiftUI 和 UIKit 组件。

递归逻辑

由于我们无法真正生成无限的视图并将它们放入 ScrollView 中,因此我们需要使用递归逻辑UIInfiniteScrollView 和 UIPagedInfiniteScrollView 可以显示“无限”内容的方式得益于以下逻辑:

  1. 您有一个通用类型ChangeIndex,它是组件在交换 View/UIViewController 时为您提供的一段数据。
  2. 当您初始化该组件时,它采用ChangeIndex类型的参数来绘制其第一个视图。
  3. 当用户向上/向下或向左/向右滚动时,组件将为您提供一个ChangeIndex但要获取其“下一个”或“上一个”值。它将用于使用 1 中的逻辑绘制“下一个”或“上一个”View/UIViewController。它会无限期地继续下去……但有一个例外:如果在步骤 3 发生时返回 nil,它将结束滚动并表现得好像没有更多内容可显示。让我们看一个例子:您想要绘制一个“无限”日历组件,就像 iOS 上的基本日历应用程序中的组件一样。所有这些都在 SwiftUI 中(但它也适用于 UIKit!)

例子

  1. 首先让我们看看如何初始化视图:

    InfiniteScrollView(
         frame: CGRect,
         changeIndex: ChangeIndex,
         content: @escaping (ChangeIndex) -> Content,
         contentFrame: @escaping (ChangeIndex) -> CGRect,
         increaseIndexAction: @escaping (ChangeIndex) -> ChangeIndex?,
         decreaseIndexAction: @escaping (ChangeIndex) -> ChangeIndex?,
         orientation: UIInfiniteScrollView<ChangeIndex>.Orientation
    )
    • 框架:InfiniteScrollView 的框架。
    • ChangeIndex:将用于绘制视图的第一个索引。
    • content:来自 InfiniteScrollView 的查询,用于从 ChangeIndex 绘制视图。
    • contentFrame:来自 InfiniteScrollView 的查询,用于从内容查询中获取视图的框架(它们是分开的,因此您可以直接在闭包中声明视图)。
    • increaseIndexAction:从InfiniteScrollView中查询,获取某个ChangeIndex后的值(递归逻辑)。
    • DecreaseIndexAction:从InfiniteScrollView中查询,获取某个ChangeIndex之前的值(递归逻辑)。
    • 方向:InfiniteScrollView 的方向。
  2. 让我们看看 content、increaseIndexAction 和decreaseIndexAction 是如何工作的:
    1. 对于我们的 MonthView,我们需要提供一个日期,以便它提取要显示的月份。可以这样声明:

      content: { currentDate in
          MonthView(date: currentDate)
              .padding()
      }
    2. 现在让我们看看增加/减少是如何工作的:要增加,我们需要获取提供的日期之后的月份:

      increaseIndexAction: { currentDate in
          return Calendar.current.date(byAdding: .init(month: 1), to: currentDate)
      }

      它将在 currentDate 的基础上添加一个月,如果操作不成功,则返回 nil 并且 InfiniteScrollView 停止。

    3. 同样的逻辑也适用于减少动作:

      decreaseIndexAction: { currentDate in
          return Calendar.current.date(byAdding: .init(month: -1), to: currentDate)
      }

其他示例可以在InfiniteScrollViewsExample中找到

斯威夫特用户界面

无限滚动视图

SwiftUI 中 ScrollView 组件的无限等价物。

分页无限滚动视图

SwiftUI 中分页 TabView 组件的无限等价物。

用户界面工具包

UI无限滚动视图

UIKit 中 UIScrollView 组件的无限等价物。

UIPagedInfiniteScrollView

UIKit 中 UIPageViewController 的简单版本。

GitHub

查看 Github