ViewKit

ViewKit 是一个轻量级且用户友好的 Swift 包,它将类似 SwiftUI 的声明式语法带到 UIKit。它提供了一种以声明式和链式方式编写 UIKit 代码的方法,类似于 SwiftUI,从而使 UIKit 开发更加精简和易于上手。ViewKit 使用方法链来支持 UIKit 中可用的大多数自定义属性,从而实现更流畅和可读的语法。

ViewKit

安装

您可以使用 Swift Package Manager 安装 ViewKit。只需将以下行添加到您的 Package.swift 文件中

dependencies: [
    .package(url: "https://github.com/lucaswkuipers/ViewKit.git", from: "1.0.0")
]

用法

ProgrammaticView

ProgrammaticView 是 ViewKit 中用于创建视图的主要协议。以下是如何使用它

通过实现 ProgrammaticView 协议并在 body 属性中提供您的布局来定义您的视图。

这是一个例子

import ViewKit

final class MyView: ProgrammaticView {

    var body: UIView {
        VerticalStack(spacing: 20) {
            UILabel("Hello, world!")
                .font(.preferredFont(forTextStyle: .largeTitle))

            UIButton("Tap me!") { _ in print("Tapped") }
                .font(.preferredFont(forTextStyle: .title1))
                .backgroundColor(.systemBlue)
                .cornerRadius(10)
        }
    }
}

VerticalStack 和 HorizontalStack

VerticalStackHorizontalStack 的工作方式与 SwiftUI 中的 VStackHStack 类似。它们分别用于垂直和水平堆叠视图。

VerticalStack(spacing: 20) {
    // Your views here
}

HorizontalStack(spacing: 20) {
    // Your views here
}

此外,UIView 可以像 SwiftUI 中的 ZStack 一样使用,用于将视图堆叠在彼此之上。

Filler

Filler 的工作方式与 SwiftUI 中的 Spacer 类似。它会推开相邻的视图,占据所有可用的空间。

HorizontalStack(spacing: 20) {
    UILabel("Hello")
    Filler()
    UILabel("World")
}

在此示例中,“Hello”和“World”标签将被推到屏幕的相对两侧,它们之间的所有剩余空间都将由 Filler 填充。

ViewController

您可以将此 ProgrammaticView 与自定义 ViewController 一起使用,该自定义 ViewController 在其构造函数中接受 ProgrammaticView 并将其设置为其视图。

这是一个例子

let viewController = ViewController(with: MyView())

预览

您还可以通过将您的 ProgrammaticView 嵌入到 PreviewContainer 中,在 Xcode 画布中预览您的 ViewKit 视图,如下所示

import SwiftUI

struct MyView_Previews: PreviewProvider {
    static var previews: some View {
        PreviewContainer {
            MyView()
        }
    }
}

概念

结果构建器和 Fluent Interfaces

ViewKit 利用 Swift 的结果构建器和 fluent interfaces 来创建更具声明性的语法并减少样板代码。这有助于保持您的 UIKit 代码简洁易懂。

许可

ViewKit 在 MIT 许可下可用。有关更多信息,请参见 LICENSE 文件。

Swift Package Index

在 Swift Package Index 上查看: https://swiftpackageindex.cn/lucaswkuipers/ViewKit