UIKitViews 是 UIView
和 UIViewController
的 SwiftUI 封装。它提供了 UIKit 组件与 SwiftUI 框架的无缝集成。UIKitView 封装器使得直接从你的 SwiftUI 视图中添加和操作 UIKit 视图和视图控制器变得非常容易。
UIKitViews 构建于 VDChain 之上,并且是 VDLayout 库的一部分,该库为 UIKit 视图和视图控制器提供 DSL 语法。
UIView
/UIViewController
键路径支持环境变量HostingView
,一个 UIHostingController
的 UIView 版本,支持通过键路径更新SelfSizingHostingController
- 一个 UIHostingController
,可以匹配根视图的大小uiKitViewFixedSize()
和 uiKitViewContentMode()
方法,用于 UIKit 视图的动态自适应大小使用 UIKitViews 非常简单,只需将你想要的 UIView
或 UIViewController
放置在 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()
,允许 UIKit 视图根据其内容动态调整其大小。你可以指定自适应大小的轴
.uiKitViewFixedSize()
.uiKitViewFixedSize(.vertical)
.uiKitViewFixedSize(.horizontal)
注意
如果你知道视图的高度或宽度,最好使用 SwiftUI 的 frame
修饰符而不是 uiKitViewFixedSize
来设置它。
警告
这些方法的行为在 iOS 16+ 和之前的版本之间可能略有不同。建议在不同的 iOS 版本上进行测试。
如果你注意到任何不良差异,可以使用 uiKitViewUseWrapper(.always)
方法来修复它。
当 UIView 的大小未固定时,uiKitViewContentMode(_:)
方法会调整其内容的调整大小行为。 你将 UIKitViewContentMode
值传递给此方法,以指定希望视图如何调整其内容的大小。
它带有两种模式
.fill
:内容应调整大小以完全填充视图。纵横比可能无法保留。.fit(Alignment)
:UIView 应调整大小以适应视图,同时保留其纵横比。 如果有额外的空间,对齐参数确定 UIView 在视图中的位置。这是一个例子
UIKitView {
UILabel().chain
.font(.system(34))
.textColor(.black)
.textAlignment(.left)
}
.uiKitViewFixedSize(.vertical)
.uiKitViewContentMode(.fit(.trailing))
在此示例中,UILabel 将调整其内容的大小以适应其边界,同时保留其纵横比。 内容位于 UIKitView 的尾部边缘。
该存储库包含另外两个关键特性
HostingView
:这是 UIView
的 UIHostingController
的类比。它支持通过键路径更新。struct SomeView: View {
var text: String
// ...
}
// ...
let hosting = HostingView(SomeView())
hosting.text = "new text" // it will update the view
SelfSizingHostingController
:这是一个 UIHostingController
,可以匹配 View 的大小,允许你的视图自动调整到其内容的大小。创建一个 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
将以下行添加到你的 Podfile
pod 'UIKitViews'
并首先从 podfile 目录运行 pod update
。
dankinsoid, voidilov@gmail.com
UIKitView 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。