AI砖家头像
关注

iPhone Duo 来了:iOS App 折叠屏适配完全指南(SwiftUI / UIKit / RN / Flutter / 游戏引擎)

iPhone Duo 来了:iOS App 折叠屏适配完全指南(SwiftUI / UIKit / RN / Flutter / 游戏引擎)

2026 年 9 月 9 日,苹果发布了首款折叠屏 iPhone ——

iPhone Duo

。它不是 “多了一块屏” 那么简单,而是第一次让 iOS App 必须面对

两块屏幕、三种姿态(闭合 / 展开 / 半折)、连续可变的窗口尺寸

。
更关键的是:苹果已经给出了

硬性时间表

—— 从 2027 年 4 月起,所有提交到 App Store 的新 App 和版本更新,都必须包含 iPhone Duo 的专属截图,否则无法过审。
这篇文章我们系统讲清楚三件事:
iPhone Duo 到底是什么形态,适配的 “本质” 是什么;
不同开发语言 / 技术栈

(SwiftUI、UIKit/Objective-C、React Native、Flutter、Unity/Unreal)分别怎么适配;
老 App 发新版本

时,如何用最小成本、分阶段完成适配并合规上架。


一、先认识设备:iPhone Duo 的硬件形态

项目参数
产品定位苹果首款横向内折折叠屏 iPhone
内屏(展开后主屏)7.6 英寸 Super Retina XDR OLED,1878 × 2670,430 ppi,120Hz ProMotion,纳米纹理表层,屏下前置摄像头(FaceTime 相机,启用时才遮挡内容)
外屏(闭合后)5.4 英寸 Super Retina XDR OLED,Dynamic Island,120Hz ProMotion,支持始终显示,前置摄像头始终存在并遮挡
铰链可变扭矩铰链,支持任意角度悬停(帐篷模式 / 半折模式)
芯片 / 基带A20 Pro + 自研 C2 基带,仅 eSIM
起售价1999 美元(256GB),另有 512GB / 1TB / 2TB
发售节奏10 月 16 日预售,10 月 23 日正式发售

理解适配,先记住三个 “姿态(Pose)”:

闭合(Closed)          展开(Fully Open)           半折(Partially Open)
┌────────────┐      ┌────────────────────────┐      ┌────────────┐
│            │      │                        │      │  上半区域   │
│  5.4" 外屏  │  →   │      7.6" 内屏          │  →   │───────────│  ← 折痕
│            │      │                        │      │  下半区域   │
└────────────┘      └────────────────────────┘      └────────────┘
  单手 / 便携           大屏 / 多任务 / 沉浸           桌面帐篷 / 双区域
  • 闭合:外屏行为和普通 iPhone 几乎一致;

  • 展开:内屏是一块接近小平板比例的大屏,水平、垂直 Size Class 均为 Regular;

  • 半折:内屏被铰链物理分割成两个可用区域,中间是弯曲、可视性变差的折痕 —— 这是安卓折叠屏上 “内容被折痕吃掉” 问题的同款场景,也是适配的重点和难点。


二、适配的本质:从 “固定一块屏” 到 “连续可变尺寸”

过去十年 iOS 适配的核心矛盾一直在变:屏幕尺寸变长 → 刘海 / Dynamic Island → 多任务分屏 → Mac 上的 iPhone 镜像(iPhone Mirroring)。iPhone Duo 只是这条主线的延续:你的 App 不再拥有一个固定尺寸的窗口,它会在运行过程中被实时拉伸、压缩、重新布局,而且进程不会重启。

苹果在官方 Tech Talk《Prepare your app for iPhone Duo》里反复强调一个原则:

开合手机 ≠ Scene 断开,更 ≠ App 被杀掉重启。它只是一次 Size Class 和 Trait(特征)的变化,你的进程始终存活。

2.1 SDK 分级:你 “重新编译” 到哪一步,决定了用户看到什么

