SwiftUILazyGridView 0.1.1

SwiftUILazyGridView 0.1.1

Thisura Dodangoda 维护。




SwiftUILazyGridView

CI Status Version License Platform

创建一个网格视图,允许在显示之前懒加载项。此pod不使用 LazyVGridLazyHGrid

安装

SwiftUILazyGridView 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中:

pod 'SwiftUILazyGridView'

优点

数据源由网格视图的 ViewModel 维护,因此您不必处理 SwiftUI 状态

兼容不同的方向

可变列和项目间距

支持所有与 SwiftUI 兼容的 iOS 版本

不支持的特性

项目懒加载(仅支持处理)类似于 SwiftUI 的 LazyVGrid

可变列数与固定项目尺寸

示例

1. 一个数据源类型为 Int 的网格,但在显示之前需要预处理。

struct ContentView: View{

    var viewModel = LazyGridViewModel<Int, String>(UIScreen.main.bounds.width - 10.0, spacing: 0.0)

    init(){
        setupData()
    }

    private func setupData(){
        for i in 0..<100{
            viewModel.addItem(i)
        }
    }

    var body: some View{
        LazyGridView<Int, String>(viewModel) { (input, callback) in

            // Processing closure
            let processedString = String(format: "Number %d", input)
            callback(processedString)

        } _: { (processed) -> AnyView in

            // View Builder closure
            return AnyView(
                Text(processed)
            )

        } _: { (clickedItem) in
            guard let index = viewModel.getAllItems().firstIndex (where: { $0?.id == clickedItem?.id }) else { return }
            print("You clicked the item at index, \(index)")
            self.addRandomItem()
        }

    }

}

2. 一个具有自定义数据源类型的网格,但在显示之前需要预处理。

struct CustomObject{
    var id: Int
    var name: String
}

struct ContentView: View{

    var viewModel = LazyGridViewModel<CustomObject, String>(UIScreen.main.bounds.width - 10.0, spacing: 0.0)

    init(){
        setupData()
    }

    private func setupData(){
        for i in 0..<100{
            let c = CustomObject(id: i, name: "Random Name")
            viewModel.addItem(c)
        }
    }

    var body: some View{
        LazyGridView<Int, String>(viewModel) { (input, callback) in

            // Processing closure
            DispatchQueue.global().async {
                // Simulate long running task
                let randomDelay = arc4random_uniform(10000000)
                usleep(randomDelay)

                // Processing complete!
                callback(input.name)
            }

        } _: { (processed) -> AnyView in

            // View Builder closure
            return AnyView(
                Text(processed)
            )

        } _: { (clickedItem) in
            guard let index = viewModel.getAllItems().firstIndex (where: { $0?.id == clickedItem?.id }) else { return }
            print("You clicked the item at index, \(index)")
            self.addRandomItem()
        }

    }

}

需求

  • iOS 13.0+
  • Xcode 11

作者

[email protected]

许可协议

SwiftUILazyGridView 适用于 MIT 许可协议。更多信息请参阅 LICENSE 文件。