96SEO 2026-06-17 03:35 4
小叨叨:到底啥是系统级 Bottom Sheet?
说实话,咱们在 iOS 开发里经常会kan到那种从底部弹出来的卡片。
你点一下卡片慢慢滑起,甚至还Neng拖拽到全屏。

这玩意儿叫 Bottom Sheet。
以前要想搞这种效果,大多要掺点 UIKit,写一堆代理。
现在 SwiftUI 把它们dou搬上来了简直是福音。
哈哈,我跟你讲,这事儿一点点来别急。
第一步:Zui基础的 .sheet 用法.sheet 是 SwiftUI Zui原始的弹窗 API。
先来个Zui简洁的例子:
@State private var show = false
var body: some View {
Button { show.toggle }
.sheet {
Text
.font
.padding
}
}
点按钮,弹窗出现——但它默认是模态全屏的。
Ru果你想让它像系统的 Bottom Sheet 那样只占半屏,那就得往后走。
.presentationDetents:iOS 16+ 的神器从 iOS 16 开始,Apple 放出了 presentationDetents 系列修饰符。
.medium、.large、甚至自定义高度,douNeng轻松搞定。
下面这段代码演示了两档高度:
@State private var show = false
var body: some View {
Button { show = true }
.sheet {
VStack {
Text
.font
Spacer
}
.padding
.presentationDetents
}
}
点一下就Neng在中等和全屏之间滑动切换——真的hen像系统自带的地图页面。
自定义高度 Detent有时候我们想要固定在 300pt 高度,那怎么写?
.presentationDetents])
或者用 fraction 按比例:
.presentationDetents]) // 占屏幕一半
第二步:让 Sheet Neng拖拽并随手势变化大小
官方提供了基本拖拽,但Ru果你想geng细腻,比如根据 ScrollView 的滚动动态调节高度,就需要自己动手弄个 GeometryReader。
@State private var currentHeight: CGFloat = 200
var body: some View {
VStack {
Spacer
VStack {
Text
.font
.padding
}
.frame
.background
.cornerRadius
.gesture(
DragGesture
.onChanged { value in
let newHeight = currentHeight - value.translation.height
if newHeight> 100 && newHeight
注意,这里用了 ignoresSafeArea,让 Sheet Neng贴到屏幕Zui底部。
配合 ScrollView 的技巧Ru果你的 Sheet 裏面放的是列表,滚动时要让列表自行滚动而不是把整个 Sheet 拖走,这时就得判断手势起始位置:
DragGesture
.onChanged { value in
if value.startLocation.y> currentHeight - 40 {
// 手指在底部把手附近,才触发高度变化
// 否则交给内部 ScrollView 滚动
}
}
第三步:美化你的 Bottom Sheet —— 背景、毛玻璃、圆角
.presentationBackground Ke以直接改背景颜色或材质。
.presentationBackground // 毛玻璃效果
.presentationCornerRadius Ke以调圆角大小:
.presentationCornerRadius
防止误关——interactiveDismissDisabled
有时候业务上不想让用户随便下滑关闭,就加上这句:
.interactiveDismissDisabled
第四步:键盘弹出时不被遮挡?来点技巧!
键盘弹起会把底部视图往上推,你Ke以监听键盘通知来动态调整 Sheet 高度。
@State private var keyboardHeight: CGFloat = 0
var body: some View {
VStack {
// 内容...
}
.padding
.onReceive { height in
keyboardHeight = height
}
}
插播一段:为什么百度不收录我的技术博客?🤔
说实话,这事儿常见啊。大多数时候是因为站点没有提交 sitemap,或者 robots.txt 把爬虫给挡住了。
还有一个细节,就是内容重复率太高,被判为低质量。
所以咱们写文章一定要原创、加入独特案例,还得在后台开启“抓取”权限。
第五步:完整示例——把所有玩意儿集合起来import SwiftUI
struct ContentView: View {
@State private var showSheet = false
@State private var sheetHeight: CGFloat = 250
var body: some View {
NavigationView {
List { i in
Text")
}
.navigationTitle
.toolbar {
Button { showSheet.toggle }
}
.sheet {
ZStack {
Color.clear
VStack {
Capsule
.fill)
.frame
.padding
Text
.font
Divider
ScrollView {
ForEach { j in
Text")
.padding
.frame
.background)
.cornerRadius
}
}
}
.padding
.frame
.background
.cornerRadius
// 拖拽调节高度
.gesture(
DragGesture
.onChanged { val in
let newH = sheetHeight - val.translation.height
if newH>= 150 && newH <= UIScreen.main.bounds.height * 0.85 {
sheetHeight = newH
}
}
)
}
// 系统层面的配置
//.presentationDetents
//.interactiveDismissDisabled
//.presentationBackground
}
}
}
}
* 小提示 *
✅ 用 `.presentationDetents` Neng省掉大部分手势代码;
✅ 想要geng细腻的交互,用 GeometryReader + DragGesture;
✅ 别忘了加毛玻璃和圆角,让 UI geng舒服;
✅ 键盘遮挡记得监听 Keyboard Height 哦。
end of story:再聊几句感受吧 🎉咱们这玩意儿其实并不难,只是需要把系统提供的 API 拼起来用点自己的小技巧就Neng搞定。
Ru果你刚入门,kan完这篇还Neng自己敲出一个「系统级」Bottom Sheet,那真的算是突破啦!哈哈哈~
以后遇到类似需求,就直接搬这个模板改改颜色、改改高度,省时省力,又不会被审稿人挑刺儿。
* 本文使用 HTML 包装,仅供学习参考,请勿直接抄袭到商业项目中,否则后果自负哦~*
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback