With iOS 26.1 we started seeing a bug that only appears on iPhone Air. This bug is visible with simulators too. I have tried so many different ways to fix the issue, but Instruments Profiler is pointing at UIKitCore.
We load a tab bar, when the user attempts to switch a tab, the app hangs and never recovers. It happens right as the animation of the Glass bubble is in progress.
I have tried a UIKit Tab bar, a SwiftUI Tab bar. I tore out AppDelegate and did a direct @main SwiftUI entry for my application. This issue appears with every tab bar instance I try.
I attempted to disable LiquidGlass by utilizing this flag UIDesignRequiresCompatibility in my plist, but the flag seems to be ignored by the system.
I am not sure what else to try. I have a trace file if that is helpful. What else can I upload?
Here is what the code looks like.
struct ContentView: View {
@State private var selectedTab = 2
var body: some View {
TabView(selection: $selectedTab) {
Text("Profile")
.tabItem {
Label("Me", systemImage: "person")
}
.tag(0)
Text("Training")
.tabItem {
Label("Training", systemImage: "calendar")
}
.tag(1)
Text("Home")
.tabItem {
Label("Home", systemImage: "house")
}
.tag(2)
Text("Goals")
.tabItem {
Label("Goals", systemImage: "target")
}
.tag(3)
Text("Coach")
.tabItem {
Label("Coach", systemImage: "person.2")
}
.tag(4)
}
}
}
#Preview {
ContentView()
}
and AppView entry point
import SwiftUI
@main
struct RunCoachApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
Explore the various UI frameworks available for building app interfaces. Discuss the use cases for different frameworks, share best practices, and get help with specific framework-related questions.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
Hi,
I found an issue related to dynamic app icon changes using
UIApplication.shared.setAlternateIconName specifically on iOS 26.1.
Test Scenario
1. Change icon using:
UIApplication.shared.setAlternateIconName("TestIcon")
→ Works correctly.
2. Revert to primary icon using:
UIApplication.shared.setAlternateIconName(nil)
Issue on iOS 26.1
For some users, the device does not revert back to the primary icon when calling setAlternateIconName(nil).
To handle this case, we attempted to force the primary icon by explicitly calling:
UIApplication.shared.setAlternateIconName("AppIcon")
However, on iOS 26.1:
• As soon as this call is made,
the entire setAlternateIconName API stops working.
• Every subsequent call to setAlternateIconName fails.
• The API begins returning errors (e.g. NSPOSIXErrorDomain code 35).
• The issue persists until the device is rebooted.
Expected Behavior
We understand that providing "AppIcon" should not change the icon (since primary icon is restored using nil),
but on earlier versions of iOS (≤ 26.0):
• Calling "AppIcon" simply does nothing (no icon change)
• And setAlternateIconName(nil) works as expected to restore the default icon.
Problem Summary
• On iOS 26.1, calling setAlternateIconName("AppIcon") puts the icon system into a bad state.
• After this call:
• The API becomes unresponsive
• All icon changes fail
• Only a reboot restores normal behavior
• This regression does not occur on iOS 26.0 or earlier.
Request
Is this a known issue with the app icon system on iOS 26.1?
Should "AppIcon" explicitly be rejected, or is the freeze/error state unintended behavior?
Any guidance or confirmation would be greatly appreciated. Thanks!
Topic:
UI Frameworks
SubTopic:
UIKit
SwiftUI sheet with TextField using autocorrectionDisabled() prevents view model deinit after editing
I present a view as a sheet that contains a TextField and a viewModel. The sheet uses .autocorrectionDisabled() on the TextField.
If I open the sheet and dismiss it without editing, the viewModel is released as expected. But if I edit the TextField and then dismiss the sheet, the viewModel is not deinitialized (it remains retained).
Test Outputs:
// # Present 1st time - Correct ✅
TestViewModel - init - 0x0000600000c12ee0
// Dismiss wihtout editing, deinitialized correctly
TestViewModel - deinit - 0x0000600000c12ee0
// # Present 2st time - Incorrect ❌
TestViewModel - init - 0x0000600000c006c0
// Edit and dismiss, no deinit here
// # Present 3rd time - Incorrect ❌
TestViewModel - init - 0x0000600000c113b0
// Enter text field to edit will deinit previous one
TestViewModel - deinit - 0x0000600000c006c0
// Dismiss, no deinit
// TestViewModel (0x0000600000c113b0) remains retained ⚠️
Using .autocorrectionDisabled(true) gives the same problem. Removing or commenting out .autocorrectionDisabled() fixes the issue, but I don't want autocorrection enabled.
Is this a known SwiftUI bug? Has anyone encountered it and found a workaround?
Sample code:
@main
struct TestApp: App {
@State private var isPresentingSheet: Bool = false
var body: some Scene {
WindowGroup {
VStack {
Button("Present Sheet") {
self.isPresentingSheet = true
}
}
.sheet(isPresented: $isPresentingSheet) {
TestTextInputView()
}
}
}
}
View (check the HERE line):
struct TestTextInputView: View {
@StateObject private var viewModel = TestTextInputViewModel()
@FocusState private var isFocused: Bool
@Environment(\.dismiss) private var dismiss
var body: some View {
NavigationStack {
Form {
TextField("Name", text: $viewModel.name)
.autocorrectionDisabled() // HERE: Comment it out will work without any issue.
.focused($isFocused)
.submitLabel(.done)
.onSubmit {
self.isFocused = false
}
}
.toolbar {
ToolbarItem(placement: .topBarLeading) {
Button("Cancel") { dismiss() }
}
}
}
}
}
View Model:
final class TestTextInputViewModel: ObservableObject {
@Published var name: String = ""
deinit {
print("TestViewModel - deinit - \(Unmanaged.passUnretained(self).toOpaque())")
}
init() {
print("TestViewModel - init - \(Unmanaged.passUnretained(self).toOpaque())")
}
}
Topic:
UI Frameworks
SubTopic:
SwiftUI
Hello developers,
atm im developing a small app focused on hiking. A core pice of the app is a Map() from MapKit. I only want a few points of interest to be visible on the map (e.g. no stores, no clubs etc.).
My question now is what modifier includes mountain Peaks? I tried .rockClimbing, .nationalPark, .landmark, .skiing & .hiking. However none of them makes mountain Peaks visible on the map.
The complete code would be:
Map()
.mapStyle(.standard(pointsOfInterest: .including([.rockClimbing, .nationalPark, .landmark, .skiing, .hiking])))
I noticed that I cannot even tell that an NSBox is being used on macOS Tahoe when the system is in light mode. The 'box' background can't be seen so it makes it appear that the subviews in the box aren't positioned correctly (because they are inset from the subview outside the box). There is no visual indicator that that subviews inside this box are grouped together because well, you can't see the box at all.
In Interface Builder the box looks fine at Design Time in "Light Mode". In Dark Mode the box looks fine at design time and at run time.
Just figured I'd throw that out there.
Hello!
I’m building my Swift Student Challenge project in Swift Playgrounds, and I’ve run into an issue with app orientation.
Since this is a game, the layout and interactions only work correctly in landscape, but Playgrounds doesn’t offer the usual orientation settings you’d configure in Xcode.
Is there a recommended way to force a landscape-only experience in Swift Playgrounds using SwiftUI? Any workarounds or guidance would be greatly appreciated!
Thank you!
Topic:
UI Frameworks
SubTopic:
SwiftUI
Tags:
Swift Student Challenge
Swift Playground
Playground Support
SwiftUI
I have attached 2 images of our Mac Apps user interface. The app is built for macOS 15.6 or newer.
On macOS 15 and earlier everything looks fine. But the same App running on macOS 26 the controls disappear. We were able to temporarily resolve the problem by adding UIDesignRequiresCompatibility to the info.plist.
This type of nonsense happens all over the app without the compatibility switch. Shouldn't all these legacy controls be backward compatible on Glass?
This part of the app where the controls are disappearing is built in Swift (not swift ui) and uses standard programatic layout and visual constraints.
On macOS 26, there are no Xcode warnings or layout errors on the console relative to the layout so we are confused as to how we would resolve this without the use of UIDesignRequiresCompatibility.
Is this some kind of bug in NSControl glass compatibility? We are not likely to move the entire app into SwiftUI anytime soon. How would we resolve this?
I have a SwiftUI app that needs to present a fullScreenCover when the user opens a deep link.
This screen must appear above anything currently shown — even if another fullScreenCover is already being presented.
In UIKit, I can achieve this by walking the view controller hierarchy, finding the top-most view controller, and presenting the new full-screen view from there.
What is the recommended way to reproduce this behavior in SwiftUI?
How can I ensure a fullScreenCover is always shown above the current presentation layer, regardless of the app’s UI state?
Topic:
UI Frameworks
SubTopic:
SwiftUI
问题场景:
Xcode26+iOS26系统,UICollectionView的reloadData不会触发调用UICollectionViewCell的layoutSubviews方法。
正常场景:
Xcode26+iOS18及以下系统,UICollectionView的reloadData能够触发调用UICollectionViewCell的layoutSubviews方法。
UITableView的reloadData,会正常调用UITableViewCell的layoutSubviews方法。
We have implemented live activities with broadcast notification using channels. It has been working without a problem for the last 6-8 months. Now we want to upgrade it by starting the channel based live activity via push notification. Whenever I try locally with development channels there isnt any problem regarding to starting live activity.
When we go production on Testflight or App Store it doesn't work after first successful push even though user enters the app and send the new push to start token to our server and we are using the latest token we receive. We couldn't go further with debugging since it works perfectly fine the client when tried locally and we know we can send successful pushes as well since the metrics shows 12% success but we do not actually know what happened to remaining 88%. Every apns request return success with 200 and empty body. How can we further debug this issue. Or is this a common problem, if so, is there any possible solution to this.
As far as we see, token goes to our server so we have the latest token all the time and this whole logic doesn't work without deleting and reinstalling the app.
So I noticed this:
A sheet window is presented.
The sheet window has some UI that makes it expandable say a little arrow expandable button.
Click the little expandable button. Now the sheet window controller calls - (void)setFrame:display:animate: on its window to resize.
The parent window flies across the screen to the lower left corner.
I'm on Tahoe 26.1. Seems to be related to NSSheetMoveHelper. Not sure how long this bug has been around. Workaround is to call -setFrame:display:animate: and pass NO to the animate flag. Then the sheet window resizes (but not animated which doesn't look as good as the old behavior but better than suddenly disappearing).
I think Apple may already knows about this bug b/c in an Apple app on Tahoe I see a sheet resizing being done with no animation...
Filed https://feedbackassistant.apple.com/feedback/21260457
When a SwiftUI app uses both a DocumentGroupLaunchScene and a TabView (no matter how trivial) in its Content view, it hangs on 26.1 (both simulator and device), with high CPU utilization in
-[UIView(CALayerDelegate) layoutSublayersOfLayer:]
and memory usage increasing rapidly. This did not happen in 26.0
Topic:
UI Frameworks
SubTopic:
SwiftUI
Structs are value types, and the SwiftUI gets reinitialized many times throughout its lifecycle. Whenever it gets reinitialized, would the reference that the delegator has of it still work if the View uses @State or @StateObject that hold a persistent reference to the views data?
protocol MyDelegate: AnyObject {
func didDoSomething()
}
class Delegator {
weak var delegate: MyDelegate?
func trigger() {
delegate?.didDoSomething()
}
}
struct ContentView: View, MyDelegate {
private let delegator = Delegator()
@State counter = 1
var body: some View {
VStack {
Text("\(counter)")
Button("Trigger") {
delegator.trigger()
}
}
}
func didDoSomething() {
counter += 1 //would this call update the counter in the view even if the view's instance is copied over to the delegator?
}
}
Our app has a UITabBar and the compactInlineLayoutAppearance has a custom font set. This worked fine on iOS 26.0 and 26.1.
[self.bottomTabBar.standardAppearance.compactInlineLayoutAppearance.normal setTitleTextAttributes: @{
NSFontAttributeName:[UIFont fontWithName:@"AvenirNext-DemiBold" size:18.0]
}];
But on iOS 26.2, the system ignores this custom font. How can I apply a custom font to a UITabBar on iOS 26.2?
I'm trying to add a confirmationDialog to an app, so that the user can select an option from a menu that comes up from the bottom of the screen. This works perfectly for an iOS 18 simulator, but the behavior changes when the simulator is running iOS 26.1.
Is this the intended behavior of .confirmationDialog in iOS 26.1?
crash stack:
Crashed: com.apple.main-thread
0 libsystem_pthread.dylib 0x90c thread_chkstk_darwin + 60
1 libsystem_pthread.dylib 0x90c ___chkstk_darwin + 60
2 CoreAutoLayout 0x14c4 -[NSISEngine _flushPendingRemovals] + 56
3 CoreAutoLayout 0x2de08 -[NSISEngine _coreReplaceMarker:withMarkerPlusDelta:].cold.1 + 64
4 CoreAutoLayout 0x15d78 -[NSISEngine _coreReplaceMarker:withMarkerPlusDelta:] + 204
5 CoreAutoLayout 0x2ce38 -[NSISEngine constraintDidChangeSuchThatMarker:shouldBeReplacedByMarkerPlusDelta:] + 108
6 CoreAutoLayout 0x15f1c -[NSISEngine tryToChangeConstraintSuchThatMarker:isReplacedByMarkerPlusDelta:undoHandler:] + 100
7 CoreAutoLayout 0x2fdbc -[NSLayoutConstraint _tryToChangeContainerGeometryWithUndoHandler:] + 252
8 CoreAutoLayout 0x3020c -[NSLayoutConstraint _setSymbolicConstant:constant:symbolicConstantMultiplier:] + 452
9 CoreAutoLayout 0x30378 -[NSLayoutConstraint setConstant:] + 84
10 UIKitCore 0x51c3c __74-[UIView(UIConstraintBasedLayout) _autoresizingConstraints_frameDidChange]_block_invoke + 140
11 UIKitCore 0x1841174 -[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 112
12 UIKitCore 0x51b28 -[UIView(UIConstraintBasedLayout) _autoresizingConstraints_frameDidChange] + 452
13 UIKitCore 0x2c894 -[UIView _constraints_frameDidChange] + 100
14 UIKitCore 0x18fac08 -[UIView(Geometry) setFrame:] + 576
15 UIKitCore 0x96712c -[UITabBar setFrame:] + 128
16 UIKitCore 0x1666f4 -[_UITabBarControllerVisualStyle updateTabBarLayout] + 360
17 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
18 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
19 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
20 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
21 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
22 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
23 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
24 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
25 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
26 UIKitCore 0x16671c -[_UITabBarControllerVisualStyle updateTabBarLayout] + 400
27 UIKitCore 0x16642c -[UITabBarController _prepareTabBar] + 128
28 UIKitCore 0x166a10 -[UITabBarController _layoutContainerView] + 376
29 UIKitCore 0x1677a8 -[UITabBarController __viewWillLayoutSubviews] + 28
30 UIKitCore 0x147078 -[UILayoutContainerView layoutSubviews] + 176
31 UIKit 0xb14a0 -[UILayoutContainerViewAccessibility layoutSubviews] + 60
for a more detail crash stack, can see attach file:
crash.txt
crash probabilistic happed after app enter background, and our app support landscape, when crash appear, the system method:
/*
This method is called when the view controller's view's size is changed by its parent (i.e. for the root view controller when its window rotates or is resized).
If you override this method, you should either call super to propagate the change to children or manually forward the change to children.
*/
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator API_AVAILABLE(ios(8.0));
is called;
but for a normal not crash case, when enter background and rotate device, the viewWillTransitionToSize method is not called until app enter foreground;
Are there any suggestions that can help solve this problem, thank you.
I’m trying to understand the expected behavior of TabView when using .tabViewStyle(.page) on iPadOS with a hardware keyboard.
When I place a TabView in page mode, swipe gestures correctly move between pages. However, left and right arrow keys do nothing by default, even when the view is made focusable. This feels a bit surprising, since paging with arrow keys seems like a natural keyboard interaction when a keyboard is attached.
Right now, to get arrow-key navigation working, I have to manually:
Make the view focusable
Listen for arrow key presses
Update the selection state manually
This works, but it feels a little tedious for something that seems like it could be built-in.
import SwiftUI
struct PageTabsExample: View {
@State private var selection = 0
private let pageCount = 3
var body: some View {
TabView(selection: $selection) {
Color.red.tag(0)
Color.blue.tag(1)
Color.green.tag(2)
}
.tabViewStyle(.page)
.indexViewStyle(.page)
.focusable(true)
.onKeyPress(.leftArrow) {
guard selection > 0 else { return .ignored }
selection -= 1
return .handled
}
.onKeyPress(.rightArrow) {
guard selection < pageCount - 1 else { return .ignored }
selection += 1
return .handled
}
}
}
My questions:
Is this lack of default keyboard paging for page-style TabView intentional on iPadOS with a hardware keyboard?
Is there a built-in way to enable arrow-key navigation for page-style TabView, or is manual handling the expected approach?
Does my approach above look like the “SwiftUI-correct” way to do this, or is there a better pattern for integrating keyboard navigation with paging?
For this kind of behavior, is it generally recommended to use .onKeyPress like I’m doing here, or would .keyboardShortcut be more appropriate (for example, wiring arrow keys to actions instead)?
Any guidance or clarification would be greatly appreciated. I just want to make sure I’m not missing a simpler or more idiomatic solution.
Thanks!
I'm creating an app and I want the user to see the PNG image with the background removed in the widget, but I want the background to be transparent. I've seen this done before in some apps' CarPlay widgets. How can I do this?
When adding buttons to a sheet, on tvOS the text is blurred in the buttons, making it illegible. Feedback: FB21228496
(used GPT to extract an example from my project for a test project to attach here)
// ButtonBlurTestView.swift
// Icarus
//
// Test view to reproduce blurred button issue on tvOS
//
import SwiftUI
struct ButtonBlurTestView: View {
@State private var showSheet = false
@State private var selectedTags: [Int] = []
@State private var newTagName: String = ""
// Hardcoded test data
private let testTags = [
TestTag(id: 1, label: "Action"),
TestTag(id: 2, label: "Comedy"),
TestTag(id: 3, label: "Drama"),
TestTag(id: 4, label: "Sci-Fi"),
TestTag(id: 5, label: "Thriller")
]
var body: some View {
NavigationStack {
VStack {
Text("Button Blur Test")
.font(.title)
.padding()
Button("Show Test Sheet") {
showSheet = true
}
.buttonStyle(.borderedProminent)
.padding()
Text("Tap the button above to open a sheet with buttons inside a Form.")
.font(.caption)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding()
}
.navigationTitle("Blur Test")
.sheet(isPresented: $showSheet) {
TestSheetView(
selectedTags: $selectedTags,
newTagName: $newTagName,
testTags: testTags
)
}
}
}
}
struct TestSheetView: View {
@Environment(\.dismiss) private var dismiss
@Binding var selectedTags: [Int]
@Binding var newTagName: String
let testTags: [TestTag]
var body: some View {
NavigationStack {
VStack {
// Header
VStack {
Text("Testing")
.font(.title2)
.bold()
Text("Test TV Show")
.font(.subheadline)
.foregroundColor(.secondary)
}
.padding()
// Form with buttons
Form {
Section(header: Text("Summary")) {
Text("This is a test")
.font(.subheadline)
.foregroundColor(.secondary)
}
Section(header: Text("Tags")) {
tagsSelectionView
}
}
}
.navigationTitle("Add")
#if !os(tvOS)
.navigationBarTitleDisplayMode(.inline)
#endif
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Cancel") { dismiss() }
}
ToolbarItem(placement: .confirmationAction) {
Button("Add") { dismiss() }
}
}
}
}
private var tagsSelectionView: some View {
VStack(alignment: .leading) {
// Tag pills in a grid
let columns = [GridItem(.adaptive(minimum: 80), spacing: 8)]
LazyVGrid(columns: columns, alignment: .leading, spacing: 8) {
ForEach(testTags, id: \.id) { tag in
TagPill(
tag: tag,
selected: selectedTags.contains(tag.id)
) {
if selectedTags.contains(tag.id) {
selectedTags.removeAll { $0 == tag.id }
} else {
selectedTags.append(tag.id)
}
}
}
}
Divider()
// Add new tag button
HStack {
TextField("New tag name", text: $newTagName)
#if os(tvOS)
.textFieldStyle(PlainTextFieldStyle())
#else
.textFieldStyle(RoundedBorderTextFieldStyle())
#endif
Button("Add") {
// Test action
newTagName = ""
}
.disabled(newTagName.trimmingCharacters(in: .whitespaces).isEmpty)
}
}
}
}
// Tag Pill - matches the structure from original project
private struct TagPill: View {
let tag: TestTag
let selected: Bool
let action: () -> Void
var body: some View {
Button(action: action) {
Text(tag.label)
.font(.callout)
.lineLimit(1)
.padding(.horizontal, 12)
.padding(.vertical, 8)
.background(
Capsule()
.fill(selected ? Color.accentColor : Color.secondary.opacity(0.15))
)
.overlay(
Capsule()
.stroke(selected ? Color.accentColor : Color.secondary.opacity(0.35), lineWidth: 1)
)
.foregroundStyle(selected ? Color.white : Color.primary)
.contentShape(Capsule())
}
.buttonStyle(.plain)
#if os(tvOS)
.focusable(true)
#endif
}
}
struct TestTag {
let id: Int
let label: String
}
#Preview {
ButtonBlurTestView()
}
In my UITableViewController when a sticky section header is replaced by the following header in succession, the cell below is revealed for a short time. This looks like a glitch to me. Is there a workaround to solve this?
The issue is best explained in video: https://youtube.com/shorts/JIEbFTTIDjA?feature=share