.NET MAUI 不支持用 Storyboard 替代主界面,但允许在启动页、运行时模态展示或混合嵌入场景中集成 Storyboard;需通过原生 iOS API 实现,代码限于 Platforms/iOS 目录并用 #if IOS 包裹。

.NET MAUI 本身不直接支持加载或替换为完整的 iOS Storyboard 作为主界面(比如用 Storyboard 替代 `App.xaml` 或 `MainPage`),但它允许你**在必要时介入原生 iOS 启动流程,访问并呈现自定义 Storyboard 控制器**——尤其适用于启动页定制、模态弹窗、原生导航过渡或深度集成第三方 iOS UI 组件等场景。
iOS Storyboard 启动页(Launch Screen)适配
这是最常见且官方支持的 Storyboard 集成方式。MAUI 应用默认使用 LaunchScreen.storyboard(由模板生成),你只需按标准 iOS 方式修改即可:
- 在 `Platforms/iOS/` 目录下打开 Xcode 工程(双击 `YourApp.iOS.csproj` 对应的 `.sln` 或直接打开 `Platforms/iOS/YourApp.iOS.xcodeproj`)
- 编辑 `LaunchScreen.storyboard`:拖入图片、标签、约束,确保适配不同屏幕尺寸
- 确认 `Info.plist` 中已设置:
UILaunchStoryboardName LaunchScreen - 构建时 MAUI 会自动打包该 Storyboard,系统在冷启动时原生渲染,与 C# 代码无关
在 MAUI 中主动加载自定义 Storyboard 控制器
若需在运行时(如点击按钮后)展示一个用 Storyboard 设计的 UIViewController(例如设置页、登录页、AR 界面),可借助 `UIViewController` 原生 API 实现:
- 在 Xcode 中创建新 Storyboard(如 `Settings.storyboard`),添加 ViewController,并设置 Storyboard ID(如 `"SettingsViewController"`)
- 在 `Platforms/iOS/` 下新建 `.cs` 文件(如 `StoryboardHelper.cs`),添加如下逻辑:
var storyboard = UIStoryboard.FromName("Settings", null);
var viewController = storyboard.InstantiateViewController("SettingsViewController");
// 获取当前 MAUI 窗口的 RootViewController
var window = UIApplication.SharedApplication.KeyWindow;
window.RootViewController.PresentViewController(viewController, true, null);
- 从 MAUI 页面调用该逻辑(例如通过 DependencyService 或 .NET MAUI 的 `MainThread.InvokeOnMainThreadAsync` 包裹)
- 注意:此方式绕过 MAUI 的页面导航栈,返回需由原生控制器手动处理(如调用 `DismissViewController(true, null)`)
与 MAUI 页面共存的混合方案
StoryBoard 控制器并非必须全屏独占。你可以将其作为子视图嵌入 MAUI 页面容器中(需桥接):
- 创建一个 `UIViewController` 子类,在 Storyboard 中设计 UI,再导出为 `UIView`(重写 `View` 属性或使用 `ContainerView`)
- 在 MAUI 中通过 `Handler` 自定义 `ContentView`,在 `CreatePlatformView()` 中返回该原生 `UIView`
- 适合嵌入地图、视频播放器、图表等强原生依赖组件,保持 MAUI 页面结构完整
关键限制与注意事项
- MAUI 的 `AppShell` / `NavigationPage` 不识别 Storyboard 控制器,无法用 `Shell.Current.GoToAsync()` 导航到它
- Storyboard 中的 IBOutlet / IBAction 仍需在原生 `UIViewController` 类中实现,不能直接绑定到 C# ViewModel
- 所有 Storyboard 相关代码必须放在 `Platforms/iOS/` 目录下,用 `#if IOS` 包裹,避免编译错误
- 调试时建议启用 Xcode 的 View Hierarchy Debugger,确认控制器层级是否符合预期
基本上就这些。不需要重写整个 App 生命周期,也不必放弃 MAUI 主体结构——精准插入 Storyboard 只是补足特定原生体验的一小步。









