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

iOS 17.1中SwiftUI DatePicker点击无响应,仅长按可打开的问题求助

解决iOS 17.1中DatePicker点击无响应、需长按才能打开的问题

你的问题核心在于父视图的allowsHitTesting设置与iOS 17.1的事件传递机制变化冲突,导致DatePicker的点击事件被拦截。以下是具体解决思路和修改方案:

方案1:缩小allowsHitTesting的作用范围

当前你将allowsHitTesting加在了整个外层VStack上,这会影响内部所有子视图的交互响应。建议只给需要禁用交互的组件(比如标题文本)添加该设置,让DatePicker所在区域不受限制:

VStack(alignment: .leading){
    Text("Date".localized())
        .applyFont(style: .Medium, size: 18)
        .foregroundColor(Colors.grayLight)
        .allowsHitTesting(!(eventTransaction != nil && eventTransaction?.by != UserDefaults.userID)) // 仅给Text添加该限制
    HStack{
        let lastYear = Calendar.current.date(byAdding: .year, value: -1, to: Date()) ?? Date()
        if let date = checkLowerBound(){
            DatePicker("",selection:$selectedDate, in: date...Date(), displayedComponents: [.date])
                .frame(width: 100)
        }else{
            DatePicker("",selection:$selectedDate, in: lowestDate...Date(), displayedComponents: [.date])
                .frame(width: 100)
        }
        Spacer()
    }
    .padding(.horizontal, 10)
}
.cardProperty()
// 移除VStack上的allowsHitTesting设置

方案2:强制DatePicker的交互响应

如果必须保留父视图的allowsHitTesting设置,可以给DatePicker单独设置allowsHitTesting(true),强制它响应用户点击:

// 两个DatePicker都需要添加该设置
DatePicker("",selection:$selectedDate, in: date...Date(), displayedComponents: [.date])
    .frame(width: 100)
    .allowsHitTesting(true) // 强制开启交互

方案3:确保DatePicker的点击区域足够

iOS 17.1可能对视图点击区域的检测更严格,你可以给DatePicker添加contentShape来明确点击范围,避免因frame设置导致的点击失效:

DatePicker("",selection:$selectedDate, in: date...Date(), displayedComponents: [.date])
    .frame(width: 100)
    .contentShape(Rectangle()) // 将点击区域扩大为整个frame范围

优先尝试方案1,它从根源上避免了父视图对DatePicker交互的干扰,是最合理的解决方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:22:44