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 适配涉及的几个新概念,关系如下:
三、按开发语言 / 技术栈适配
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 | 重新编译(成本最低、收益最高)
-
安装 Xcode 27.1;
-
将构建 SDK 提升到 iOS 27.1 SDK;
-
在 iPhone Duo 模拟器的 Device Hub 中跑起来,用底部控制按钮做开 / 合 / 旋转 / 半折;
-
直接重新打包提交。
大量使用系统标准控件的 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 后渲染是否正常。
五、时间线与合规要点
几个容易被误读的点,澄清一下:
-
“强制适配” 的真正含义:现阶段苹果强制的是提交素材(截图 / App 预览),不是强制你用某套 API。但只要你还想发版,就绕不开 “在 iPhone Duo 上跑得像样”,否则截图这一关就过不了。
-
兼容是自动的,优化不是:存量 App 不更新也能装、能跑,但内屏黑边居中。
-
没有官方加急通道:苹果没有承诺发售前提交一定能在 10 月 23 日前过审,适配要趁早,别卡 deadline。
六、常见的坑
-
只升级 Mac 上的 Xcode,却没改 CI:打包机仍用旧 SDK,本地全屏、线上黑边。确保 CI 镜像也升级到 Xcode 27.1。
-
用 “判断是不是 iPhone Duo” 来开特例:这是最脆弱的写法。应判断 Size Class / 保留区域,让布局在 “连续尺寸” 上自适应,否则下一代设备又要返工。
-
拿铰链角度做布局:Hinge 数据用于实时特效;布局必须走 Arrangement / Reserved Region / Auto Layout,否则抖动、性能和正确性都会出问题。
-
假设安全区对称:横屏和分屏时垂直栏只在一侧,写死
inset * 2必然错位。 -
自定义栏不跟随姿态:手写
UITabBar/ 自定义工具条在垂直布局时错乱,优先用系统标准栏。 -
跨平台框架 “以为升级 JS 包就行”:真正决定全屏能力的是原生构建 SDK,必须升级框架 / 引擎并用 Xcode 27.1 重新原生打包;铰链等新 API 还要额外桥接。
-
半折时把按钮放在折痕上:折痕处曲面可视性差、触控不稳,交互元素应避让(系统组件默认就有 “折痕避让” 行为)。
-
开合时丢失状态:不要把开合当成 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



