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

iOS15下SwiftUI自定义时间Picker重叠导致部分无法滚动问题

问题根因

iOS 15 对 SwiftUI 中 WheelPickerStyle 类型的 Picker 布局和手势响应逻辑做了底层调整:即使你给 Picker 设置了固定宽高的 frame 并调用了 clipped() 做视觉裁剪,Picker 内部的手势响应区域仍然会保留系统默认滚轮选择器的原生尺寸,导致多个并排摆放的 Picker 响应区域互相重叠,最终仅有最上层的 Picker 可以响应滑动操作。

修复方案

在每个 Picker 的修饰符链中,frame 设置之后增加两个修饰符即可解决:

  • .compositingGroup():让视图的裁剪效果作用于整个视图层级,包括手势响应区域
  • .contentShape(Rectangle()):明确指定视图的响应区域为当前 frame 对应的矩形范围

你需要给时、分、秒、毫秒四个 Picker 都添加这两个修饰符,修改后的单个 Picker 示例如下:

Picker("", selection: $viewModel.hoursTime) {
    ForEach(0..<24){ hours in
        if(hours < 10){
            Text("  \(hours)").foregroundColor(textColor)
        }
        else{
            Text("\(hours)").foregroundColor(textColor)
        }
    }
}
.pickerStyle(WheelPickerStyle())
.frame(width: width, height: 40)
.clipped()
.labelsHidden()
.clipShape(Rectangle())
// 新增以下两行
.compositingGroup()
.contentShape(Rectangle())

可选优化

你当前设置的 Picker 宽度为30,实际显示数字+手势操作空间偏小,可以适当调整到45-60区间,操作手感会更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:39:03