You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决NativeScript Angular根层级ActivityIndicator与iOS RadSideDrawer兼容问题

解决NativeScript Angular中iOS端RadSideDrawer与ActivityIndicator冲突的问题

嘿,这问题我之前也碰到过!核心原因是你当前的布局结构存在冲突——你同时放置了两个顶级容器(AbsoluteLayout和RadSideDrawer),还重复使用了page-router-outlet,这在iOS的视图渲染机制下会导致ActivityIndicator被RadSideDrawer遮挡,或者根本没被正确挂载到视图树里,所以移除RadSideDrawer它就正常工作了。

给你调整后的布局代码,应该能解决问题:

<AbsoluteLayout width="100%" height="100%">
  <!-- 把RadSideDrawer作为根容器的子元素 -->
  <RadSideDrawer *ngIf="radScreen" [drawerTransition]="sideDrawerTransition">
    <GridLayout tkDrawerContent rows="auto, *" class="sidedrawer sidedrawer-left">
      <StackLayout row="0" class="sidedrawer-header">
        <Image [src]="imageUrl" class="avatar"></Image>
        <Label class="studentInfo rr-18" [text]="student?.name"></Label>
        <Label class="studentInfoSec rr-18" [text]="student?.studentId"></Label>
      </StackLayout>
      <ScrollView row="1">
        <StackLayout class="sidedrawer-content">
          <GridLayout columns="auto, *" class="sidedrawer-list-item" (tap)="onTranscriptTap()">
            <Image col="0" class="drawerImg" src="res://transcript"></Image>
            <Label col="1" text="Transcript" class="rr-18"></Label>
          </GridLayout>
          <GridLayout columns="auto, *" class="sidedrawer-list-item" (tap)="onSettingsTap()">
            <Image col="0" class="drawerImg" src="res://settings"></Image>
            <Label col="1" text="Settings" class="rr-18"></Label>
          </GridLayout>
          <GridLayout columns="auto, *" class="sidedrawer-list-item">
            <Image col="0" class="drawerImg" src="res://logout"></Image>
            <Label col="1" (tap)="onLogoutTap()" text="Logout" class="rr-18"></Label>
          </GridLayout>
        </StackLayout>
      </ScrollView>
    </GridLayout>
    <!-- 只保留这一个page-router-outlet,避免路由冲突 -->
    <page-router-outlet tkMainContent class="page page-content" actionBarVisibility="never"></page-router-outlet>
  </RadSideDrawer>

  <!-- ActivityIndicator放在根AbsoluteLayout中,确保它在RadSideDrawer的上层 -->
  <ActivityIndicator 
    androidElevation="12" 
    [busy]="busy" 
    <!-- 调整位置让加载指示器居中显示 -->
    [top]="(screenHeight - 50)/2" 
    [left]="(screenWidth - 50)/2" 
    class="primary-color" 
    width="50" 
    height="50">
  </ActivityIndicator>
</AbsoluteLayout>

关键修改点说明:

  • 把RadSideDrawer嵌套进根AbsoluteLayout里,让ActivityIndicator作为同级元素,确保它的层级在RadSideDrawer之上
  • 移除了原来外部的page-router-outlet,只保留RadSideDrawer的tkMainContent中的路由出口,避免重复路由实例导致的渲染问题
  • 修正了ActivityIndicator的位置计算,原来的[top]="screenHeight"会让它跑到屏幕外,现在调整后可以居中显示

额外排查建议:

如果还是不工作,可以检查:

  • 确认busy变量的变化是否触发了Angular的变化检测,必要时可以注入ChangeDetectorRef,在设置busy = true后调用cdr.detectChanges()手动触发更新
  • 验证screenHeight和screenWidth的取值是否正确,确保ActivityIndicator在可视区域内

内容的提问来源于stack exchange,提问作者Abdullah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:33:30