为 iOS 开发 Kanzi 应用程序¶
您可以使用 Kanzi application framework (appfw) 为 iOS 开发 Kanzi 应用程序。您使用 C++ 编写应用程序和插件代码,并使用 CMake 和 Xcode 构建应用程序。开始之前,请查看 要求。
当您使用以下模板之一创建工程时,Kanzi Studio 会生成现成的 iOS CMake 配置以及用于生成 Xcode 工程的辅助脚本:
Application
Application with data source plugin
Application with Kanzi Engine plugin
iOS 工程结构¶
<ProjectName>/Application/configs/platforms/ios/ 目录包含:
CMakeLists.txt– 将 iOS 和 Xcode 特定的设置应用于可执行目标。其中包括:XCODE_ATTRIBUTE_INSTALL_PATH设置为output。结合传递给xcodebuild install的DSTROOT=$(PROJECT_DIR),这会将构建的应用程序放在<Application>/output/中。XCODE_EMBED_FRAMEWORKS– 将 Vulkan 和 MoltenVK 框架嵌入到应用程序包中。XCODE_EMBED_RESOURCES– 嵌入您从 Kanzi Studio 导出的 kzb 二进制文件。
Info.plist– 定义启动屏幕、支持的屏幕方向,以及将应用程序连接到 iOS 应用程序外壳所提供的SceneDelegate的UIApplicationSceneManifest。Assets.xcassets– 包含应用程序图标。src/– 承载KanziView的 iOS 应用程序外壳:main.m–UIApplicationMain入口点。app_delegate.h,m– 选择默认场景配置的UIApplicationDelegate。scene_delegate.h,m– 创建UIWindow并安装根ViewController的UIWindowSceneDelegate。view_controller.h,m– 全屏UIViewController,其根视图为KanziView。您在此处将 Kanzi 视图嵌入到 iOS 视图层级中。
Application 文件夹还包含 generate_cmake_xcode_ios_project.sh,该脚本使用 CMake Xcode 生成器和 Kanzi iOS 工具链生成 Xcode 工程。
iOS 平台包在 KanziAppFwKit XCFramework 中提供 KanziView 和 KanziViewRepresentable。生成的 CMake 配置会将您的应用程序目标链接到 KanziAppFwKit,并将该 XCFramework 嵌入到应用程序包中。
要了解如何构建应用程序并将其部署到 iOS 设备,请参阅 将 Kanzi 应用程序部署到 iOS。
KanziView¶
KanziView 是 UIKit UIView 的子类,用于在 iOS 视图层级中承载 Kanzi 渲染。您可以将 KanziView 放在 UIKit 视图层级中的任何位置,与原生 iOS 内容并存。
除了渲染之外,KanziView 还:
驱动 Kanzi 应用程序的生命周期。将
KanziView附加到窗口会启动 Kanzi 应用程序。将KanziView分离会关闭该应用程序。在 iOS 应用程序退出活动状态时暂停 Kanzi,并在该应用程序再次变为活动状态时恢复 Kanzi。
将触摸事件转发给 Kanzi。
备注
一个进程中同一时间只能存在一个 KanziView。
应用程序工厂¶
KanziView 需要一个 C++ createApplication() 工厂函数,该函数返回要运行的 Application 实例,其签名与所有其他 Kanzi 平台上的相同。例如:
#include <kanzi/core.ui/application/application.hpp>
class MyApplication : public kanzi::Application
{
// Override onProjectLoaded, onConfigure, and so on.
};
kanzi::Application* createApplication()
{
return new MyApplication();
}
将此翻译单元与 KanziAppFwKit 一起链接到您的应用程序目标中。KanziAppFwKit 在每次附加视图时调用一次 createApplication(),并在视图分离时删除返回的实例。
备注
在 iOS 上,Kanzi 不接收命令行参数——KanziAppFwKit 拥有应用程序入口点,并在不传入 argc/argv 的情况下调用 createApplication()。因此,SystemProperties 会以默认值初始化。要配置您的应用程序,请使用 application.cfg 或重写 Application::onConfigure。请参阅 应用程序配置参考。
在 UIKit 中添加 Kanzi 视图¶
要将 Kanzi 视图添加到 UIKit 应用程序,请导入 KanziAppFwKit 并将 KanziView 放入您的视图层级中。您可以通过以下方式实例化 KanziView:
通过代码:
在您的
UIViewController中重写loadView(或viewDidLoad)。分配一个
KanziView实例。
#import <kanzi_view.h> @implementation ViewController - (void)loadView { KanziView* kanziView = [[KanziView alloc] initWithFrame:CGRectZero]; kanziView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.view = kanziView; } @end
import KanziAppFwKit import UIKit class ViewController: UIViewController { override func loadView() { let kanziView = KanziView(frame: .zero) kanziView.autoresizingMask = [.flexibleWidth, .flexibleHeight] view = kanziView } }
通过 storyboard 或 XIB:
在 Interface Builder 中,将一个普通的
UIView拖放到您的场景中。在 Identity Inspector 中,将 Class 设置为
KanziView。将 Module 设置为
KanziAppFwKit。
KanziView通过initWithCoder:进行初始化,因此从 storyboard 加载的视图与通过代码实例化的视图工作方式相同。
在 SwiftUI 中添加 Kanzi 视图¶
要在 SwiftUI 层级中嵌入 Kanzi 内容,请使用 KanziViewRepresentable,它是围绕 KanziView 的 UIViewRepresentable 包装器。您可以像放置任何其他 SwiftUI 视图一样放置它——您可以设置它的尺寸和位置,并将它与原生 SwiftUI 视图组合使用。
import KanziAppFwKit
import SwiftUI
struct ContentView: View {
var body: some View {
KanziViewRepresentable()
.ignoresSafeArea()
}
}