返回博客首页
← 所有文章

iOS 导航启用大标题显示

2024年5月27日 — 作者:技术指导委员会 (TSC)

您可以通过使用标准 iOS API 调整Frame 来启用 iOS 导航上的大标题。

iOS prefersLargeTitles

您可以使用其原生 API 直接与目标平台交互。定义此行为的属性在 Apple 文档此处有说明。

从文档中可以看到,这是UINavigationBar的一个属性,可以通过其最常用的所有者UINavigationController访问,而@nativescript/core Frame在 iOS 上就是 UINavigationController

访问 Frame

Frame 始终可以通过Page访问。

在 iOS 上,每个 Page 都是一个UIViewController实例,并通过其frame属性引用其父UINavigationController

根据版本的不同,这可能是隐式或显式定义的。让我们看几个例子。

使用 Angular

在 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

在 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交互。

您可以立即运行的 StackBlitz 示例