您可以通过使用标准 iOS API 调整Frame 来启用 iOS 导航上的大标题。
您可以使用其原生 API 直接与目标平台交互。定义此行为的属性在 Apple 文档此处有说明。
从文档中可以看到,这是UINavigationBar的一个属性,可以通过其最常用的所有者UINavigationController访问,而@nativescript/core Frame在 iOS 上就是 UINavigationController。
Frame 始终可以通过Page访问。
在 iOS 上,每个 Page 都是一个UIViewController实例,并通过其frame
属性引用其父UINavigationController。
根据版本的不同,这可能是隐式或显式定义的。让我们看几个例子。
在 Angular 中,Page 是隐式的,因为每个路由到的页面都会将 Page 注入到其中。每个 Page 都有一个frame
属性,它是其Frame实例的引用。由于在组件构造时不会加载 Page,因此我们可以设置一个loaded
监听器,以便在 Page 可用时访问 frame。
@Component({
selector: 'ns-items',
templateUrl: './items.component.html',
})
export class ItemsComponent {
page = inject(Page);
constructor() {
// Setup large titles on iOS
this.page.on('loaded', (args) => {
if (__IOS__) {
const navigationController: UINavigationController =
this.page.frame.ios.controller;
navigationController.navigationBar.prefersLargeTitles = true;
}
});
}
}
在 Vue 中,Page 是显式的,因为您使用 Page 定义每个模板,其中导航堆栈中的第一个组件将显式定义 Frame。
<script lang="ts" setup>
function loadedFrame(args) {
if (__IOS__) {
const frame = args.object as Frame;
const navigationController: UINavigationController = frame.ios.controller;
navigationController.navigationBar.prefersLargeTitles = true;
}
}
</script>
<template>
<Frame @loaded="loadedFrame">
<Page>
<ActionBar title="Home"> </ActionBar>
<GridLayout></GridLayout
</Page>
</Frame>
</template>
每个版本都构建在完全相同的结构之上,因此在您可以访问Page
的地方,您可以获取frame
;或者在您拥有显式Frame
的地方,您可以像完全相同的方式与其UINavigationController
交互。