这是整个适配中最重要、也最容易被忽视的一张表。App 在 iPhone Duo 上的表现,严格取决于它是用哪个版本的 SDK 构建的:

构建 SDK闭合(外屏)表现展开(内屏)表现
iOS 26 及更早(旧 Xcode)正常使用状态栏与摄像头左侧的空间App 以 "熟悉的 iPhone 尺寸和比例"居中显示,四周留黑边(Letterbox),无法利用大屏
iOS 27 SDK正常窗口可延伸到状态栏区域左侧(得益于 iOS 27 的 iPhone App 尺寸可调能力),但尚未铺满
iOS 27.1 SDK(Xcode 27.1)正常延伸到屏幕物理边缘,真正全屏;标准导航栏 / 工具栏按钮在状态栏下方垂直排列

结论非常直接:

  • 什么都不改,App 也能装上、能跑(兼容性是自动的),但内屏就是一块 “大黑边 + 居中的 iPhone 画面”,体验优化不是自动的;

  • 只做一件事收益最大:升级到 Xcode 27.1 + iOS 27.1 SDK 重新编译。大量使用系统标准控件的 App,仅仅重新打包就能获得可用的全屏效果;

  • 重新编译后,再针对布局问题做体检和深度优化。

2.2 核心概念地图

iPhone Duo 适配涉及的几个新概念,关系如下:

iPhone Duo 适配

灵活布局 Flexible Layout

标准导航 Standard Container

安全区 Safe Area

保留区域 Reserved Regions · iOS 27.1

铰链 Hinge API · iOS 27.1

多窗口 / 多场景 Scenes

跨屏配件 Scene Accessories

弃用 UIScreen.main.bounds

相对容器布局 Auto Layout / Stack

用 Size Class 而非 idiom / 方向

Division 区域:折痕,半折时激活

Occlusion 区域:摄像头遮挡

SwiftUI: onHingeChange

UIKit: UIHingeInteraction

Split View 并排多任务

App 多实例:仅内屏可新建窗口

CameraCaptureAccessory 内屏取景+外屏提词


三、按开发语言 / 技术栈适配

3.1 SwiftUI(Swift,声明式,适配成本最低)

SwiftUI 是这次适配的 “一等公民”,绝大多数能力通过环境值和修饰器获得。

(1)用 Size Class 做布局决策,不要判断设备型号 / 界面方向

struct ContentView: View {
    @Environment(\.horizontalSizeClass) private var horizontalSizeClass
    @Environment(\.verticalSizeClass) private var verticalSizeClass

    var body: some View {
        // 内屏:horizontalSizeClass == .regular,可展示侧栏 / 双列
        // 外屏竖屏:.compact,展示单栏堆叠
        if horizontalSizeClass == .regular {
            WideLayout()
        } else {
            CompactLayout()
        }
    }
}

注意:

内屏不会遵守你在 Info.plist 中声明的支持方向

。因此永远不要用 “当前是横屏还是竖屏” 来决定布局,只看 Size Class。

(2)用自适应容器,替代自定义导航栏 / 标签栏

// 分栏导航:闭合时自动坍缩为单栈,展开时自动平铺 / 叠加
NavigationSplitView {
    SidebarView()
} content: {
    ListView()
} detail: {
    DetailView()
}

// 标签栏:内屏可选择以"侧边栏"形式呈现更丰富的导航
TabView {
    HomeView().tabItem { Label("首页", systemImage: "house") }
    MineView().tabItem { Label("我的", systemImage: "person") }
}
.defaultTabBarPlacement(.sidebar)   // 内屏进入侧边栏模式

NavigationSplitView、TabView、Sheet、Popover、ContextMenu、Alert 都会自动适配所有姿态,无需手动处理。

(3)安全区:前景收进来,背景铺出去;注意非对称

ScrollView {
    // 前景交互内容:默认就在安全区内
    FeedContent()
}
.background(
    // 背景满版图:延伸到安全区外、铺满整块屏
    Image("bg").resizable().ignoresSafeArea()
)

