UIKitViews

UIKitViews 是 UIViewUIViewController 的 SwiftUI 封装。它提供了 UIKit 组件与 SwiftUI 框架的无缝集成。UIKitView 封装器使得直接从你的 SwiftUI 视图中添加和操作 UIKit 视图和视图控制器变得非常容易。
UIKitViews 构建于 VDChain 之上,并且是 VDLayout 库的一部分,该库为 UIKit 视图和视图控制器提供 DSL 语法。

特性

用法

使用 UIKitViews 非常简单,只需将你想要的 UIViewUIViewController 放置在 UIKitView 闭包中即可

UIKitView {
    UILabel().chain
       .font(.systemFont(ofSize: 24)) // Constant properties
       .textColor(.black)
}
.text(title) // Updatable properties

注意

UIKitView body 闭包仅在视图创建时调用一次,因此没有理由在此闭包中使用任何可更新的变量。但是,这是设置常量参数(例如约束或字体)的完美位置。

注意

此示例中的 .text.textColor.font 不是硬编码的方法;它们是键路径链。这意味着你的 UIKit 视图的任何属性都可以用作 UIKitView 的修饰符方法。

运算符

UIKitViews 提供了一个特殊的运算符 §,允许你使用自动闭包更简洁地创建一个 UIKitView

UILabel()§
  .font(.systemFont(ofSize: 24)) 
  .textColor(.black)
  .text(title)

环境

UIKitView 还通过 UIView/UIViewController 键路径支持环境变量

VStack {
  UIKitView {
    UILabel()
  }
  UIKitView {
    UILabel()
  }
}
.uiKitViewEnvironment(\UILabel.font, .systemFont(ofSize: 24))

如果需要访问环境,可以这样做

@Environment(\UILabel.font) var uiLabelFont

你还可以将 SwiftUI 环境绑定到 UIKitView

UIKitView {
   UIScrollView()
}
.uiKitViewBind(environment: \.isScrollEnabled, to: \UIScrollView.isScrollEnabled)

使用 uiKitViewFixedSize() 进行自适应大小

该库包含一个方法 uiKitViewFixedSize(),允许 UIKit 视图根据其内容动态调整其大小。你可以指定自适应大小的轴

.uiKitViewFixedSize()
.uiKitViewFixedSize(.vertical)
.uiKitViewFixedSize(.horizontal)

注意

如果你知道视图的高度或宽度,最好使用 SwiftUI 的 frame 修饰符而不是 uiKitViewFixedSize 来设置它。

警告

这些方法的行为在 iOS 16+ 和之前的版本之间可能略有不同。建议在不同的 iOS 版本上进行测试。
如果你注意到任何不良差异,可以使用 uiKitViewUseWrapper(.always) 方法来修复它。

uiKitViewContentMode(_:)

当 UIView 的大小未固定时,uiKitViewContentMode(_:) 方法会调整其内容的调整大小行为。 你将 UIKitViewContentMode 值传递给此方法,以指定希望视图如何调整其内容的大小。

它带有两种模式

这是一个例子

UIKitView {
    UILabel().chain
       .font(.system(34))
       .textColor(.black)
       .textAlignment(.left)
}
.uiKitViewFixedSize(.vertical)
.uiKitViewContentMode(.fit(.trailing))

在此示例中,UILabel 将调整其内容的大小以适应其边界,同时保留其纵横比。 内容位于 UIKitView 的尾部边缘。

HostingViewSelfSizingHostingController

该存储库包含另外两个关键特性

struct SomeView: View {

  var text: String
  // ...
}
// ...
let hosting = HostingView(SomeView())
hosting.text = "new text" // it will update the view

安装

  1. Swift Package Manager

创建一个 Package.swift 文件。

// swift-tools-version:5.7
import PackageDescription

let package = Package(
  name: "SomeProject",
  dependencies: [
    .package(url: "https://github.com/dankinsoid/UIKitViews.git", from: "1.5.0")
  ],
  targets: [
    .target(name: "SomeProject", dependencies: ["UIKitView"])
  ]
)
$ swift build
  1. CocoaPods

将以下行添加到你的 Podfile

pod 'UIKitViews'

并首先从 podfile 目录运行 pod update

作者

dankinsoid, voidilov@gmail.com

许可

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