Hi everyone,
I’m testing my Catalyst SwiftUI project on iOS 26 / iPadOS 26 / macOS 26. I started with a NavigationSplitView (triple-column) inside a WindowGroup. On iPad it looks great: the toolbar items merge into the navigation bar, with the three traffic lights.
But on Mac Catalyst, the app always reserves a blank safe area below the traffic lights, and places the toolbar on a separate line beneath the title bar. That leaves wasted vertical space I don’t want.
What I expect (based on Apple’s WWDC session “Elevate the design of your iPad app”):
The toolbar should merge into the title bar with the traffic lights, no separate row.
Content should extend into the full height of the window.
What I get on Mac Catalyst:
Title bar + traffic lights at the top.
Then a completely separate toolbar row below it.
Safe area inset prevents my content from reaching the top of the window.
What I’ve tried:
.toolbarRole(.automatic), .editor, .browser → no effect.
Hiding the title bar via titlebar?.titleVisibility = .hidden → removes the text but not the toolbar gap.
Clearing titlebar?.toolbar → no difference.
So far, I can’t find any way to get Catalyst to integrate toolbars into the window chrome the way native SwiftUI on macOS does.
Is this a known limitation of Mac Catalyst, or is there a supported way to achieve the same “inline toolbar with window controls” layout? Switching to a Mac app vs. Catalyst fixes the issue, but I would have a lot more work to do to get the app ready for release, not ideal since it works near perfect on iPad.
Thanks!
SwiftUI
RSS for tagProvide views, controls, and layout structures for declaring your app's user interface using SwiftUI.
Posts under SwiftUI tag
200 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
When building with the iOS 26 SDK (currently beta 4), the navigation title is often illegible when rendering a Map view.
For example, note how the title "Choose Location" is obscured by the map's text ("South America") in the screenshot below:
This screenshot is the result of the following view code:
import MapKit
import SwiftUI
struct Demo: View {
var body: some View {
NavigationStack {
Map()
.navigationTitle(Text("Choose Location"))
.navigationBarTitleDisplayMode(.inline)
}
}
}
I tried using the scrollEdgeEffectStyle(_:for:) modifier to apply a scroll edge effect to the top of the screen, in hopes of making the title legible, but that doesn't seem to have any effect. Specifically, the following code seems to produce the exact same result shown in the screenshot above.
import MapKit
import SwiftUI
struct Demo: View {
var body: some View {
NavigationStack {
Map()
.scrollEdgeEffectStyle(.hard, for: .top) // ⬅️ no apparent effect
.navigationTitle(Text("Choose Location"))
.navigationBarTitleDisplayMode(.inline)
}
}
}
Is there a recommended way to resolve this issue so that the navigation title is always readable?
Hey there, does someone know why the ContentUnavailableView is behaving differently on iOS 26 than in iOS 18 but the code is the same?
Pretty much as per the title and I suspect I know the answer. Given that Foundation Models run on device, is it possible to use Foundation Models framework inside of a DeviceActivityReport? I've been tinkering with it, and all I get is errors and "Sandbox restrictions". Am I missing something? Seems like a missed trick to utilise on device AI/ML with other frameworks.
Why is there always such a long hang when first switching tabs or popping up the keyboard in SwiftUI Development?
Hello,
I have a SwiftUI View sitting in the UIHosting view controller. On rotation to landscape, the system would add padding to the toolbar. I presume it's the nav bar.
Anyone experienced this? What would be this space? padding? content margin?
My app is a bit of a special case and relies on a custom view in a NSStatusItem. I use a NSHostingView and add it as a subview to my NSStatusItem's .button property.
Since macOS 26 Tahoe, even simple animations like a .frame change of a Circle won't animate smoothly even though the same SwiftUI animates normally in a WindowGroup.
class AppDelegate: NSObject, NSApplicationDelegate {
private let statusItem: NSStatusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
func applicationDidFinishLaunching(_ aNotification: Notification) {
let subview = NSHostingView(rootView: AnimationView())
let view = self.statusItem.button
view?.addSubview(subview)
subview.translatesAutoresizingMaskIntoConstraints = false
guard let view = view else { return }
NSLayoutConstraint.activate([
subview.centerXAnchor.constraint(equalTo: view.centerXAnchor),
subview.centerYAnchor.constraint(equalTo: view.centerYAnchor),
subview.widthAnchor.constraint(equalToConstant: 22),
subview.heightAnchor.constraint(equalToConstant: 22)
])
}
}
struct AnimationView: View {
@State private var isTapped = false
@State private var size: CGSize = .init(width: 4, height: 4)
var body: some View {
Circle()
.fill(.pink)
.frame(width: size.width, height: size.height)
.frame(width: 20, height: 20)
// .frame(maxHeight: .infinity)
// .padding(.horizontal, 9)
// .frame(height: 22)
.contentShape(Rectangle())
// .background(Color.blue.opacity(0.5))
.onTapGesture {
withAnimation(.interactiveSpring(response: 0.85, dampingFraction: 0.26, blendDuration: 0.45)) {
// withAnimation(.spring()) {
if isTapped {
size = .init(width: 4, height: 4)
} else {
size = .init(width: 16, height: 16)
}
}
isTapped.toggle()
}}
}
Example project:
https://app.box.com/s/q28upunrgkxyyd97ovslgud9yitqaxfk
I like the toolbar visionOS's Safari uses for back & forward page, share, etc. It floats above the window.
My attempt to do this with ornaments isn't as satisfying as they partially cover the window. My attempts with toolbar haven't produced visible results.
Is this Safari-style toolbar for visionOS exposed by Apple in the API's? If so, could someone point me to documentation or sample code? Thanks!
Feedback number: FB20451665
When building with Xcode 26, Voice Over is reporting an extra tab when swiping through tabs. Please see the sample project below:
/*
This is a Sample project to show that I believe there is a Voice Over bug in iOS 26.
When swiping through tabs with Voice Over active, there always appears to be an extra tab.
Here I have 5 tabs, when on tab one VO reads out tab 1 of 6, then tab 2 of 6, all the way to the last tab, when voice over reads out tab 5 of 6. Never tab 6 of 6.
Is there a possibility that voice over is picking up the underlying `more` tab and reading that out?
This has also been reportedly found in the Files app here:
https://www.applevis.com/comment/195441#comment-195441
*/
struct ContentView: View {
var body: some View {
TabView {
/// Activating this has Voice over telling us there are 6 Tabs.
Tab(RootTab.home.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.home.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.home.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.home.title.capitalized) tab")
Tab(RootTab.diary.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.diary.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.diary.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.diary.title.capitalized) tab")
Tab(RootTab.meals.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.meals.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.meals.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.meals.title.capitalized) tab")
Tab(RootTab.knowledge.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.knowledge.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.knowledge.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.knowledge.title.capitalized) tab")
Tab(RootTab.profile.title, systemImage: "circle.fill") {
Text("This is the \(RootTab.profile.title.capitalized) screen")
}
.accessibilityLabel("\(RootTab.profile.title.capitalized) tab")
.accessibilityHint("Double tap to open the \(RootTab.profile.title.capitalized) tab")
/// Activating this also has Voice over telling us there are 6 Tabs.
// ForEach(RootTab.allCases, id: \.self) { tab in
//
// Text("This is the \(tab.title.capitalized) screen")
// .tabItem {
// Label(tab.title.capitalized, systemImage: "circle.fill")
// }
// .accessibilityLabel("\(tab.title.capitalized) tab")
// .accessibilityHint("Double tap to open the \(tab.title.capitalized) tab")
// }
}
}
enum RootTab: CaseIterable {
case home
case diary
case meals
case knowledge
case profile
var title: String {
switch self {
case .home:
"home"
case .diary:
"diary"
case .meals:
"meals"
case .knowledge:
"knowledge"
case .profile:
"profile"
}
}
}
}
I'm curious if anyone else can see this issue, or if anyone knows of a workaround for it.
I’ve hit a strange SwiftUI preview crash that happens on macOS previews when using a view inside a List’s ForEach, resulting in the error Fatal Error in TableViewListCore_Mac2.swift.
Only crashes macOS preview - iPhone/iPad preview doesn't crash.
Doesn't crash when actually running the app.
Here’s a minimal reproducible example, causing the preview to crash.
XCode: Version 26.0.1 (17A400)
MacOS: 26.0.1 (25A362)
import SwiftUI
struct Item: Identifiable {
let id = UUID()
let name: String
}
struct ItemRow: View {
let item: Item
var body: some View {
HStack {
Button(action: {}) { Image(systemName: "play") }
Text(item.name)
Spacer()
ProgressView()
}
}
}
struct ContentView: View {
@State private var items = [
Item(name: "Item A"),
Item(name: "Item B"),
]
var body: some View {
List {
ForEach(items) { item in
ItemRow(item: item)
}
}
}
}
#Preview("Content view") {
ContentView()
}
#Preview("Item row") {
ItemRow(item: Item(name: "Item A"))
}
If I wrap the row in a container, like this:
ForEach(items) { item in
ZStack {
ItemRow(item: item)
}
}
the crash seems to disappear.
Has anyone else seen this behavior?
What might I be doing wrong?
Any ideas about what could be causing this?
I was looking at the new iOS 26 Mail app and it has these tab/filters of some sort and I was wondering if there is a default API/code in swiftui that I am supposed to be using.
Looked everywhere for this, thank you!!
I have an iPad app with a classic sidebar. It's been working fine for years. Now with iPadOS 26 the sidebar sometime gets this fake transparency that makes it really hard to quickly grok. A part of Liquid Glass seems to be to sometimes (but not always) take whatever is in the secondary area (the main big content), blur it, mirror it and then use as the background for the sidebar. This is silly and does not work at all for an app like mine. It maybe looks decent if your background is a photo or similar, but not for an app that manages data. Not all views cause the sidebar to get this ugly unreadable background. In most of the cases the sidebar keeps its normal opaque background that it has always had.
See this example for how it looks when it's really bad:
This is how it should look. Notice that the content of the "main view" is pretty similar to the case where it gets the ugly background. The difference is the segmented thing at the top, ie. a different "root view".
Is there some good way for me to force the sidebar to always have an opaque background? I guess I could make a ZStack and put a solid color as the background behind the sidebar, but those kinds of hacks are better to avoid.
This can not be how some UI designer envisioned that apps should look? Maybe I'm missing some new modifier or setting somewhere that would led me opt out from this aspect of Liquid Glass? Apart from this it looks pretty nice. There are some bugs where the contents of the main area gets clipped when the sidebar is shown, hidden and then shown again, but that's for another time (and it's surely known already (if the bug tracking system allowed me to search I could verify)).
So, any way to make my app look nice again?
Hi all,
I've developed some code that enables an arcball camera interaction with my scene. I've done this using components and systems. The implementation feels a bit messy as I've got gesture code on my realityView, and then a bunch of other code that uses those gesture inputs in my component and system.
Is there a demo app, or some example code that shows a nice way to encapsulate these things in to one item for custom cameras, something like Apple's .realityViewCameraControls(.orbit)
If not can anyone recommend an approach to take?
On iPhone .inspector is presented as a sheet so you can use .presentationDetents to determine its detents. However, SwiftUI doesn't update the presentationDetents selection binding in this case. See attached minimum example of the problem - onChange will not run and print when you swipe and change the detent of the inspector sheet.
import SwiftUI
@main
struct TestingApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
@State var showInspector = false
@State var detent: PresentationDetent = .medium
var body: some View {
Button("Toggle Inspector") {
showInspector.toggle()
}
.inspector(isPresented: $showInspector) {
Text("Inspector Content")
.presentationDetents([.medium, .large], selection: $detent)
}
.onChange(of: detent) { _, detent in
print(detent)
}
}
}
#Preview {
ContentView()
}
NSHostingSceneRepresentation, introduced in macOS 26, allows calling SwiftUI’s windows and other elements set in a Scene from AppKit. However, while Settings and WindowGroup set in the Scene can be invoked as expected using environment.openSettings() and environment.openWindow(id:) respectively, calling Window or WindowUtility doesn’t work. That is, the app just fails to open the desired window with the provided ID, and no error message or other feedback/crash/freeze appears.
I expect that executing the openUtilityWindow(_:)action in the following code will display the UtilityWindow set in the scene. However, the window does not actually open.
@main
final class AppDelegate: NSObject, NSApplicationDelegate {
private let scene = NSHostingSceneRepresentation {
UtilityWindow("Utility Window", id: "UtilityWindow") {
Text("Utility Window")
.scenePadding()
}
}
func applicationWillFinishLaunching(_ notification: Notification) {
NSApp.addSceneRepresentation(self.scene)
}
@IBAction func openUtilityWindow(_ sender: Any?) {
self.scene.environment.openWindow(id: "UtilityWindow")
}
}
Is there something wrong with my implementation and expectation? Or is this a bug in NSHostingSceneRepresentation?
Just in case, I’ve already filed this issue withFeedback Assistant: FB20310722
This feedback also includes a sample project reproducing this issue.
you guys literally need update this video of introducing the swifui webview. these apis even not exist...
https://developer.apple.com/videos/play/wwdc2025/231/
Problem:
I'm implementing StoreKit 2 in my SwiftUI app. Products load successfully when I rebuild in Xcode, but on a fresh install, Product.products(for:) returns an empty array. The paywall shows "Unable to load pricing."
Setup:
Using StoreKit Configuration File (
.storekit
) for testing
Product IDs match exactly between config and code:
com..premium.lifetime (non-consumable)
com..premium.monthly (auto-renewable subscription)
com.****.premium.yearly (auto-renewable subscription)
StoreKitManager is a @MainActor singleton with @Published properties
What I've Tried:
Initial delay before loading - Added 1-second delay in init before calling loadProducts()
Product ID verification - Confirmed IDs match exactly between StoreKitConfig.storekit and code
Retry logic with exponential backoff - Implemented 3 retry attempts with 0.5s/1s/1.5s delays
Multiple calls to updatePurchasedProducts() - Called twice after initial load
Verified StoreKit configuration - File is properly added to project, has valid product definitions
Code Structure:
swift
@MainActor
final class StoreKitManager: ObservableObject {
static let shared = StoreKitManager()
@Published private(set) var products: [Product] = []
private init() {
updateListenerTask = listenForTransactions()
Task {
try? await Task.sleep(nanoseconds: 1_000_000_000)
await loadProducts() // Returns empty on fresh install
await updatePurchasedProducts()
}
}
}
Observations:
✅ Works perfectly after Xcode rebuild
❌ Fails on fresh app install (simulator & device)
❌ Product.products(for:) returns empty array (no error thrown)
✅ StoreKit configuration file is valid and properly configured
Question: Why does StoreKit need a rebuild to recognize products? Is there a proper initialization sequence I'm missing for fresh installs?
Environment:
Xcode [Version 26.0 beta 7]
iOS [IOS +17.0]
Testing with StoreKit Configuration File
Summary:
The minus.capsule and minus.capsule.fill SF Symbols do not render in my project. Other SF Symbols (e.g., plus.capsule and minus.circle) render correctly in the same context.
Steps to Reproduce
1. Add an Image(systemName: "minus.capsule") or Image(systemName: "minus.capsule.fill") to a SwiftUI view.
2. Run the app on the latest macOS.
Expected Result
The minus capsule symbols should render consistently, similar to plus.capsule.
Actual Result
minus.capsule and minus.capsule.fill do not render at all.
Additional Testing
• Replaced minus.capsule with minus.circle: renders correctly.
• Swapped the right-hand plus.capsule symbol in my slider with minus.capsule: the symbol fails to render in that position as well. That rules out clipping or layout issues.
I seem to be having an issue where certain symbol effect animations are not working. Using symbol effect .appear, .drawOn .drawOff seems to cause the symbol to not display at all.
Am I using this code correctly if I want to have a simple animate repeatedly on display?
Specifically, modifying the Multiplatform app template in xcode:
Image(systemName: "ellipsis")
.font(.title)
.foregroundColor(.blue)
.symbolEffect(.drawOn.byLayer, options: .repeat(.continuous))
I'm currently on the latest release on Xcode/macOS and iOS/macOS on client. Both iOS and macOS seem affected. The project is multiplatform and only support macOS/iOS 26.
Did iOS 26 or Xcode 26 change scrollview gesture system? I just found an issue that simultaneousGesture inside a scrollview will cause scrolling disabled, but it works fine on iOS 18. Any solutions here? I also saw serverl similar posts on Twitter and forums.