iPhone Duo 的安全区经常是非对称的(例如横屏 / 分屏时,垂直按钮只出现在一侧)。不要假设左右、上下的 inset 相等。

(4)保留区域 ReservedRegion(iOS 27.1,自定义边缘 UI 必备)

当你要做自定义工具栏、边缘滑动 UI 时,用 ReservedRegion 安全地占据空间而不与系统 UI / 摄像头 / 折痕冲突:

// 通过 GeometryProxy 查询保留区域
GeometryReader { proxy in
    let foldRegions = proxy.reservedRegions(kind: .division)   // 折痕分割区
    let cameraRegions = proxy.reservedRegions(kind: .occlusion) // 摄像头遮挡区
    CustomLayout(fold: foldRegions, camera: cameraRegions)
}
  • Division(分割)区域:对应折痕。设备平铺时它是 inactive、宽度为 0;半折时才激活,把内屏切成两块;

  • Occlusion(遮挡)区域:对应摄像头。内屏屏下相机只在相机激活时出现,外屏相机始终存在;

  • 查询时可带 includeInactive 选项,用未激活的区域做 “高层决策”(例如只要设备存在折痕,网格就偏好偶数列)。

(5)铰链交互 onHingeChange(iOS 27.1)

铰链数据是实时的,适合驱动交互和特效(注意:不要拿它做布局,布局用上面的区域 / 排列 API):

struct InstrumentView: View {
    @State private var pitchBend: Double = 0   // 归一化弯音,0 = 无

    var body: some View {
        GuitarView(pitchBend: pitchBend)
            .onHingeChange { _, context in
                // hinge 为 nil 表示运行在没有铰链的设备上
                if let hinge = context.hinge, hinge.status == .partiallyOpen {
                    pitchBend = calculatePitchBend(angle: hinge.angle)
                } else {
                    pitchBend = 0   // 退出半折时复位
                }
            }
    }

    private func calculatePitchBend(angle: Angle) -> Double { /* ... */ }
}

hinge.status 有三态:.closed / .partiallyOpen / .fullyOpen;hinge.angle 提供连续角度。

(6)排列容器 ArrangementView(iOS 27.1,半折布局利器)

当你有 “主 / 次” 两块内容(如播放器 + 播放列表),用 ArrangementView 替代手写 HStack / ZStack,它会根据折痕自动重排:

ArrangementView(
    primary: { PlayerView() },
    secondary: { UpNextView() }
)
.arrangementViewStyle(.split)   // 默认 split:宽>高 水平分,高>宽 垂直分
// .arrangementViewStyle(.overlay) // overlay:偏好上下叠放,半折时自动改为并排

(7)跨屏配件:内屏取景,外屏提词

CameraView(model: model)
    .sceneAccessory {
        CameraCaptureAccessory(isEnabled: $model.isEnabled) {
            TeleprompterView(model: model)   // 内屏全屏取景时,外屏显示提词器
        }
        .onAvailabilityChange { available in
            model.isAvailable = available    // 设备闭合等不可用时回调
        }
    }

CameraCaptureAccessory 仅在 “App 内屏全屏 + 相机会话活跃” 时可用,适合相机类 App 给被拍摄者展示内容。


3.2 UIKit(Swift / Objective-C)

UIKit 拥有与 SwiftUI 一一对应的能力,通过 TraitCollection 和新交互对象获取。

(1)Size Class 与 Trait

// Objective-C
UIUserInterfaceSizeClass h = self.traitCollection.horizontalSizeClass;
UIUserInterfaceSizeClass v = self.traitCollection.verticalSizeClass;
// Swift
traitCollection.horizontalSizeClass
traitCollection.verticalSizeClass

(2)不要再引用 UIScreen.main

双屏设备上 “主屏” 是有歧义的,且 UIScreen.main 将在未来版本被废弃。改为动态获取:

