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

iOS17.2 iPhoneSE横屏TipKit弹窗致Sheet按钮失效问题求助

iOS 17.2 iPhone SE横屏TipKit导致Sheet按钮失效的绕过方案

在iPhone SE(右横屏模式)或其模拟器运行iOS 17.2系统时,当TipKit的popoverTip通知显示在屏幕上后,触发Sheet的“Hit Me!”按钮会出现点击失效的问题。以下是可重现该Bug的完整代码:

import SwiftUI
import TipKit

@main
struct TipKit_WithPresentPageApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
                .task {
                    try? Tips.resetDatastore()
                    try? Tips.configure([
                        .datastoreLocation(.applicationDefault)
                    ])
                }
        }
    }
}

struct ContentView: View {
    @State private var isPresented: Bool = false
    var body: some View {
        NavigationStack {
            VStack {
                Image(systemName: "globe")
                    .imageScale(.large)
                    .foregroundStyle(.tint)
                    .popoverTip(MyTip())
                    .padding(100)
                Button("Hit Me!") {
                    isPresented.toggle()
                    // TipKit通知显示时,该按钮在iPhone SE及模拟器上失效
                }
                .padding()
                .sheet(isPresented: $isPresented) {
                    PresentPage()
                }
            }
        }
    }
}

struct PresentPage: View {
    var body: some View {
        Text("Hello, world again!")
            .font(.title)
    }
}

struct MyTip: Tip {
    var title: Text {
        Text("Test")
    }
    var message: Text? {
        Text("Hi")
    }
}

绕过方案

方案1:延迟Sheet触发时机

通过给Sheet的显示添加短暂延迟,等待TipKit的popover完成消失或交互区域释放后再触发Sheet:

Button("Hit Me!") {
    // 延迟300毫秒,确保Tip的交互区域已释放
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
        isPresented.toggle()
    }
}

方案2:手动控制Tip的显示生命周期

通过TipKit的参数规则,控制Tip仅在特定场景下显示,避免与Sheet按钮交互冲突:

  1. 修改MyTip添加显示规则:
struct MyTip: Tip {
    var title: Text {
        Text("Test")
    }
    var message: Text? {
        Text("Hi")
    }
    // 添加规则:仅当用户未见过该Tip时显示
    var rules: [Rule] {
        #Rule(Self.$hasSeenTip) { $0 == false }
    }
    @Parameter
    static var hasSeenTip: Bool = false
}
  1. 在按钮点击时标记Tip已查看,避免后续显示:
Button("Hit Me!") {
    MyTip.hasSeenTip = true
    isPresented.toggle()
}

方案3:调整Tip的显示位置

修改popoverTip的附着位置,避免Tip的交互区域覆盖按钮:

// 将Tip附着到NavigationStack的Toolbar上,远离按钮区域
NavigationStack {
    VStack {
        Image(systemName: "globe")
            .imageScale(.large)
            .foregroundStyle(.tint)
            .padding(100)
        Button("Hit Me!") {
            isPresented.toggle()
        }
        .padding()
        .sheet(isPresented: $isPresented) {
            PresentPage()
        }
    }
    .toolbar {
        ToolbarItem(placement: .navigationBarTrailing) {
            Image(systemName: "info.circle")
                .popoverTip(MyTip())
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:55:20