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.

All subtopics
Posts under UI Frameworks topic

Post

Replies

Boosts

Views

Activity

iOS26: onDrag of SwiftUI won't be called in specific cases.
There is no issue with triggering onDrag when long-pressing for the first time. However, if the user releases their finger and the DropDelegate determines this is not a valid drop operation, it will not trigger a view update. In this case, when the user long-presses the same view again, the onDrag method will not be triggered even though the floating Preview view is already displayed under the finger. The problem will not recur if the DropDelegate updates the view (such as swapping the positions of views). The same code works without issues on iOS 18. The problem can be reproduced with simple code like the following: struct ContentView: View { var body: some View { Rectangle() .fill(.blue) .onDrag { print("OnDrag") return NSItemProvider() } } } The "OnDrag" log will only be output once.
0
0
62
Sep ’25
Designed-for-iPad apps on macOS: Print sheet fails to appear
Summary: When running our iPad app on macOS (“Designed for iPad”), invoking UIPrintInteractionController intermittently fails to show a working print sheet. The same code works reliably on iPad or iOS devices and also on macOS pre 26. This regression started after updating to macOS Tahoe Version 26.0 (25A354) Steps to Reproduce: Launch the attached minimal sample on macOS (Designed for iPad). Tap “Print plain text” Expected Results: The print panel should appear and discover AirPrint printers reliably, as on iPad/iOS or previous mac versions. Actual Results: On macOS, the panel fails to appear. Mac version: macOS Tahoe 26.0 (25A354) xCode version: 26.0 (17A324) Sample Reproduction Code: struct ContentView: View { var body: some View { Button("Print plain text") { printPlainText() } .buttonStyle(.borderedProminent) .padding() } func printPlainText() { let text = "This is just a sample print" guard UIPrintInteractionController.isPrintingAvailable else { NSLog("Printing not available on this device") return } let info = UIPrintInfo(dictionary: nil) info.outputType = .general info.jobName = "Plain Text" let formatter = UISimpleTextPrintFormatter(text: text) formatter.perPageContentInsets = UIEdgeInsets(top: 36, left: 36, bottom: 36, right: 36) let ctrl = UIPrintInteractionController.shared ctrl.printInfo = info ctrl.printFormatter = formatter DispatchQueue.main.async { ctrl.present(animated: true) { _, completed, error in if let error { NSLog("Print error: \(error.localizedDescription)") } else { NSLog(completed ? "Print completed" : "Print cancelled") } } } } } Also I have added the following values to info.plist: <key>NSLocalNetworkUsageDescription</key> <string>This app needs local network access to discover AirPrint printers.</string> <key>NSBonjourServices</key> <array> <string>_ipp._tcp.</string> <string>_ipps._tcp.</string> <string>_printer._tcp.</string> </array>
0
0
191
Sep ’25
ScrollView + LazyVStack buggy animation. Fixable?
The below code will render a list of items and a button to shuffle them and change their height withAnimation. If you scroll down and shuffle it you will eventually see glitches in the animation, mostly consisting of ghost items animating on top of other items and disappearing. Does anyone know why this is happening, and how to stop it happening? The issue goes away entirely if I use a VStack, but using a VStack brings its own problems. import SwiftUI struct Item: Identifiable { let id = UUID() var height: CGFloat var label: String } struct ContentView: View { @State private var items: [Item] = (0..<30).map { i in Item(height: .random(in: 80...220), label: "Row \(i)") } var body: some View { NavigationStack { ScrollView { LazyVStack(spacing: 8) { ForEach(items) { item in Text(item.label) .frame(maxWidth: .infinity) .frame(height: item.height) .background(.gray.opacity(0.15)) .clipShape(RoundedRectangle(cornerRadius: 12)) .padding(.horizontal) } } .padding(.vertical) } .navigationTitle("LazyVStack Demo") .toolbar { ToolbarItem(placement: .topBarTrailing) { Button("Shuffle") { withAnimation() { items.shuffle() for i in items.indices { items[i].height = .random(in: 80...220) } } } } } } } } #Preview { ContentView() }
0
0
86
Sep ’25
SwiftUI Glyphs clipped, how do I show the entire glyph?
This code: import SwiftUI struct heightProblem: View { var body: some View { Text("\u{1D15E} \u{1D15F} \u{1D160} \u{1D161} \u{1D162} \u{1D163} \u{1D164}") .font(Font.largeTitle.bold()) .frame(height: 50.0) .border(.red) .padding() .border(.green) } } #Preview { heightProblem() } Produces this display: Note the clipping. Lowering the baseline by about 20 brings it into view, but this is a horrible fix for dynamic display (The font is Noto, which works just fine in Xcode, but not in Safari for some reason.)
0
0
124
Sep ’25
SwiftUI crash on OSX 26 using NSColorPanel
Crashlog-0916-071225.log I have an app that crashes on OSX 26 only. I have a @StateObject which is an observer of the NSColorPanel. When I call let panel = NSColorPanel.shared in init(), SwiftUI will crash - apparently with an update while view is being updated. See crash log. I was able to work around it by adding let _ = NSColorPanel.shared in my AppDelegate before SwiftUI is initialized. The exact code worked fine in all previous OSX versions.
0
0
112
Sep ’25
SwiftUI's `WebPage` back navigation not working as expected
I'm currently testing SwiftUI's WebKit by building a browsing application. For the back navigation, I have the following code implemented: if let item = webPage.backForwardList.backList.last { webPage.load(item) print( """ ===== backForwardList.backList: \(webPage.backForwardList.backList) --- backForwardList.currentItem: \(webPage.backForwardList.currentItem) --- backForwardList.forwardList: \(webPage.backForwardList.forwardList) ===== """.trimmingCharacters(in: .whitespacesAndNewlines) ) } When I look at the logs, it shows that whenever I navigate back, the currentItem is updated with the item, but the backList is appended with the previous currentItem, and the forwardList is always empty. Am I implementing this incorrectly? Thanks in advance!
0
0
125
Sep ’25
Inconsistent button image scaling between dynamic type sizes 'XXX Large' and 'AX 1'
[Also submitted as FB20262774. Posting here in hopes of saving someone else from burning half a day chasing this down.] Dynamic scaling of an Image() in a Button(), incorrectly decreases when transitioning from XXX Large to AX 1 accessibility text sizes, instead of continuing to grow as expected. This occurs both on device and in the simulator, in iOS 18.6 and iOS 26. Repro Steps Create a project with sample code below Show the preview if not showing In Xcode Preview, click Canvas Device Settings and change Dynamic Type from XXX Large to AX 1 Sample Code struct ContentView: View { var body: some View { VStack(spacing: 30) { Text("Button Image Scaling Issue") .font(.system(size: 24, weight: .semibold)) Text("Switch dynamic type from **XXX Large** to **AX 1**. The **Button** icon shrinks while the **No Button** icon grows.") .font(.system(size: 14, weight: .regular)) TestView(title: "No Button", isButton: false) TestView(title: "Button", isButton: true) } .padding() } } struct TestView: View { let title: String let isButton: Bool var body: some View { VStack { Text(title) .font(.system(size: 16)) .foregroundColor(.secondary) if isButton { Button {} label: { Image(systemName: "divide") .font(.system(.largeTitle)) } .buttonStyle(.bordered) .frame(height: 50) } else { Image(systemName: "divide") .font(.system(.largeTitle)) .foregroundColor(.blue) .frame(height: 50) .background(Color.gray.opacity(0.2)) } } } } Expected Result Both the button and non-button images should continue to scale up proportionally when moving to larger accessibility text sizes. Actual Result When going from XXX Large to AX 1… Non-button image gets larger ✅ Button image gets smaller ❌ Screen Recording System Info Xcode Version 26.0 (17A321) iOS 26.0 and 18.6
0
0
193
Sep ’25
Cannot render ScrollView + VStack + ScrollPosition correctly scrolled initially
The following code works properly, ensuring the list is scrolled at the correct ID when first rendered: import SwiftUI struct DataItem: Identifiable { let id: Int let height: CGFloat init(id: Int) { self.id = id self.height = CGFloat.random(in: 100...300) } } struct ContentView: View { @State private var items = (0..<1000).map { DataItem(id: $0) } @State private var scrollPosition: ScrollPosition init() { let mid = 500 _scrollPosition = State(initialValue: .init(id: mid, anchor: .center)) } var body: some View { ScrollView { LazyVStack(spacing: 8) { ForEach(items) { item in Text("Item \(item.id)") .frame(height: item.height) .frame(maxWidth: .infinity) .background(.gray) } } .scrollTargetLayout() } .scrollPosition($scrollPosition, anchor: .center) } } However, if I change this to use VStack this ceases to work - the list begins rendered at the top of the list. The only way I can render it starting at the correct position is using side effects like onAppear or task, where I would update the scroll position. I have observed the following behavior on my iPhone 15 Pro/iOS 26. Is this a bug?
Topic: UI Frameworks SubTopic: SwiftUI
0
0
62
Sep ’25
How to disable scrollToTop when clicking on selected tab
I currently have a SwiftUI TabView that has 5 Tab's. The first tab has a UIScrollView in a UIViewRepresentible with scrollView.scrollsToTop = false and that works fine for when the user hits the navigation bar, however if the user taps the first tab when it is already selected my UIScrollView scrolls to top. My UIScrollView is essentially 5 views, a center view, top, bottom, right, and left view. All views except for the center are offscreen but available for the user to scroll horizontal or vertical (and the respective views get updated based on the new center view). The issue I have is that clicking the first tab when its already selected, sets the content offset (for the y axis) to 0, which messes me up 2x, first it scrolls up but since its not really scrolling the right, left, and upper views dont exist, which makes the user think it can't be scrolled or it's broken. For now I subclassed UIScrollView like this class NoScrollToTopScrollView: UIScrollView { override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) { if contentOffset.y == .zero { // Ignore SwiftUI’s re-tap scroll-to-top return } super.setContentOffset(contentOffset, animated: animated) } } which seems to work, but I'm just wondering if there is a better way to do this, or maybe a way to disable SwiftUI Tab from doing its default action which can help with a SwiftUI ScrollView as well?
0
0
129
Sep ’25
Matching launch image with with background image
The document-based SwiftUI example app (https://developer.apple.com/documentation/swiftui/building-a-document-based-app-with-swiftui) doesn't specify a launch image. It would seem per the HIG that the "pinkJungle" background in the app would be a decent candidate for a launch image, since it will be in the background when the document browser comes up. However when specifying it as the UIImageName, it is not aligned the same as the background image. I'm having trouble figuring out how it should be aligned to match the image. The launch image seems to be scaled up a bit over scaledToFill. I suppose a launch storyboard might make this more explicit, but I still should be able to do it without one. This is the image when displayed as the launch image: and this is how it's rendered in the background right before the document browser comes up:
0
0
53
Nov ’25
SwiftUI incorrectly instantiating navigation destination with new identity when navigation stack is removed
There is an issue with SwiftUI where it is incorrectly instantiating the navigation destination view with a new identity for a navigation stack that is being removed. Here is a minimal reproducible example: struct ContentView: View { @State private var signedIn = false var body: some View { if signedIn { navigationStack(isSignedIn: true) } else { navigationStack(isSignedIn: false) } } private func navigationStack(isSignedIn: Bool) -> some View { NavigationStack(path: .constant(NavigationPath([1]))) { EmptyView() .navigationDestination(for: Int.self) { _ in VStack { Text(isSignedIn ? "Signed In" : "Signed Out") .foregroundStyle(Color.red) Button(isSignedIn ? "Sign Out" : "Sign In") { signedIn = !isSignedIn } } .onFirstAppear { print(isSignedIn ? "signed in" : "signed out") } } } } } struct OnFirstAppearView: ViewModifier { @State private var hasAppeared = false var onAppear: () -> Void func body(content: Content) -> some View { content .onAppear { if hasAppeared { return } hasAppeared = true onAppear() } } } extension View { func onFirstAppear(_ onAppear: @escaping () -> Void) -> some View { ModifiedContent(content: self, modifier: OnFirstAppearView(onAppear: onAppear)) } } When you launch the app it will print "signed out", but when you tap to Sign In it will print "signed out" and "signed in". This shows that onAppear is incorrectly being called for a view that is disappearing and worse yet, it is with a new identity. The onFirstAppear modifier was created to help with detecting the identity change of the view. Tested on Xcode 16.4, on simulator using iOS 18.5 and also on physical device using iOS 18.5. Link to Feedback sent on Feedback Assistant: https://feedbackassistant.apple.com/feedback/18336684
0
0
82
Jun ’25
.preferredColorScheme doesn't work with .scrollEdgeEffectStyle(.hard, for: .top)
.preferredColorScheme(.dark) doesn't seem to affect app toolbar, when .scrollEdgeEffectStyle(.hard, for: .top) is used. In the attachment, you can see the title and toolbar items don't change according to current value of .preferredColorScheme (you may need to scroll a bit to achieve it) iOS 26 RC Feedback ID - FB19769073 import SwiftUI struct ContentView: View { var body: some View { NavigationStack { ScrollView(.vertical) { ForEach(0..<100) { index in Text("\(index)") .padding() .border(.blue) .background(.blue) .frame(maxWidth: .infinity) } } .scrollEdgeEffectStyle(.hard, for: .top) .navigationTitle("Test Title") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button(action: { }) { Text("Test") } } } } .preferredColorScheme(.dark) } } #Preview { ContentView() }
0
0
107
Sep ’25
Symbol not found error when using writingToolsBehavior API built with Xcode 26 and run on iOS 18
When using the writingToolsBehavior API on a TextField and the app compiled with the iOS 26 SDK is run on an iOS 18 device, the app crashes with a symbol not found error. It only crashes on the release build configuration and not on debug. dyld[5274]: Symbol not found: _$s7SwiftUI17EnvironmentValuesV21_writingToolsBehaviorAA07WritingfG0VSgvg Referenced from: <1306655E-6DF7-3B2A-94A3-7202149E82F3> /private/var/containers/Bundle/Application/88E47904-4884-4279-9E96-0EC366970389/WritingToolsTest.app/WritingToolsTest Expected in: <165D3305-401E-37C2-8387-C1BFB54CFFDE> /System/Library/Frameworks/SwiftUI.framework/SwiftUI Feedback ID: FB17980516
0
0
129
Jun ’25
.safeAreaBar doesn't look good together with .searchable
When using .scrollEdgeEffectStyle(.hard, for: .top), search bar background doesn't match with . safeAreaBar view background (you can see that is is darker than the rest of the toolbar). Please find the screenshot in the attachment iOS 26 RC Light Mode Feedback ID - FB19768159 import SwiftUI struct ContentView: View { @State private var count = 0 var body: some View { NavigationStack { ScrollView(.vertical) { ForEach(0..<100) { index in Text("\(index)") .background(.red) } } .scrollEdgeEffectStyle(.hard, for: .top) .searchable( text: .constant(""), placement: .navigationBarDrawer(displayMode: .always) ) .safeAreaBar(edge: .top) { Text("Safe area bar") } } } } #Preview { ContentView() }
0
0
109
Sep ’25
The sidebar toggle of the NavigationSplitView disappears when used with a .inspector modifier on iPadOS 26
If the NavigationSplitView on iPadOS 26 is combined with a .inspector column, the sidebarToggle is always hidden, when the sidebar is collapsed. If you remove the .inspector modifier, the sidebarToggle stays visible throughout the collapsed or expanded state. Has maybe someone a workaround for this issue? The problem does not exist in iOS 18. The bug is reported as FB20061260
0
1
79
Sep ’25
Encountered an issue when adding a highlight effect to an image with rounded corners.
When I display 2/3 of the poster on tvos, after setting it according to the code, some semi-transparent background can be seen in the upper left and right corners of the image when it is in focus. How can I eliminate it? struct HighPosterView: View { let media: MediaDetail @State private var isShowingDetails = false @Environment(\.isFocused) private var isFocused: Bool var body: some View { Button { isShowingDetails.toggle() } label: { HighShelfImageView(imageURL: media.posterURL) .contentShape(RoundedRectangle(cornerRadius: 24, style: .continuous)) .hoverEffect(.highlight) Text(media.displayTitle) .lineLimit(1) .font(.subheadline) .frame(maxWidth: 300) } .buttonStyle(.borderless) .animation(.smooth) } } struct HighShelfImageView: View { let imageURL: URL? var body: some View { KFImage.url(imageURL) .targetCache(ImageCacheManager.shelfCache) .setProcessor(ImageCacheManager.mediaListShelfProcessor) .placeholder { Color.primary.opacity(0.1) .cornerRadius(Constants.cornerRadius) } .cancelOnDisappear(true) .cacheMemoryOnly(false) .fade(duration: 0.1) .cacheOriginalImage(true) .resizable() .aspectRatio(2/3, contentMode: .fill) .clipShape(RoundedRectangle(cornerRadius: Constants.cornerRadius)) } } I need to keep the image and text distributed vertically, keep customize corner, with the text pushed aside when the image is in focus.
0
0
182
Sep ’25
SwiftUI List optional refreshable
Currently refreshable modifier does not support nil as a value and there's no way of disabling refreshable without recreating the whole view. There are a few posts showing how refreshable could be optionally disabled on scrollViews using: \EnvironmentValues.refresh as? WritableKeyPath<EnvironmentValues, RefreshAction?> https://stackoverflow.com/a/77587703 However, this approach doesn't seem to work with Lists. Has anyone find any solutions for this?
0
0
172
Sep ’25
Bug: Black Pixel Flicker When Using glassEffect() with Animation
When using .glassEffect(.clear, in: .circle) with animation in a View, there is a chance that black pixel blocks flash on the screen. The abnormal effect can be seen in the attached video and screenshots.FB20216507 Code is as follows: VStack { if isLoaded { VStack { if #available(macOS 26.0, *) { Color.clear .frame(maxWidth: .infinity, maxHeight: .infinity) .glassEffect(.clear, in: .circle) } } .transition(.asymmetric(insertion: .scale, removal: .opacity)) } } .animation(.bouncy, value: isLoaded)
Topic: UI Frameworks SubTopic: SwiftUI
0
0
158
Sep ’25
iOS26: onDrag of SwiftUI won't be called in specific cases.
There is no issue with triggering onDrag when long-pressing for the first time. However, if the user releases their finger and the DropDelegate determines this is not a valid drop operation, it will not trigger a view update. In this case, when the user long-presses the same view again, the onDrag method will not be triggered even though the floating Preview view is already displayed under the finger. The problem will not recur if the DropDelegate updates the view (such as swapping the positions of views). The same code works without issues on iOS 18. The problem can be reproduced with simple code like the following: struct ContentView: View { var body: some View { Rectangle() .fill(.blue) .onDrag { print("OnDrag") return NSItemProvider() } } } The "OnDrag" log will only be output once.
Replies
0
Boosts
0
Views
62
Activity
Sep ’25
Designed-for-iPad apps on macOS: Print sheet fails to appear
Summary: When running our iPad app on macOS (“Designed for iPad”), invoking UIPrintInteractionController intermittently fails to show a working print sheet. The same code works reliably on iPad or iOS devices and also on macOS pre 26. This regression started after updating to macOS Tahoe Version 26.0 (25A354) Steps to Reproduce: Launch the attached minimal sample on macOS (Designed for iPad). Tap “Print plain text” Expected Results: The print panel should appear and discover AirPrint printers reliably, as on iPad/iOS or previous mac versions. Actual Results: On macOS, the panel fails to appear. Mac version: macOS Tahoe 26.0 (25A354) xCode version: 26.0 (17A324) Sample Reproduction Code: struct ContentView: View { var body: some View { Button("Print plain text") { printPlainText() } .buttonStyle(.borderedProminent) .padding() } func printPlainText() { let text = "This is just a sample print" guard UIPrintInteractionController.isPrintingAvailable else { NSLog("Printing not available on this device") return } let info = UIPrintInfo(dictionary: nil) info.outputType = .general info.jobName = "Plain Text" let formatter = UISimpleTextPrintFormatter(text: text) formatter.perPageContentInsets = UIEdgeInsets(top: 36, left: 36, bottom: 36, right: 36) let ctrl = UIPrintInteractionController.shared ctrl.printInfo = info ctrl.printFormatter = formatter DispatchQueue.main.async { ctrl.present(animated: true) { _, completed, error in if let error { NSLog("Print error: \(error.localizedDescription)") } else { NSLog(completed ? "Print completed" : "Print cancelled") } } } } } Also I have added the following values to info.plist: <key>NSLocalNetworkUsageDescription</key> <string>This app needs local network access to discover AirPrint printers.</string> <key>NSBonjourServices</key> <array> <string>_ipp._tcp.</string> <string>_ipps._tcp.</string> <string>_printer._tcp.</string> </array>
Replies
0
Boosts
0
Views
191
Activity
Sep ’25
ScrollView + LazyVStack buggy animation. Fixable?
The below code will render a list of items and a button to shuffle them and change their height withAnimation. If you scroll down and shuffle it you will eventually see glitches in the animation, mostly consisting of ghost items animating on top of other items and disappearing. Does anyone know why this is happening, and how to stop it happening? The issue goes away entirely if I use a VStack, but using a VStack brings its own problems. import SwiftUI struct Item: Identifiable { let id = UUID() var height: CGFloat var label: String } struct ContentView: View { @State private var items: [Item] = (0..<30).map { i in Item(height: .random(in: 80...220), label: "Row \(i)") } var body: some View { NavigationStack { ScrollView { LazyVStack(spacing: 8) { ForEach(items) { item in Text(item.label) .frame(maxWidth: .infinity) .frame(height: item.height) .background(.gray.opacity(0.15)) .clipShape(RoundedRectangle(cornerRadius: 12)) .padding(.horizontal) } } .padding(.vertical) } .navigationTitle("LazyVStack Demo") .toolbar { ToolbarItem(placement: .topBarTrailing) { Button("Shuffle") { withAnimation() { items.shuffle() for i in items.indices { items[i].height = .random(in: 80...220) } } } } } } } } #Preview { ContentView() }
Replies
0
Boosts
0
Views
86
Activity
Sep ’25
SwiftUI Glyphs clipped, how do I show the entire glyph?
This code: import SwiftUI struct heightProblem: View { var body: some View { Text("\u{1D15E} \u{1D15F} \u{1D160} \u{1D161} \u{1D162} \u{1D163} \u{1D164}") .font(Font.largeTitle.bold()) .frame(height: 50.0) .border(.red) .padding() .border(.green) } } #Preview { heightProblem() } Produces this display: Note the clipping. Lowering the baseline by about 20 brings it into view, but this is a horrible fix for dynamic display (The font is Noto, which works just fine in Xcode, but not in Safari for some reason.)
Replies
0
Boosts
0
Views
124
Activity
Sep ’25
SwiftUI crash on OSX 26 using NSColorPanel
Crashlog-0916-071225.log I have an app that crashes on OSX 26 only. I have a @StateObject which is an observer of the NSColorPanel. When I call let panel = NSColorPanel.shared in init(), SwiftUI will crash - apparently with an update while view is being updated. See crash log. I was able to work around it by adding let _ = NSColorPanel.shared in my AppDelegate before SwiftUI is initialized. The exact code worked fine in all previous OSX versions.
Replies
0
Boosts
0
Views
112
Activity
Sep ’25
SwiftUI's `WebPage` back navigation not working as expected
I'm currently testing SwiftUI's WebKit by building a browsing application. For the back navigation, I have the following code implemented: if let item = webPage.backForwardList.backList.last { webPage.load(item) print( """ ===== backForwardList.backList: \(webPage.backForwardList.backList) --- backForwardList.currentItem: \(webPage.backForwardList.currentItem) --- backForwardList.forwardList: \(webPage.backForwardList.forwardList) ===== """.trimmingCharacters(in: .whitespacesAndNewlines) ) } When I look at the logs, it shows that whenever I navigate back, the currentItem is updated with the item, but the backList is appended with the previous currentItem, and the forwardList is always empty. Am I implementing this incorrectly? Thanks in advance!
Replies
0
Boosts
0
Views
125
Activity
Sep ’25
Inconsistent button image scaling between dynamic type sizes 'XXX Large' and 'AX 1'
[Also submitted as FB20262774. Posting here in hopes of saving someone else from burning half a day chasing this down.] Dynamic scaling of an Image() in a Button(), incorrectly decreases when transitioning from XXX Large to AX 1 accessibility text sizes, instead of continuing to grow as expected. This occurs both on device and in the simulator, in iOS 18.6 and iOS 26. Repro Steps Create a project with sample code below Show the preview if not showing In Xcode Preview, click Canvas Device Settings and change Dynamic Type from XXX Large to AX 1 Sample Code struct ContentView: View { var body: some View { VStack(spacing: 30) { Text("Button Image Scaling Issue") .font(.system(size: 24, weight: .semibold)) Text("Switch dynamic type from **XXX Large** to **AX 1**. The **Button** icon shrinks while the **No Button** icon grows.") .font(.system(size: 14, weight: .regular)) TestView(title: "No Button", isButton: false) TestView(title: "Button", isButton: true) } .padding() } } struct TestView: View { let title: String let isButton: Bool var body: some View { VStack { Text(title) .font(.system(size: 16)) .foregroundColor(.secondary) if isButton { Button {} label: { Image(systemName: "divide") .font(.system(.largeTitle)) } .buttonStyle(.bordered) .frame(height: 50) } else { Image(systemName: "divide") .font(.system(.largeTitle)) .foregroundColor(.blue) .frame(height: 50) .background(Color.gray.opacity(0.2)) } } } } Expected Result Both the button and non-button images should continue to scale up proportionally when moving to larger accessibility text sizes. Actual Result When going from XXX Large to AX 1… Non-button image gets larger ✅ Button image gets smaller ❌ Screen Recording System Info Xcode Version 26.0 (17A321) iOS 26.0 and 18.6
Replies
0
Boosts
0
Views
193
Activity
Sep ’25
Cannot render ScrollView + VStack + ScrollPosition correctly scrolled initially
The following code works properly, ensuring the list is scrolled at the correct ID when first rendered: import SwiftUI struct DataItem: Identifiable { let id: Int let height: CGFloat init(id: Int) { self.id = id self.height = CGFloat.random(in: 100...300) } } struct ContentView: View { @State private var items = (0..<1000).map { DataItem(id: $0) } @State private var scrollPosition: ScrollPosition init() { let mid = 500 _scrollPosition = State(initialValue: .init(id: mid, anchor: .center)) } var body: some View { ScrollView { LazyVStack(spacing: 8) { ForEach(items) { item in Text("Item \(item.id)") .frame(height: item.height) .frame(maxWidth: .infinity) .background(.gray) } } .scrollTargetLayout() } .scrollPosition($scrollPosition, anchor: .center) } } However, if I change this to use VStack this ceases to work - the list begins rendered at the top of the list. The only way I can render it starting at the correct position is using side effects like onAppear or task, where I would update the scroll position. I have observed the following behavior on my iPhone 15 Pro/iOS 26. Is this a bug?
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
62
Activity
Sep ’25
Liquid glass questions
I'm still unable to achieve the effects as shown. The tinting of the buttons in a .toolbar. The iOS Beta 2 shows in Mail show at can be done. The creation of a true clear glass container as use extensively in iOS26.
Replies
0
Boosts
1
Views
296
Activity
Jun ’25
How to disable scrollToTop when clicking on selected tab
I currently have a SwiftUI TabView that has 5 Tab's. The first tab has a UIScrollView in a UIViewRepresentible with scrollView.scrollsToTop = false and that works fine for when the user hits the navigation bar, however if the user taps the first tab when it is already selected my UIScrollView scrolls to top. My UIScrollView is essentially 5 views, a center view, top, bottom, right, and left view. All views except for the center are offscreen but available for the user to scroll horizontal or vertical (and the respective views get updated based on the new center view). The issue I have is that clicking the first tab when its already selected, sets the content offset (for the y axis) to 0, which messes me up 2x, first it scrolls up but since its not really scrolling the right, left, and upper views dont exist, which makes the user think it can't be scrolled or it's broken. For now I subclassed UIScrollView like this class NoScrollToTopScrollView: UIScrollView { override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) { if contentOffset.y == .zero { // Ignore SwiftUI’s re-tap scroll-to-top return } super.setContentOffset(contentOffset, animated: animated) } } which seems to work, but I'm just wondering if there is a better way to do this, or maybe a way to disable SwiftUI Tab from doing its default action which can help with a SwiftUI ScrollView as well?
Replies
0
Boosts
0
Views
129
Activity
Sep ’25
Sections in LazyVStack jump/flicker on scroll
ScrollView(.vertical) { LazyVStack { ForEach(0..<700, id: \.self) { index in Section { Text("Content \(index)") .font(.headline) .padding() } header: { Text("Section \(index)") .font(.title) .padding() } } } } iOS: 18.5, iPhone 15 Pro Max, Xcode 16.4
Replies
0
Boosts
0
Views
183
Activity
Jul ’25
Matching launch image with with background image
The document-based SwiftUI example app (https://developer.apple.com/documentation/swiftui/building-a-document-based-app-with-swiftui) doesn't specify a launch image. It would seem per the HIG that the "pinkJungle" background in the app would be a decent candidate for a launch image, since it will be in the background when the document browser comes up. However when specifying it as the UIImageName, it is not aligned the same as the background image. I'm having trouble figuring out how it should be aligned to match the image. The launch image seems to be scaled up a bit over scaledToFill. I suppose a launch storyboard might make this more explicit, but I still should be able to do it without one. This is the image when displayed as the launch image: and this is how it's rendered in the background right before the document browser comes up:
Replies
0
Boosts
0
Views
53
Activity
Nov ’25
SwiftUI incorrectly instantiating navigation destination with new identity when navigation stack is removed
There is an issue with SwiftUI where it is incorrectly instantiating the navigation destination view with a new identity for a navigation stack that is being removed. Here is a minimal reproducible example: struct ContentView: View { @State private var signedIn = false var body: some View { if signedIn { navigationStack(isSignedIn: true) } else { navigationStack(isSignedIn: false) } } private func navigationStack(isSignedIn: Bool) -> some View { NavigationStack(path: .constant(NavigationPath([1]))) { EmptyView() .navigationDestination(for: Int.self) { _ in VStack { Text(isSignedIn ? "Signed In" : "Signed Out") .foregroundStyle(Color.red) Button(isSignedIn ? "Sign Out" : "Sign In") { signedIn = !isSignedIn } } .onFirstAppear { print(isSignedIn ? "signed in" : "signed out") } } } } } struct OnFirstAppearView: ViewModifier { @State private var hasAppeared = false var onAppear: () -> Void func body(content: Content) -> some View { content .onAppear { if hasAppeared { return } hasAppeared = true onAppear() } } } extension View { func onFirstAppear(_ onAppear: @escaping () -> Void) -> some View { ModifiedContent(content: self, modifier: OnFirstAppearView(onAppear: onAppear)) } } When you launch the app it will print "signed out", but when you tap to Sign In it will print "signed out" and "signed in". This shows that onAppear is incorrectly being called for a view that is disappearing and worse yet, it is with a new identity. The onFirstAppear modifier was created to help with detecting the identity change of the view. Tested on Xcode 16.4, on simulator using iOS 18.5 and also on physical device using iOS 18.5. Link to Feedback sent on Feedback Assistant: https://feedbackassistant.apple.com/feedback/18336684
Replies
0
Boosts
0
Views
82
Activity
Jun ’25
.preferredColorScheme doesn't work with .scrollEdgeEffectStyle(.hard, for: .top)
.preferredColorScheme(.dark) doesn't seem to affect app toolbar, when .scrollEdgeEffectStyle(.hard, for: .top) is used. In the attachment, you can see the title and toolbar items don't change according to current value of .preferredColorScheme (you may need to scroll a bit to achieve it) iOS 26 RC Feedback ID - FB19769073 import SwiftUI struct ContentView: View { var body: some View { NavigationStack { ScrollView(.vertical) { ForEach(0..<100) { index in Text("\(index)") .padding() .border(.blue) .background(.blue) .frame(maxWidth: .infinity) } } .scrollEdgeEffectStyle(.hard, for: .top) .navigationTitle("Test Title") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button(action: { }) { Text("Test") } } } } .preferredColorScheme(.dark) } } #Preview { ContentView() }
Replies
0
Boosts
0
Views
107
Activity
Sep ’25
Symbol not found error when using writingToolsBehavior API built with Xcode 26 and run on iOS 18
When using the writingToolsBehavior API on a TextField and the app compiled with the iOS 26 SDK is run on an iOS 18 device, the app crashes with a symbol not found error. It only crashes on the release build configuration and not on debug. dyld[5274]: Symbol not found: _$s7SwiftUI17EnvironmentValuesV21_writingToolsBehaviorAA07WritingfG0VSgvg Referenced from: <1306655E-6DF7-3B2A-94A3-7202149E82F3> /private/var/containers/Bundle/Application/88E47904-4884-4279-9E96-0EC366970389/WritingToolsTest.app/WritingToolsTest Expected in: <165D3305-401E-37C2-8387-C1BFB54CFFDE> /System/Library/Frameworks/SwiftUI.framework/SwiftUI Feedback ID: FB17980516
Replies
0
Boosts
0
Views
129
Activity
Jun ’25
.safeAreaBar doesn't look good together with .searchable
When using .scrollEdgeEffectStyle(.hard, for: .top), search bar background doesn't match with . safeAreaBar view background (you can see that is is darker than the rest of the toolbar). Please find the screenshot in the attachment iOS 26 RC Light Mode Feedback ID - FB19768159 import SwiftUI struct ContentView: View { @State private var count = 0 var body: some View { NavigationStack { ScrollView(.vertical) { ForEach(0..<100) { index in Text("\(index)") .background(.red) } } .scrollEdgeEffectStyle(.hard, for: .top) .searchable( text: .constant(""), placement: .navigationBarDrawer(displayMode: .always) ) .safeAreaBar(edge: .top) { Text("Safe area bar") } } } } #Preview { ContentView() }
Replies
0
Boosts
0
Views
109
Activity
Sep ’25
The sidebar toggle of the NavigationSplitView disappears when used with a .inspector modifier on iPadOS 26
If the NavigationSplitView on iPadOS 26 is combined with a .inspector column, the sidebarToggle is always hidden, when the sidebar is collapsed. If you remove the .inspector modifier, the sidebarToggle stays visible throughout the collapsed or expanded state. Has maybe someone a workaround for this issue? The problem does not exist in iOS 18. The bug is reported as FB20061260
Replies
0
Boosts
1
Views
79
Activity
Sep ’25
Encountered an issue when adding a highlight effect to an image with rounded corners.
When I display 2/3 of the poster on tvos, after setting it according to the code, some semi-transparent background can be seen in the upper left and right corners of the image when it is in focus. How can I eliminate it? struct HighPosterView: View { let media: MediaDetail @State private var isShowingDetails = false @Environment(\.isFocused) private var isFocused: Bool var body: some View { Button { isShowingDetails.toggle() } label: { HighShelfImageView(imageURL: media.posterURL) .contentShape(RoundedRectangle(cornerRadius: 24, style: .continuous)) .hoverEffect(.highlight) Text(media.displayTitle) .lineLimit(1) .font(.subheadline) .frame(maxWidth: 300) } .buttonStyle(.borderless) .animation(.smooth) } } struct HighShelfImageView: View { let imageURL: URL? var body: some View { KFImage.url(imageURL) .targetCache(ImageCacheManager.shelfCache) .setProcessor(ImageCacheManager.mediaListShelfProcessor) .placeholder { Color.primary.opacity(0.1) .cornerRadius(Constants.cornerRadius) } .cancelOnDisappear(true) .cacheMemoryOnly(false) .fade(duration: 0.1) .cacheOriginalImage(true) .resizable() .aspectRatio(2/3, contentMode: .fill) .clipShape(RoundedRectangle(cornerRadius: Constants.cornerRadius)) } } I need to keep the image and text distributed vertically, keep customize corner, with the text pushed aside when the image is in focus.
Replies
0
Boosts
0
Views
182
Activity
Sep ’25
SwiftUI List optional refreshable
Currently refreshable modifier does not support nil as a value and there's no way of disabling refreshable without recreating the whole view. There are a few posts showing how refreshable could be optionally disabled on scrollViews using: \EnvironmentValues.refresh as? WritableKeyPath<EnvironmentValues, RefreshAction?> https://stackoverflow.com/a/77587703 However, this approach doesn't seem to work with Lists. Has anyone find any solutions for this?
Replies
0
Boosts
0
Views
172
Activity
Sep ’25
Bug: Black Pixel Flicker When Using glassEffect() with Animation
When using .glassEffect(.clear, in: .circle) with animation in a View, there is a chance that black pixel blocks flash on the screen. The abnormal effect can be seen in the attached video and screenshots.FB20216507 Code is as follows: VStack { if isLoaded { VStack { if #available(macOS 26.0, *) { Color.clear .frame(maxWidth: .infinity, maxHeight: .infinity) .glassEffect(.clear, in: .circle) } } .transition(.asymmetric(insertion: .scale, removal: .opacity)) } } .animation(.bouncy, value: isLoaded)
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
158
Activity
Sep ’25