// ✅ 从 WindowScene 动态拿屏幕
let screen = view.window?.windowScene?.screen

// ✅ 缩放用 traitCollection,而不是 UIScreen.main.scale
let scale = traitCollection.displayScale

(3)标准容器 + 侧边栏

// 分栏控制器,自动适配所有姿态
let splitVC = UISplitViewController(style: .doubleColumn)

// 标签栏控制器在内屏进入侧边栏模式
tabBarController.sidebar.preferredPlacement = .sidebar

如果你手写 UIToolbar / UINavigationBar / UITabBar,在某些姿态下(栏会垂直出现在侧边)很可能布局错乱。应改用:将工具栏项设置到被导航控制器管理的视图控制器上,让系统栏去自适应。

(4)安全区(处理非对称)

// 前景:对齐安全区
foregroundView.frame = view.bounds.inset(by: view.safeAreaInsets)

// 背景:直接铺满
backgroundView.frame = view.bounds

// ❌ 不要假设对侧 inset 相等:
// let width = view.bounds.width - view.safeAreaInsets.left * 2
// ✅ 用 inset(by:) 一次性、每边独立处理:
let width = view.bounds.inset(by: view.safeAreaInsets).width

(5)保留区域 / 铰链(iOS 27.1)

// 保留区域:UIViewReservedRegion,通过 UIView 查询
let divisions = view.reservedRegions(kind: .division, options: [.includeInactive])
let occlusions = view.reservedRegions(kind: .occlusion)

// 铰链:UIHingeInteraction,添加到视图上,回调中读取状态与角度
let hingeInteraction = UIHingeInteraction { [weak self] context in
    guard let hinge = context.hinge else { return }   // 无铰链设备
    switch hinge.status {
    case .partiallyOpen: /* 用 hinge.angle 驱动效果 */ break
    default: break
    }
}
view.addInteraction(hingeInteraction)

(6)排列容器 / 多场景

// 排列控制器:UIArrangementViewController
let arrangementVC = UIArrangementViewController(
    primary: playerVC,
    secondary: upNextVC
)
arrangementVC.updateArrangement(UISplitArrangement(axis: .horizontal))

多窗口注意:外屏不能新建窗口,只有内屏可以。请求新 Scene 时务必处理失败,并使用 UIWindowSceneActivationAction(它在新建窗口不可用时会自动隐藏)。

(7)屏幕圆角:使用 iOS 26 引入的 Concentricity API(UIKit 为 UICornerConfiguration,SwiftUI 为 ConcentricRectangle),让自定义 UI 的圆角与屏幕物理形状精确吻合。


3.3 React Native(JavaScript / TypeScript)

RN 最终打包成原生 App,因此同样受 SDK 分级约束:必须用兼容 Xcode 27.1 的 RN 版本、以 iOS 27.1 SDK 重新打包,才能在内屏全屏,否则展开就是黑边居中。

(1)升级与重新打包

  • 升级 React Native 到支持 Xcode 27.1 /iOS 27.1 SDK 的版本;

  • 用 Xcode 27.1 重新 Archive;优先确认 RN 内置的原生模板已用新 SDK 构建。

(2)消灭硬编码尺寸,改用 Hook + Flexbox

import { useWindowDimensions } from 'react-native';

export const Feed = () => {
  // ✅ 窗口尺寸变化(开合 / 半折 / 分屏)时自动更新
  const { width, height } = useWindowDimensions();
  const isWide = width > height;

  return isWide ? <WideLayout /> : <CompactLayout />;
};
// ❌ 不要用 Dimensions 取一次就写死,它不会随开合自动响应
// const { width } = Dimensions.get('window');

(3)安全区用 react-native-safe-area-context

import { SafeAreaProvider, SafeAreaView } from 'react-native-safe-area-context';

