移动端导航¶
首页和话题路由共享根原生堆栈,以便 UIKit 能在同一个导航控制器内为头部做动画。iPad 侧边栏有自己的堆栈。将首页和话题拆分到不同的控制器会失去这种连续过渡。堆栈如何变成列、表单和窗格,详见移动端布局。
选择与深入打开¶
打开页面有两种意图,每种意图都有一个操作:
- 选择:将话题或拉取请求显示为工作区的唯一页面,就像列表行那样。所有执行选择的操作(行、命令面板、撰写、通知、深层链接)都使用
selectWorkspaceDetail,由根堆栈的路由器处理。在手机、折叠分屏和展开分屏上,生成的堆栈都相同。只有路由键不同:已经在显示的页面保留其键,因此详细列会就地更新,而不是压栈。 - 深入打开:在当前页面之上打开一个页面,以便“返回”可以回到上一页,使用
StackActions.push。
对 Thread 或 PullRequest 的 navigate 会被 lint 拒绝,因为它会根据当前顶部是什么来决定是压栈还是就地更新。绝不要从过渡事件中推断这个选择:UIKit 也会报告侧边栏列在分屏视图中出现。路由器使用的唯一原生信号是卡片原生的“返回”正在弹出。工作区导航器会报告这一点,而选择操作绝不会复用那张卡片。
除了列表之外,设置页面共享一个原生屏幕,其内容会切换,就像系统设置应用一样。如果每个页面一个路由,就会将该列弹出再压入,并卸载其头部配置,从而隐藏导航栏。
UIKit 约束¶
react-native-screens 分支保留了一些更改原生头部时容易被破坏的行为:
- 品牌标识属于
headerTitle。在 iOS 26.5 上,UIKit 会将无背景的前导工具栏项的矩形变形为下一个屏幕的玻璃返回按钮,即使这些项的标识符不同。 - UIKit 的滚动边缘淡入淡出不识别 Fabric 文本视图。一个空的原生标签为自定义标题提供几何信息。移除这个看似无用的视图会改变淡入淡出效果。
- 前导、尾随和居中项目组需要独立的缓存。一个按钮只能属于一个组;重建一个未变化的组可能会把按钮从 UIKit 仍在动画的组中拉出来。缓存所有权还包括头部配置,其事件发射器会在重新挂载时改变。
- 位于前导边缘的水平 ScrollView 必须让位于全屏返回手势。上游给每个水平 ScrollView 优先级,因此在代码块或表格上向后滑动只会弹回其内容。
- UIKit 在滚动视图内部绘制头部的滚动边缘模糊效果,而工作区列会将内容填充到远离 iPhone Duo 的垂直条的位置。只能通过
NativeScrollViewMarker或NativeScrollView注册头部滚动视图:它们的原生包装器会加宽该条下方的滚动视图,使模糊效果能延伸到那里,同时内容仍保持在安全区域内。在左侧,它通过边界原点将 React Native 的内容视图移回,绝不使用内容偏移量:React Native 会在自己的布局过程中重写偏移量,这会让话题在该条下方发生偏移。lint 会拒绝从任何其他地方导入ScrollViewMarker。
该分支添加了需要代码生成和新二进制文件的原生头部属性。参见分支构建说明。
原生媒体呈现¶
iOS 将全屏视频委托给 AVKit,将图像和文档委托给 Quick Look。每个框架拥有自己的控件和过渡。一个独立的 UIKit 缩放过渡可以防止 AVKit 的原生“关闭”操作退出全屏,并会干扰 Quick Look 的交互式返回缩略图。AVKit 的入口选择器受到保护,以标准模态呈现作为回退。
缩略图注册持有用于过渡和共享表单锚点的弱视图引用。它不拥有预览;原生呈现打开时,源行可能会消失。标识符必须区分同时可见的附件。原生 promise 在关闭完成后才完成,因此调用方会一直持有本地文件租约,直到预览或共享流程结束。
在 UIKit 完成当前过渡之前,应将关闭请求视为待处理状态。在呈现或交互式关闭尚未稳定时启动另一个关闭,可能会让控制器陷入困境。视频清理只会在之前的音频配置仍与预览配置匹配时恢复该配置。它绝不能停用共享音频会话,该会话可能属于另一个播放器或录音器。
视频播放会在预览的整个生命周期内持有第一个已签名的资产 URL。响应式地跟随凭据刷新会重新启动播放。Quick Look 会将原始字节复制到自己的临时目录中,因此预览和共享不会修改草稿或工作区文件。
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 t3/t3code