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

iOS 13中如何自定义模态视图控制器高度并实现上滑放大?

实现iOS 13+自定义尺寸模态视图(支持上滑切换全屏)

嘿,这个需求我刚好在项目里落地过!iOS 13之后UIKit对模态视图的展示逻辑做了不少优化,系统相册那种「初始小尺寸+上滑切换至全屏」的效果,其实用UIModalPresentationStyle.pageSheet配合UISheetPresentationController就能轻松实现,下面给你分步骤拆解:

一、基础:创建固定初始尺寸的模态视图

首先,你需要给要展示的模态视图控制器设置pageSheet的展示样式,然后通过preferredContentSize指定初始的小尺寸:

// 实例化你的自定义模态控制器
let customModalVC = YourCustomModalViewController()
// 设置模态展示样式为pageSheet(iOS13+支持)
customModalVC.modalPresentationStyle = .pageSheet
// 指定初始尺寸(这里以高度400为例)
customModalVC.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 400)
// 展示模态视图
present(customModalVC, animated: true)

不过这只是固定初始高度,要实现上滑切换高度的交互,还需要用到UISheetPresentationController的进阶配置。

二、配置多档位高度(支持上滑切换)

从iOS 15开始,UISheetPresentationController新增了detents属性,可以直接定义多个高度档位,完美实现系统相册的效果:

let customModalVC = YourCustomModalViewController()
customModalVC.modalPresentationStyle = .pageSheet

// 获取对应的Sheet控制器进行配置
if let sheet = customModalVC.sheetPresentationController {
    // 设置支持的高度档位:中等高度(默认是屏幕高度的0.5)+ 全屏
    sheet.detents = [.medium(), .large()]
    
    // 显示顶部的拖拽指示器(和系统相册一致,提升交互感知)
    sheet.prefersGrabberVisible = true
    
    // 可选:设置中等高度时背景不完全灰化(系统相册的初始状态就是这样)
    sheet.largestUndimmedDetentIdentifier = .medium
    
    // 可选:如果模态里有滚动视图,开启滚动到顶部时自动扩展为全屏
    sheet.prefersScrollingExpandsWhenScrolledToEdge = true
}

present(customModalVC, animated: true)

三、自定义高度档位(如果不想用默认的medium/large)

如果需要更灵活的高度控制,比如初始高度300、中间档600、最后全屏,可以用custom类型的detent:

sheet.detents = [
    // 自定义第一档高度:固定300pt
    .custom(resolver: { context in
        return 300
    }),
    // 自定义第二档高度:屏幕高度的0.7
    .custom(resolver: { context in
        return context.maximumDetentValue * 0.7
    }),
    // 全屏档
    .large()
]

这里的context.maximumDetentValue就是当前屏幕的可用高度(已经扣除安全区域),用相对比例计算的话,适配不同尺寸的设备会更友好。

四、iOS 13-14兼容方案(可选)

如果你的项目还需要兼容iOS 13-14,那就要通过监听拖动手势,手动修改preferredContentSize来实现高度切换:

  1. 给模态视图添加拖动手势
  2. 在手势回调里根据拖动距离动态调整preferredContentSize
  3. 松手时判断最终高度,切换到预设的档位

不过现在大部分项目已经适配iOS15+了,这个方案就不展开细讲了,核心思路就是通过手势交互来控制高度变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:44:34