<SafeAreaProvider>
  <SafeAreaView edges={['top', 'left', 'right']} style={{ flex: 1 }}>
    <App />
  </SafeAreaView>
</SafeAreaProvider>

SafeAreaView 会反映圆角、摄像头、系统栏等物理遮挡,并能按边(edges)独立控制,正好对应 iPhone Duo 的非对称安全区。

(4)铰链 / 保留区域:需要 Native Module 桥接

RN 目前没有开箱的铰链 API。UIHingeInteraction、Reserved Region 这类 iOS 27.1 新能力,需要写一层薄薄的原生模块(或通过现有社区库)暴露给 JS:

// ios/HingeBridge.m :订阅 UIHingeInteraction,把 status / angle 通过 RCTEventEmitter 发给 JS
// JS 侧订阅铰链角度,用于驱动半折特效(布局仍建议走 useWindowDimensions + Flexbox)
const emitter = NativeEventEmitter(NativeModules.HingeBridge);
emitter.addListener('hinge', ({ status, angle }) => { /* ... */ });

建议:RN App 优先保证 “重新编译全屏 + Flexbox 自适应 + 安全区” 这三件事,覆盖 90% 的场景;铰链特效作为锦上添花,按业务节奏排期。


3.4 Flutter(Dart)

Flutter 同样通过 Engine 编译为原生 App,先升级 Flutter 版本以支持 Xcode 27.1 /iOS 27.1 构建,再重新打包,否则内屏同样是黑边居中。

(1)安全区用 SafeArea

SafeArea(
  // 可按边控制,适配非对称安全区
  top: true, bottom: true, left: true, right: true,
  child: Scaffold(body: FeedContent()),
)

(2)用 MediaQuery / LayoutBuilder 做响应式,不写死尺寸

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 窗口几何变化(开合 / 半折 / 分屏)时自动重建
    final size = MediaQuery.sizeOf(context);
    final isWide = size.width > size.height;
    return isWide ? const WideLayout() : const CompactLayout();
  }
}

LayoutBuilder 适合在组件局部根据父容器约束决定布局;SafeArea + MediaQuery 的物理遮挡数据(padding /viewPadding)可用来避开摄像头与折痕。

(3)铰链 / 保留区域:MethodChannel 桥接

Flutter 没有现成的 Hinge API,需要通过 MethodChannel / EventChannel 把原生 UIHingeInteraction 的状态和角度传到 Dart 侧:

const hingeChannel = EventChannel('app/hinge');
hingeChannel.receiveBroadcastStream().listen((event) {
  final status = event['status'];   // closed / partiallyOpen / fullyOpen
  final angle = event['angle'];
  // 驱动半折特效
});

Flutter 官方文档本身就推荐用

SafeArea

处理刘海 / 开孔 / 圆角,用

MediaQuery

做适配 —— 这套机制在 iPhone Duo 上依然成立,关键是

用新 SDK 重新打包 + 不写死尺寸

。


