diff --git a/GiteaPR.xcodeproj/project.pbxproj b/GiteaPR.xcodeproj/project.pbxproj index ac8ec19..1784e0a 100644 --- a/GiteaPR.xcodeproj/project.pbxproj +++ b/GiteaPR.xcodeproj/project.pbxproj @@ -187,7 +187,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR"; @@ -197,7 +197,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.1; + MARKETING_VERSION = 3.2; PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; @@ -211,7 +211,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 22; + CURRENT_PROJECT_VERSION = 23; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_CFBundleDisplayName = "GiteaPR"; @@ -221,7 +221,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 3.1; + MARKETING_VERSION = 3.2; PRODUCT_BUNDLE_IDENTIFIER = com.bueso.giteapr; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_EMIT_LOC_STRINGS = YES; diff --git a/GiteaPR/Detail/PRDetailView.swift b/GiteaPR/Detail/PRDetailView.swift index 3198e5e..62e0b83 100644 --- a/GiteaPR/Detail/PRDetailView.swift +++ b/GiteaPR/Detail/PRDetailView.swift @@ -103,19 +103,31 @@ struct PRDetailView: View { VStack(spacing: 0) { header(pr) - // Page-style TabView gives iOS-native swipe-to-change between - // sections (matching iOS 26), while the bottom bar taps select. - TabView(selection: $selectedTab) { - OverviewTab(pr: pr) - .tag(DetailTab.overview) - ConversationTab(vm: vm) - .tag(DetailTab.conversation) - FilesTab(vm: vm) - .tag(DetailTab.files) - ChecksTab(vm: vm, onRerun: { showRerunConfirm = $0 }) - .tag(DetailTab.checks) + // Horizontal paging ScrollView — swipeable like a TabView, but + // without breaking NavigationLink inside the tabs (TabView's .page + // style swallows taps and interferes with nested navigation). + ScrollView(.horizontal, showsIndicators: false) { + HStack(spacing: 0) { + OverviewTab(pr: pr) + .id(DetailTab.overview) + .containerRelativeFrame(.horizontal) + + ConversationTab(vm: vm) + .id(DetailTab.conversation) + .containerRelativeFrame(.horizontal) + + FilesTab(vm: vm) + .id(DetailTab.files) + .containerRelativeFrame(.horizontal) + + ChecksTab(vm: vm, onRerun: { showRerunConfirm = $0 }) + .id(DetailTab.checks) + .containerRelativeFrame(.horizontal) + } + .scrollTargetLayout() } - .tabViewStyle(.page(indexDisplayMode: .never)) + .scrollTargetBehavior(.paging) + .scrollPosition(id: $selectedTab) .ignoresSafeArea(edges: .bottom) bottomTabBar