Post

SwiftUI NavigationStack 滑動返回失效

SwiftUI NavigationStack 滑動返回失效

1. 問題

在 SwiftUI 用 NavigationStack 時,iOS 原生的「從左邊滑動返回上一頁」功能突然失效了。

畫面可以正常 push 進去,但滑動手勢完全沒反應,只能按左上角的返回按鈕。


2. 原因

NavigationStack 裡面的 View 如果加了 .padding(),在某些情況下會干擾到系統的 edge swipe gesture。

這不是每次都會發生,但當 padding 影響到最外層的 hit test 區域時,手勢辨識就會失敗。


3. 解法

NavigationStack 內層不必要的 .padding() 拿掉。

修改前

1
2
3
4
NavigationStack {
    SomeView()
        .padding()  // 這個會讓滑動返回壞掉
}

修改後

1
2
3
4
NavigationStack {
    SomeView()
    // 如果真的需要 padding,用內部元件各自加,不要加在最外層
}

4. 重點

  • 這是 SwiftUI 的已知行為,不是你的程式有 bug
  • 症狀很像是 gesture 被吃掉了,但其實是 hit test 區域被改變
  • 如果你在 NavigationStack 裡面要加 padding,盡量加在子 View 的內部,不要加在最外層
This post is licensed under CC BY 4.0 by the author.