3.5 游戏引擎(Unity C# / Unreal C++ / Cocos)

游戏通常是 “自绘全屏画面”,适配重点和普通 UI 不同,主要在引擎版本、安全区、UI 锚点、相机与多任务。

适配项建议
引擎 / SDK升级到官方声明支持 Xcode 27.1 /iOS 27.1 SDK 的引擎版本,再重新出包;否则内屏黑边居中
安全区使用引擎的 Safe Area 插件 / API(Unity 的 Screen.safeArea、Unreal 的安全区 / Notch 支持),把可交互 UI、虚拟按键、HUD 放在安全区内;场景背景、天空盒可以满铺
UI 锚点用 Canvas 锚点 + 相对布局,不要按固定分辨率摆控件;针对非对称安全区分别处理四边
折痕 / 半折半折时避免把关键信息、血条、按钮横跨折痕;可借助铰链角度(需原生插件桥接 UIHingeInteraction)做帐篷模式(上半屏显示、下半屏触控)等玩法
画面比例内屏比例接近小平板,需测试 FOV / 构图 / 黑边策略,避免 UI 被裁切
多任务 / 生命周期开合不重启进程,确认引擎在窗口 resize、暂停 / 恢复时正确处理渲染分辨率与存档
相机权限若调用相机(AR / 拍照分享),注意开合、旋转会在三个摄像头间切换,按摄像头朝向选择

四、老 App 更新版本:分阶段适配路线

存量 App 不必 “一步到位”。建议按下面四个 Level 推进,每一级都可独立交付、独立验证。

Level 0 | 什么都不做(了解现状,不推荐停留)

  • App 能安装、能运行;

  • 外屏基本正常;

  • 展开内屏时,App 以 iPhone 尺寸居中、四周黑边;

  • 风险:2027 年 4 月后无法提交任何版本更新(截图要求不满足,审核直接报错)。

Level 1 | 重新编译(成本最低、收益最高)

  1. 安装 Xcode 27.1;

  2. 将构建 SDK 提升到 iOS 27.1 SDK;

  3. 在 iPhone Duo 模拟器的 Device Hub 中跑起来,用底部控制按钮做开 / 合 / 旋转 / 半折;

  4. 直接重新打包提交。

大量使用系统标准控件的 App,走完这一步内屏就已基本全屏可用。Xcode 27.1 还内置了重命名后的 App Resizability 审核技能(原 App 现代化技能,已支持 SwiftUI 与 iPhone Duo),可自动给出改造建议。

Level 2 | 布局体检(消灭 “定时炸弹”)

对照下面的清单逐项排查代码:

布局体检 Checklist

  • 删除所有 UIScreen.main.bounds / UIScreen.main.scale 等固定屏幕引用,改为相对容器、traitCollection / 环境值、windowScene.screen;

  • 跨平台端:RN 删除写死的 Dimensions.get、Flutter 删除写死的宽高,改用 useWindowDimensions / MediaQuery、Flexbox / 锚点;

  • 布局分支从 " 判断设备型号 / userInterfaceIdiom / 界面方向 " 改为判断 Size Class;

  • 用标准容器替换自定义导航 / 工具 / 标签栏:NavigationSplitView / UISplitViewController、TabView / UITabBarController,并用 toolbar(content:);

  • 交互前景内容收进安全区,背景图 ignoresSafeArea / 用 bounds 满铺;

  • 按非对称原则逐边处理安全区与 layout margin,不假设对侧 inset 相等;

  • 用 Concentricity API(ConcentricRectangle / UICornerConfiguration)匹配屏幕圆角;

  • 半折时,关键内容与可点控件不横跨折痕。

Level 3 | 深度适配(用好新形态,做出差异化)

按需引入 iOS 27.1 新能力:

  • Reserved Region:自定义边缘栏 /edge-to-edge UI 时查询折痕(division)与摄像头(occlusion);

  • ArrangementView / UIArrangementViewController:主 - 次内容在半折时自动重排(split /overlay);

  • Hinge API:用 onHingeChange / UIHingeInteraction 的状态与连续角度做交互特效(如上半屏看视频、下半屏做控制);

  • 多窗口 / 多实例:适配 Split View 并排多任务;请求新 Scene 时处理失败,记住外屏不能新建窗口;

  • Scene Accessories:相机类 App 用 CameraCaptureAccessory 实现内屏取景 + 外屏提词 / 展示;

  • 多摄像头:根据外屏 / 内屏 / 后置摄像头朝向,在开合、旋转时正确切换采集。

Level 4 | 素材与合规(确保能上架)

  • 在 App Store Connect 上传 iPhone Duo 内屏、外屏的专属截图(以及按要求的 App 预览);

  • 使用苹果提供的 Figma / Sketch 设计资源与截图模板;

  • 关注审核要求:2027 年 4 月起,缺 iPhone Duo 截图的新 App 无法上架、存量 App 无法提交更新。

适配测试矩阵

每改一级,至少覆盖下面的组合(模拟器 Device Hub + 真机):

姿态 \ 方向竖屏横屏Split View 分屏
闭合(外屏)☐☐—(外屏不支持新建窗口)
展开(内屏)☐☐☐(垂直栏可能出现在任一侧)
半折(内屏)☐☐ / 帐篷模式☐

重点回归:开合过程中导航栈 / 滚动位置 / 输入中的内容是否保持(系统通常会自动保留文本输入与滚动位置)、视频与相机是否正确切换、后台 / 前台与 resize 后渲染是否正常。


五、时间线与合规要点

2026-09-09苹果发布 iPhone Duo2026-09-18Xcode 27.1 beta 与Figma/Sketch设计资源上线2026-10-05App Store Connect开始接受 iPhone Duo适配 App2026-10-16开启预售2026-10-23正式发售2027-04强制要求 iPhone Duo专属截图,否则无法上架/ 更新iPhone Duo 适配关键时间线

几个容易被误读的点,澄清一下:

  1. “强制适配” 的真正含义:现阶段苹果强制的是提交素材(截图 / App 预览),不是强制你用某套 API。但只要你还想发版,就绕不开 “在 iPhone Duo 上跑得像样”,否则截图这一关就过不了。

  2. 兼容是自动的,优化不是:存量 App 不更新也能装、能跑,但内屏黑边居中。

  3. 没有官方加急通道:苹果没有承诺发售前提交一定能在 10 月 23 日前过审,适配要趁早,别卡 deadline。


六、常见的坑

  1. 只升级 Mac 上的 Xcode,却没改 CI:打包机仍用旧 SDK,本地全屏、线上黑边。确保 CI 镜像也升级到 Xcode 27.1。

  2. 用 “判断是不是 iPhone Duo” 来开特例:这是最脆弱的写法。应判断 Size Class / 保留区域,让布局在 “连续尺寸” 上自适应,否则下一代设备又要返工。

  3. 拿铰链角度做布局:Hinge 数据用于实时特效;布局必须走 Arrangement / Reserved Region / Auto Layout,否则抖动、性能和正确性都会出问题。

  4. 假设安全区对称:横屏和分屏时垂直栏只在一侧,写死 inset * 2 必然错位。

  5. 自定义栏不跟随姿态:手写 UITabBar / 自定义工具条在垂直布局时错乱,优先用系统标准栏。

  6. 跨平台框架 “以为升级 JS 包就行”:真正决定全屏能力的是原生构建 SDK,必须升级框架 / 引擎并用 Xcode 27.1 重新原生打包;铰链等新 API 还要额外桥接。

  7. 半折时把按钮放在折痕上:折痕处曲面可视性差、触控不稳,交互元素应避让(系统组件默认就有 “折痕避让” 行为)。

  8. 开合时丢失状态:不要把开合当成 App 重启;对必须跨 Scene 存活的状态,实现状态恢复(NSUserActivity / stateRestorationActivity)。


结语

iPhone Duo 对开发者的真正要求,其实是一句 “老话重提”:写能在任意尺寸下自适应的界面,而不是为某一块固定屏幕写界面。

  • UIScreen.main.bounds 这类硬编码,本来就是 “只等某款新设备出现就会暴露的 Bug”,现在这款设备来了;

  • 对绝大多数团队,升级 Xcode 27.1 + iOS 27.1 SDK 重新编译,就能拿到六七十分;再按 Size Class、安全区、保留区域、排列容器、铰链这条主线补齐,就能做到九十分;

  • 最后别忘合规:2027 年 4 月前把 iPhone Duo 截图和体验准备好。

折叠屏不是洪水猛兽,它只是苹果又一次把 “作业” 发到了我们手里。越早把布局做成 “连续自适应”,未来每一代新形态到来时,你都会越轻松。


转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/m0_37988015/article/details/167274785

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--