Post

Replies

Boosts

Views

Activity

Reply to How can I get details on moderation removals?
Hello @DTS Engineer, thanks for confirming. 🙏 I did create this thread soon after it happened, so I guess it just got missed. At the time, my only theory was that the thread was removed because I linked to it from a related thread: https://developer.apple.com/forums/thread/722874 The reply and/or comment containing that link, was also removed, which is why I think the April cross-post was the cause. But from your helpful Quinn’s Top Ten DevForums Tips, it seems cross-posting is actually encouraged in that situation: If you find a bunch of old threads that might be related to your issue, don’t post full replies to all of them. Pick a lead thread and post your full reply there, then reply on the other threads with a link to the lead thread. Other than the cross-post, I’m at a loss for what might have caused the removal. I'd just like to understand what could trigger a moderation so I can avoid it in the future. Is there a published list of things that can result in moderation?
1w
Reply to iOS 26: Enabling "Reduce Transparency" causes a persistent white bar where the tab bar was hidden, blocking user interaction
I just ran into this issue in one of my apps. With Reduce Transparency enabled on iOS 26, hiding a SwiftUI tab bar could leave its opaque background and safe-area reservation behind. The good news is that it appears to be fixed in iOS 27 (24A5390f). But while iOS 27 is just around the corner, many people typically take a while to upgrade, so I wanted a workaround. I mainly work in SwiftUI, so got help from an LLM to build this UIKit bridge. It solves the issue in my app for both zoom and push/pop transitions (parent view has both grid and list layouts). WORKAROUND The app still uses SwiftUI as the source of truth for tab bar visibility. In simplified form: NavigationStack(path: $path) { // Root content and navigation destinations } .toolbarVisibility( path.count == 0 ? .automatic : .hidden, for: .tabBar ) I then apply the workaround to the destination where the tab bar should remain hidden: DetailView() .applyIOS26TabBarVisibilityWorkaround() The helper only reasserts the hidden state through UIKit. It intentionally does not show the tab bar during teardown, because that can conflict with another destination or an unchanged SwiftUI visibility preference. The parent-owned .toolbarVisibility modifier remains responsible for restoring the bar. import SwiftUI import UIKit extension View { /// Works around the iOS 26 tab-bar safe-area bug when Reduce Transparency is enabled. func applyIOS26TabBarVisibilityWorkaround() -> some View { background(IOS26TabBarVisibilityWorkaround()) } } /// Uses UIKit because SwiftUI can leave the iOS 26 tab-bar safe area behind after hiding the bar. private struct IOS26TabBarVisibilityWorkaround: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> Controller { Controller() } func updateUIViewController(_ uiViewController: Controller, context: Context) { uiViewController.hideTabBar() } static func dismantleUIViewController( _ uiViewController: Controller, coordinator: () ) { uiViewController.stopApplyingWorkaround() } final class Controller: UIViewController { private weak var trackedTabBarController: UITabBarController? private var shouldApplyWorkaround = false override func loadView() { let view = UIView() view.backgroundColor = .clear view.isUserInteractionEnabled = false self.view = view } func hideTabBar() { shouldApplyWorkaround = true applyHiddenTabBarVisibility() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) applyHiddenTabBarVisibility() } override func didMove(toParent parent: UIViewController?) { super.didMove(toParent: parent) guard parent != nil else { return } applyHiddenTabBarVisibility() } func stopApplyingWorkaround() { shouldApplyWorkaround = false trackedTabBarController = nil } private func applyHiddenTabBarVisibility() { guard shouldApplyWorkaround, parent != nil else { return } guard #available(iOS 26.0, *) else { return } if #available(iOS 27.0, *) { return } guard let tabBarController = resolveTabBarController() else { return } trackedTabBarController = tabBarController // Deliberately call this even if isTabBarHidden is already true. // Reasserting the state is what corrects the stale iOS 26 layout. tabBarController.setTabBarHidden(true, animated: false) } private func resolveTabBarController() -> UITabBarController? { if let tabBarController { return tabBarController } if let tabBarController = parent?.tabBarController { return tabBarController } var ancestor = parent while let current = ancestor { if let tabBarController = current as? UITabBarController { return tabBarController } ancestor = current.parent } var responder: UIResponder? = viewIfLoaded while let current = responder { if let tabBarController = current as? UITabBarController { return tabBarController } responder = current.next } return trackedTabBarController } } } I can’t say this is the cleanest solution, but it fixes the issue for me while leaving the normal SwiftUI navigation transitions intact. SCREENSHOTS And here's the resulting detail view before and after the workaround on iOS 26:
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Aug ’26
Reply to SwiftUI Button with Image view label has smaller hit target
This is still an issue in iOS 27 (24A5390f). In my demo video, I used 1.square.fill, 2.square.fill, etc., but those are fairly large, square SF Symbols, so they don’t really show how small the hit target can be. This is much more problematic with “thin” icons like ellipsis. Declaring the button with Label avoids the small hit-target issue, but then it runs into the TipKit bug where tips won’t display for a Menu declared that way: https://developer.apple.com/forums/thread/804587 So it’s a catch-22: use Image and get a tiny hit target, or use Label and lose the tip.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jul ’26
Reply to Tab bar animates from first tab to restored selection at launch with .tabBarMinimizeBehavior(.onScrollDown)
A native-only workaround is to start the TabView with minimization off, then switch to .onScrollDown after its initial presentation. In my testing, this lets the restored selection settle before minimization is applied, preventing the animation from the first tab to the restored tab. The tab bar then minimizes normally after the one-second delay. The tradeoff is that scroll-driven minimization is unavailable during that first second. Many of Apple’s first-party iPhone apps restore the previously selected tab at launch while also supporting tab bar minimization, so this shouldn’t require an app-level workaround. Workaround struct ContentView: View { @AppStorage("selectedGenericTab") private var selectedTab: AppTab = .three @State private var minimizeBehavior: TabBarMinimizeBehavior = .never var body: some View { TabView(selection: $selectedTab) { // Tabs… } .tabBarMinimizeBehavior(minimizeBehavior) .task { guard minimizeBehavior == .never else { return } do { try await Task.sleep(for: .seconds(1)) } catch { return } minimizeBehavior = .onScrollDown } } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jul ’26
Reply to TipKit: showing a popover tip on a SwiftUI toolbar button
This still appears to be an issue on iOS 26 and macOS 26. For a control inside a navigation-bar ToolbarItem, the .buttonStyle(...) workaround is still required. In my case, the tip reaches .available and the isPresented binding flips to true, but nothing is rendered unless the enclosing control has an explicit button style. Attaching .popoverTip(...) to the inner Label alone is not sufficient; the explicit button style is the important part. This works, and removing .buttonStyle(.plain) breaks presentation: Toggle(isOn: $isOn) { Label("Voice", systemImage: "mic") .labelStyle(.iconOnly) .popoverTip(tip, isPresented: $isPresented, arrowEdge: .top) } .buttonStyle(.plain) .toggleStyle(.button) I’m also seeing a separate issue with the popoverTip(_:isPresented:...) overload on iOS 26/macOS 26: if the modifier remains attached while the tip value is nil, or after the tip is dismissed/no longer eligible, an empty popover shell can briefly appear and dismiss itself. This is especially visible on macOS. The only reliable workaround I’ve found is to remove the .popoverTip(...) modifier from the view hierarchy entirely once the tip is no longer eligible, rather than passing nil: if tipIsEligible { label.popoverTip(tip, isPresented: $isPresented) } else { label } I’ve worked around both issues as best I can, but wanted to leave an update here for anyone else who lands on this thread while debugging TipKit + toolbar presentation, as I did.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jun ’26
Reply to SwiftUI Button with Image view label has smaller hit target
Thanks, @DTS Engineer. I haven’t tried that exact workaround, but I expect it works. Defining the label differently also avoids the issue with less code, so there are multiple workarounds. The bigger issue is the tap feedback. Tapping outside the SF Symbol but inside the visible button can show the normal bounce animation without triggering the action. If the action doesn’t run, the button shouldn’t look like it accepted the tap. This feels related to another issue I reported, where a disabled button still bounces like an active button:
Topic: UI Frameworks SubTopic: SwiftUI Tags:
May ’26
Reply to Some variable SF Symbols don't work.
@akashr Thank you! 🙏 This saved me from wasting more time on this. I’d already burned a couple hours trying to figure out why a symbol that clearly supports variable value in the SF Symbols app, wasn’t working in code. I really wish Apple’s docs included more real-world samples. Seems like many symbols do need .symbolVariableValueMode(.draw) for this to work.
Topic: Design SubTopic: General Tags:
May ’26
Reply to Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
@DTS Engineer, thanks for the reply. 🙏 That’s right, I used the local test environment only to capture those screenshots. The build currently in TestFlight does use sandbox. I’m asking about the text of the two paywalls. The guidelines are unclear for this corner case, and there aren’t many up-front paid apps with trials to reference. So, to clarify: Does the paywall text look acceptable, or should I change anything before submitting to App Review?
May ’26
Reply to How can I get details on moderation removals?
Hello @DTS Engineer, thanks for confirming. 🙏 I did create this thread soon after it happened, so I guess it just got missed. At the time, my only theory was that the thread was removed because I linked to it from a related thread: https://developer.apple.com/forums/thread/722874 The reply and/or comment containing that link, was also removed, which is why I think the April cross-post was the cause. But from your helpful Quinn’s Top Ten DevForums Tips, it seems cross-posting is actually encouraged in that situation: If you find a bunch of old threads that might be related to your issue, don’t post full replies to all of them. Pick a lead thread and post your full reply there, then reply on the other threads with a link to the lead thread. Other than the cross-post, I’m at a loss for what might have caused the removal. I'd just like to understand what could trigger a moderation so I can avoid it in the future. Is there a published list of things that can result in moderation?
Replies
Boosts
Views
Activity
1w
Reply to How can I get details on moderation removals?
Bump…would still love an answer to this.👆
Replies
Boosts
Views
Activity
2w
Reply to iOS 26: Enabling "Reduce Transparency" causes a persistent white bar where the tab bar was hidden, blocking user interaction
I just ran into this issue in one of my apps. With Reduce Transparency enabled on iOS 26, hiding a SwiftUI tab bar could leave its opaque background and safe-area reservation behind. The good news is that it appears to be fixed in iOS 27 (24A5390f). But while iOS 27 is just around the corner, many people typically take a while to upgrade, so I wanted a workaround. I mainly work in SwiftUI, so got help from an LLM to build this UIKit bridge. It solves the issue in my app for both zoom and push/pop transitions (parent view has both grid and list layouts). WORKAROUND The app still uses SwiftUI as the source of truth for tab bar visibility. In simplified form: NavigationStack(path: $path) { // Root content and navigation destinations } .toolbarVisibility( path.count == 0 ? .automatic : .hidden, for: .tabBar ) I then apply the workaround to the destination where the tab bar should remain hidden: DetailView() .applyIOS26TabBarVisibilityWorkaround() The helper only reasserts the hidden state through UIKit. It intentionally does not show the tab bar during teardown, because that can conflict with another destination or an unchanged SwiftUI visibility preference. The parent-owned .toolbarVisibility modifier remains responsible for restoring the bar. import SwiftUI import UIKit extension View { /// Works around the iOS 26 tab-bar safe-area bug when Reduce Transparency is enabled. func applyIOS26TabBarVisibilityWorkaround() -> some View { background(IOS26TabBarVisibilityWorkaround()) } } /// Uses UIKit because SwiftUI can leave the iOS 26 tab-bar safe area behind after hiding the bar. private struct IOS26TabBarVisibilityWorkaround: UIViewControllerRepresentable { func makeUIViewController(context: Context) -> Controller { Controller() } func updateUIViewController(_ uiViewController: Controller, context: Context) { uiViewController.hideTabBar() } static func dismantleUIViewController( _ uiViewController: Controller, coordinator: () ) { uiViewController.stopApplyingWorkaround() } final class Controller: UIViewController { private weak var trackedTabBarController: UITabBarController? private var shouldApplyWorkaround = false override func loadView() { let view = UIView() view.backgroundColor = .clear view.isUserInteractionEnabled = false self.view = view } func hideTabBar() { shouldApplyWorkaround = true applyHiddenTabBarVisibility() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) applyHiddenTabBarVisibility() } override func didMove(toParent parent: UIViewController?) { super.didMove(toParent: parent) guard parent != nil else { return } applyHiddenTabBarVisibility() } func stopApplyingWorkaround() { shouldApplyWorkaround = false trackedTabBarController = nil } private func applyHiddenTabBarVisibility() { guard shouldApplyWorkaround, parent != nil else { return } guard #available(iOS 26.0, *) else { return } if #available(iOS 27.0, *) { return } guard let tabBarController = resolveTabBarController() else { return } trackedTabBarController = tabBarController // Deliberately call this even if isTabBarHidden is already true. // Reasserting the state is what corrects the stale iOS 26 layout. tabBarController.setTabBarHidden(true, animated: false) } private func resolveTabBarController() -> UITabBarController? { if let tabBarController { return tabBarController } if let tabBarController = parent?.tabBarController { return tabBarController } var ancestor = parent while let current = ancestor { if let tabBarController = current as? UITabBarController { return tabBarController } ancestor = current.parent } var responder: UIResponder? = viewIfLoaded while let current = responder { if let tabBarController = current as? UITabBarController { return tabBarController } responder = current.next } return trackedTabBarController } } } I can’t say this is the cleanest solution, but it fixes the issue for me while leaving the normal SwiftUI navigation transitions intact. SCREENSHOTS And here's the resulting detail view before and after the workaround on iOS 26:
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Aug ’26
Reply to SwiftUI Button with Image view label has smaller hit target
This is still an issue in iOS 27 (24A5390f). In my demo video, I used 1.square.fill, 2.square.fill, etc., but those are fairly large, square SF Symbols, so they don’t really show how small the hit target can be. This is much more problematic with “thin” icons like ellipsis. Declaring the button with Label avoids the small hit-target issue, but then it runs into the TipKit bug where tips won’t display for a Menu declared that way: https://developer.apple.com/forums/thread/804587 So it’s a catch-22: use Image and get a tiny hit target, or use Label and lose the tip.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Jul ’26
Reply to Tab bar animates from first tab to restored selection at launch with .tabBarMinimizeBehavior(.onScrollDown)
A native-only workaround is to start the TabView with minimization off, then switch to .onScrollDown after its initial presentation. In my testing, this lets the restored selection settle before minimization is applied, preventing the animation from the first tab to the restored tab. The tab bar then minimizes normally after the one-second delay. The tradeoff is that scroll-driven minimization is unavailable during that first second. Many of Apple’s first-party iPhone apps restore the previously selected tab at launch while also supporting tab bar minimization, so this shouldn’t require an app-level workaround. Workaround struct ContentView: View { @AppStorage("selectedGenericTab") private var selectedTab: AppTab = .three @State private var minimizeBehavior: TabBarMinimizeBehavior = .never var body: some View { TabView(selection: $selectedTab) { // Tabs… } .tabBarMinimizeBehavior(minimizeBehavior) .task { guard minimizeBehavior == .never else { return } do { try await Task.sleep(for: .seconds(1)) } catch { return } minimizeBehavior = .onScrollDown } } }
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Jul ’26
Reply to TipKit: showing a popover tip on a SwiftUI toolbar button
This still appears to be an issue on iOS 26 and macOS 26. For a control inside a navigation-bar ToolbarItem, the .buttonStyle(...) workaround is still required. In my case, the tip reaches .available and the isPresented binding flips to true, but nothing is rendered unless the enclosing control has an explicit button style. Attaching .popoverTip(...) to the inner Label alone is not sufficient; the explicit button style is the important part. This works, and removing .buttonStyle(.plain) breaks presentation: Toggle(isOn: $isOn) { Label("Voice", systemImage: "mic") .labelStyle(.iconOnly) .popoverTip(tip, isPresented: $isPresented, arrowEdge: .top) } .buttonStyle(.plain) .toggleStyle(.button) I’m also seeing a separate issue with the popoverTip(_:isPresented:...) overload on iOS 26/macOS 26: if the modifier remains attached while the tip value is nil, or after the tip is dismissed/no longer eligible, an empty popover shell can briefly appear and dismiss itself. This is especially visible on macOS. The only reliable workaround I’ve found is to remove the .popoverTip(...) modifier from the view hierarchy entirely once the tip is no longer eligible, rather than passing nil: if tipIsEligible { label.popoverTip(tip, isPresented: $isPresented) } else { label } I’ve worked around both issues as best I can, but wanted to leave an update here for anyone else who lands on this thread while debugging TipKit + toolbar presentation, as I did.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Jun ’26
Reply to Back gesture not disabled with navigationBarBackButtonHidden(true) when using .zoom transition
Quick update: this is still a problem in iOS 27.0 (24A5355q).
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Jun ’26
Reply to .disabled() doesn't VISUALLY disable buttons inside ToolbarItem on iOS 26 devices
As requested, I tested this again in iOS 26.5 (and 26.6 (23G5028e)) and .disabled toolbar buttons still reacts to taps.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
May ’26
Reply to SwiftUI Button with Image view label has smaller hit target
Thanks, @DTS Engineer. I haven’t tried that exact workaround, but I expect it works. Defining the label differently also avoids the issue with less code, so there are multiple workarounds. The bigger issue is the tap feedback. Tapping outside the SF Symbol but inside the visible button can show the normal bounce animation without triggering the action. If the action doesn’t run, the button shouldn’t look like it accepted the tap. This feels related to another issue I reported, where a disabled button still bounces like an active button:
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
May ’26
Reply to Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
Quick follow-up… This made it through App Review and is now live. I refined the paywall screens a bit before release: It's been out a couple weeks now. Downloads picked up after switching from paid upfront, but unfortunately no increase in sales yet.
Replies
Boosts
Views
Activity
May ’26
Reply to Some variable SF Symbols don't work.
@akashr Thank you! 🙏 This saved me from wasting more time on this. I’d already burned a couple hours trying to figure out why a symbol that clearly supports variable value in the SF Symbols app, wasn’t working in code. I really wish Apple’s docs included more real-world samples. Seems like many symbols do need .symbolVariableValueMode(.draw) for this to work.
Topic: Design SubTopic: General Tags:
Replies
Boosts
Views
Activity
May ’26
Reply to Any way to hide/remove "Build Uploads" section in TestFlight › iOS Builds?
Not sure when it changed, but the iOS Builds page now seems to keep the Build Uploads section collapsed, surviving page reloads and navigating away and back. To whoever fixed this: Thank you, thank you! 🙏
Replies
Boosts
Views
Activity
May ’26
Reply to Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
Well, now it's in the hands of App Review. We'll see how this goes!? 😅
Replies
Boosts
Views
Activity
May ’26
Reply to Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
I made a few wording tweaks, so here’s the latest:
Replies
Boosts
Views
Activity
May ’26
Reply to Free trial for one-time purchase: Is the $0 IAP workaround still recommended in 2026?
@DTS Engineer, thanks for the reply. 🙏 That’s right, I used the local test environment only to capture those screenshots. The build currently in TestFlight does use sandbox. I’m asking about the text of the two paywalls. The guidelines are unclear for this corner case, and there aren’t many up-front paid apps with trials to reference. So, to clarify: Does the paywall text look acceptable, or should I change anything before submitting to App Review?
Replies
Boosts
Views
Activity
May ’26