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

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
145
Jun ’25
Slideshow / Gallery / Photos app View
How can I create a view that is like the one in the Photos app where you can select an item and it fills the window, then you can drag / swipe between items in that view? I have a working prototype, and it works for photos. But once I get to a video, the gesture no longer works.
2
0
79
Jun ’25
Specific ARKit node not showing in AR
After two types of objects correctly inserted as nodes in an augmented reality setting, I replicated exactly the same procedure with a third kind of objects that unfortunately refuse to show up. I checked the flow and it is the same as the other objects as well the content of the LocationAnnotation, but there is surely something that escapes me. Could someone help with some ideas? This is the common code, apart of the class: func appendInAR(ghostElement: Ghost){ let ghostElementAnnotationLocation=GhostLocationAnnotationNode(ghost: ghostElement) ghostElementAnnotationLocation.scaleRelativeToDistance = true sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: ghostElementAnnotationLocation) shownGhostsAnnotations.append(ghostElementAnnotationLocation) }
9
0
191
Jun ’25
How can I have a view cover the status bar?
I've been researching everywhere I can, and I have found nothing. I am trying to find a way so that my alert that occurs within my app can drop down but cover the status bar elements (wifi, time, etc). I'm at a loss and was curious if anyone knew how.
Topic: UI Frameworks SubTopic: SwiftUI
1
0
126
Jun ’25
Is configuration-style API (like UIButton.configuration) available for other UIKit or AppKit components?
In UIKit, UIButton provides a configuration property which allows us to create and customize a UIButton.Configuration instance independently (on a background thread or elsewhere) and later assign it to a UIButton instance. This separation of configuration and assignment is very useful for clean architecture and performance optimization. Questions: Is this configuration-style pattern (creating a configuration object separately and assigning it later) available or planned for other UIKit components such as UILabel, UITextField, UISlider, etc.? Similarly, in AppKit on macOS, are there any components (e.g. NSButton, NSTextField) that support a comparable configuration object mechanism that can be used the same way — constructed separately and assigned to the view later? This would help in building consistent configuration-driven UI frameworks across Apple platforms. Any insight or official guidance would be appreciated.
0
0
111
Jun ’25
EKRecurrenceRule `until date` ignored or lost when event start date is in the future
Hi, I'm facing an issue with EKEventStore and recurring events using EKRecurrenceRule. When I create a repeat event with an until date using EKRecurrenceEnd(end:), the until date is not retained correctly if the event's start date is in the present or future. Scenario: If I create a recurring event where the start date is in the past, the until date appears correctly when I fetch the event later. But when the event starts in the present or future, the until date is missing (i.e. recurrenceEnd?.endDate becomes nil). Environment: macOS Version: 15.4.1 Tested on Mac app using EKEventStore Is this a known EventKit behavior or a bug? Would appreciate any insights or workaround recommendations. Thanks!
Topic: UI Frameworks SubTopic: AppKit
0
0
65
Jun ’25
iOS18.1以降でのアプリレイアウト崩れに関して
iOS18.0以前では発生していなかったアプリのレイアウト崩れが発生しており、これはOS起因のバグなのか否かをご教示いただきたいです。 【事象】 iOS18.0以前では発生していなかった、右上に表示していたアイコンが真ん中に来ているといったアプリのレイアウト崩れが発生しております。 【原因調査】 ソースを確認したところ、 親要素のCSS内にあるui-btn-textのdisplayが、上記事象が発生しているOS(現在で確認できているのは18.4.1と18.5)だと 「display: block」もしくは「display: inline-block」となっていない場合横幅がない状態として判定されています。 その為「position:absolute」かつ、「right: XXpx」という指定を行った場合、iOS18.0以前では親要素の右端から「XXpx」ずれた位置に配置される形となりますが、事象が発生しているOSでは(横幅が0として判定されるため)親要素の左端から「XXpx」ずれた位置に配置される形となっております。 【質問】 これはOS起因のバグなのか仕様変更なのか確認いただきたいです。
Topic: UI Frameworks SubTopic: General
0
0
116
Jun ’25
SwiftData .deny deleteRule not working
I tried to use the .deny deleteRule but it seems to have no effect. The toolbar button adds an item with a relationship to a category to the context. Swiping on the category deletes the category even though an item is referencing the category. There is also no error thrown when saving the context. It is as if the deleteRule was not there. For other deleteRules like .cascade, the provided sample code works as expected. import SwiftUI import SwiftData @Model class Category { var name: String @Relationship(deleteRule: .deny) var items: [Item] = [] init(name: String) { self.name = name } } @Model class Item { var name: String var category: Category? init(name: String, category: Category) { self.name = name self.category = category } } struct DenyDeleteRule: View { @Environment(\.modelContext) private var modelContext @Query private var categories: [Category] @Query private var items: [Item] var body: some View { List { Section("Items") { ForEach(items) { item in Text(item.name) } } Section("Categories") { ForEach(categories) { category in VStack(alignment: .leading) { Text(category.name).bold() ForEach(category.items) { item in Text("• \(item.name)") } } } .onDelete(perform: deleteCategory) } } .toolbar { Button("Add Sample") { let category = Category(name: "Sample") let item = Item(name: "Test Item", category: category) modelContext.insert(item) } } } func deleteCategory(at offsets: IndexSet) { for index in offsets { let category = categories[index] modelContext.delete(category) do { try modelContext.save() } catch { print(error) } } } } #Preview { NavigationStack { DenyDeleteRule() } .modelContainer(for: [Item.self, Category.self], inMemory: true) }
1
0
115
Jun ’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
87
Jun ’25
New WebView (Xcode 26 beta) doesn't resize when NavigationSplitView sidebar appears
I'm using the new Swifty WebView in 26.0 beta (17A5241e). Previously, I would wrap WKWebView in a ViewRepresentable and place it in the detail area of a NavigationSplitView. The page content correctly shrunk when the sidebar was opened. Now, the page content takes up the full width of the NavigationSplitView and the sidebar hovers over the page content with a translucent effect. This is in spite of setting .navigationSplitViewStyle(.balanced). Code below. I believe this is a problem with the new WebView not respecting size hints from parent views in the hierarchy. This is because if I replace the WebView with a centered Text view, it shifts over correctly when the sidebar is opened. struct OccludingNavSplitView: View { var body: some View { NavigationSplitView { Text("Sidebar") } detail: { WebView(url: URL(string: "https://www.google.com")!) } .navigationSplitViewStyle(.balanced) } } #Preview("Occluding sidebar") { OccludingNavSplitView() }
2
0
149
Jun ’25
macOS UIApplication not in scope
I'm trying to disable the sleep timer when a button is pressed in my macOS app but the problem is that from the resources I've seen elsewhere the code doesn't work. The code I'm trying is UIApplication.shared.isIdleTimerDisabled = true When I try and run my app I get this error Cannot find 'UIApplication' in scope From what I've managed to search for regarding this it appears that UIApplication might be an iOS thing, but how can I adapt this for macOS? I've found some code samples from 5+ years ago but it involves lots of code. Surely, in 2025 macOS can disable sleep mode as easy as iOS, right? How can I achieve this please?
Topic: UI Frameworks SubTopic: General Tags:
1
0
174
Jun ’25
Updating sort order of items in a LazyVGrid
I have a grid setup where I'm displaying multiple images which is working fine. Images are ordered by the date they're added, newest to oldest. I'm trying to set it up so that the user can change the sort order themselves but am having trouble getting the view to update. I'm setting the fetch request using oldest to newest as default when initialising the view, then when its appears updating the sort descriptor struct ProjectImagesListView: View { @Environment(\.managedObjectContext) private var viewContext var project : Project let columns = [ GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()) ] @FetchRequest var pictures: FetchedResults<Picture> var body: some View { ScrollView { LazyVGrid(columns: columns) { ForEach(pictures) { picture in NavigationLink(destination: ProjectImageDetailView(picture: picture)) { if let pictureData = picture.pictureThumbnailData, let uiImage = UIImage(data: pictureData) { Image(uiImage: uiImage) .resizable() .scaledToFit() .frame(height: 100) } else { Image("missing") .resizable() .scaledToFit() .frame(height: 100) } } } } } .navigationBarTitle("\(project.name ?? "") Images", displayMode: .inline) .onAppear() { guard let sortOrder = getSettingForPhotoOrder() else { return } guard let sortOrderValue = sortOrder.settingValue else { return } NSLog("sortOrderPhotos: \(String(describing: sortOrder.settingValue))") if sortOrderValue == "Newest" { NSLog("sortOrderPhotos: Change from default") let newSortDescriptor = NSSortDescriptor(keyPath: \Picture.dateTaken, ascending: false) pictures.nsSortDescriptors = [newSortDescriptor] } } } func getSettingForPhotoOrder() -> Setting? { let fetchRequest: NSFetchRequest<Setting> = Setting.fetchRequest() fetchRequest.predicate = NSPredicate(format: "name = %@", "photoSortOrder") fetchRequest.fetchLimit = 1 do { let results = try viewContext.fetch(fetchRequest) return results.first } catch { print("Fetching Failed") } return nil } init(project: Project) { self.project = project _pictures = FetchRequest( entity: Picture.entity(), sortDescriptors: [ NSSortDescriptor(keyPath: \Picture.dateTaken, ascending: true) ], predicate: NSPredicate(format: "project == %@", project) ) } }
Topic: UI Frameworks SubTopic: SwiftUI
0
0
93
May ’25
How to read a value when tapping a point on a Chart3D
Hi. Chart3D seems to be perfect to visualize a chart on one of my apps. However I would need a way to read the point of a SurfacePlot of a Chart3D that was touched by the user? Something like a Chart .chartOverlay that has a ChartProxy that can convert screen coordinates of the chart in values, but in 3D (maybe using hit testing ). Thanks and best regards. João Colaço
2
0
145
Jun ’25
Scroll offset incorrectly resets when animating insertion of ScrollView using .geometryGroup()
Hey, I've been having a problem with scroll views in combination with the .geometryGroup() modifier. I have filed a Feedback (FB17698293) but I also wanted to post this here in case someone maybe has a better workaround for the problem. Problem Whenever you conditionally insert a ScrollView inside a VStack that is modified with a .geometryGroup() modifier, the scroll view content offset resets itself after the insertion animation is done, even if you started scrolling inside the scroll view during the animation and haven't let go of the screen. This happens consistently and is fully reproducible (see below), both using a simulator and a real device. Unfortunately, this is a very annoying glitch that ruins a lot of cool UX components that rely on .geometryGroup(). The weird thing is that the glitch entirely disappears, if you add a simple, non-zero (but greater than 1) .padding() modifier to the VStack (.padding().geometryGroup()). I have no idea why this fixes the glitch, but it does. However, adding a padding is not feasible in many situations, so this workaround is not ideal. Steps to reproduce Launch the code below (using a simulator or a real device) and tap "Toggle Expansion" to insert the scroll view. As the view is animating in, drag the scroll content and hold it scrolled away from the top. Wait for the animation to complete. The scroll view will reset the content offset, even though the drag gesture is still active (i.e. you haven't lifted your finger to release the scroll view) On a real device, this sometimes even leads to an even worse visual artifact where the scroll view is rendered twice for a few frames; once with the correct offset, and once with the reset offset. I wanted to include a link to a gif/video showing the glitch, but it tells me that imgur is not allowed on the forums. Expected Behavior I want the scroll view to respect the content offset, even if I started changing it mid-animation. Xcode Version I am using Xcode 16.4 (16F6) but this problem has been occurring since the .geometryGroup() modifier has been release. I was only now able to pinpoint this problem exactly, so I'm filing this feedback. Code The entire code that reproduces the problem: import SwiftUI struct ContentView: View { @State private var isExpanded: Bool = false var body: some View { VStack { if isExpanded { ScrollView { Text(loremIpsum) } } Button("Toggle Expansion") { isExpanded.toggle() } } // .padding(10) // Adding a non-zero padding makes the glitch disappear .frame(maxWidth: .infinity) .geometryGroup() .animation(.default, value: isExpanded) } } #Preview { ContentView().preferredColorScheme(.dark) } // MARK: - Mock Data let loremIpsum = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt \ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco \ laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ mollit anim id est laborum. """
Topic: UI Frameworks SubTopic: SwiftUI
0
0
150
May ’25
Recently used applications on guardian phone - FamilyControls, DeviceActivityReport
For an iOS app that runs in both child and parent mode across iOS devices. On the child device, with Family Controls enabled using .child permissions via AuthorizationCenter.requestAuthorization(for: .child). Is any way to display a list of recently used apps by the child on the parent (guardian) device, in a privacy-preserving and Apple-compliant way?
1
0
182
May ’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
145
Activity
Jun ’25
Highlight the model not with the eyes, but by clicking a button
Hello, we have a requirement where clicking a button will highlight the model, similar to the effect seen by the eyes. However, the eyes do not see it and it is achieved by clicking a button. What should we do? Thank you for your reply
Replies
0
Boosts
0
Views
144
Activity
Jun ’25
Slideshow / Gallery / Photos app View
How can I create a view that is like the one in the Photos app where you can select an item and it fills the window, then you can drag / swipe between items in that view? I have a working prototype, and it works for photos. But once I get to a video, the gesture no longer works.
Replies
2
Boosts
0
Views
79
Activity
Jun ’25
Specific ARKit node not showing in AR
After two types of objects correctly inserted as nodes in an augmented reality setting, I replicated exactly the same procedure with a third kind of objects that unfortunately refuse to show up. I checked the flow and it is the same as the other objects as well the content of the LocationAnnotation, but there is surely something that escapes me. Could someone help with some ideas? This is the common code, apart of the class: func appendInAR(ghostElement: Ghost){ let ghostElementAnnotationLocation=GhostLocationAnnotationNode(ghost: ghostElement) ghostElementAnnotationLocation.scaleRelativeToDistance = true sceneLocationView.addLocationNodeWithConfirmedLocation(locationNode: ghostElementAnnotationLocation) shownGhostsAnnotations.append(ghostElementAnnotationLocation) }
Replies
9
Boosts
0
Views
191
Activity
Jun ’25
How can I have a view cover the status bar?
I've been researching everywhere I can, and I have found nothing. I am trying to find a way so that my alert that occurs within my app can drop down but cover the status bar elements (wifi, time, etc). I'm at a loss and was curious if anyone knew how.
Topic: UI Frameworks SubTopic: SwiftUI
Replies
1
Boosts
0
Views
126
Activity
Jun ’25
Is configuration-style API (like UIButton.configuration) available for other UIKit or AppKit components?
In UIKit, UIButton provides a configuration property which allows us to create and customize a UIButton.Configuration instance independently (on a background thread or elsewhere) and later assign it to a UIButton instance. This separation of configuration and assignment is very useful for clean architecture and performance optimization. Questions: Is this configuration-style pattern (creating a configuration object separately and assigning it later) available or planned for other UIKit components such as UILabel, UITextField, UISlider, etc.? Similarly, in AppKit on macOS, are there any components (e.g. NSButton, NSTextField) that support a comparable configuration object mechanism that can be used the same way — constructed separately and assigned to the view later? This would help in building consistent configuration-driven UI frameworks across Apple platforms. Any insight or official guidance would be appreciated.
Replies
0
Boosts
0
Views
111
Activity
Jun ’25
EKRecurrenceRule `until date` ignored or lost when event start date is in the future
Hi, I'm facing an issue with EKEventStore and recurring events using EKRecurrenceRule. When I create a repeat event with an until date using EKRecurrenceEnd(end:), the until date is not retained correctly if the event's start date is in the present or future. Scenario: If I create a recurring event where the start date is in the past, the until date appears correctly when I fetch the event later. But when the event starts in the present or future, the until date is missing (i.e. recurrenceEnd?.endDate becomes nil). Environment: macOS Version: 15.4.1 Tested on Mac app using EKEventStore Is this a known EventKit behavior or a bug? Would appreciate any insights or workaround recommendations. Thanks!
Topic: UI Frameworks SubTopic: AppKit
Replies
0
Boosts
0
Views
65
Activity
Jun ’25
Using Camera in ASWebAuthenticationSession
Is is possible to use the camera in ASWebAuthenticationSession? We want to support signing in with a QR Code in our custom OAuth flow but the browser can't seem to access the camera.
Topic: UI Frameworks SubTopic: General
Replies
0
Boosts
0
Views
98
Activity
May ’25
iOS18.1以降でのアプリレイアウト崩れに関して
iOS18.0以前では発生していなかったアプリのレイアウト崩れが発生しており、これはOS起因のバグなのか否かをご教示いただきたいです。 【事象】 iOS18.0以前では発生していなかった、右上に表示していたアイコンが真ん中に来ているといったアプリのレイアウト崩れが発生しております。 【原因調査】 ソースを確認したところ、 親要素のCSS内にあるui-btn-textのdisplayが、上記事象が発生しているOS(現在で確認できているのは18.4.1と18.5)だと 「display: block」もしくは「display: inline-block」となっていない場合横幅がない状態として判定されています。 その為「position:absolute」かつ、「right: XXpx」という指定を行った場合、iOS18.0以前では親要素の右端から「XXpx」ずれた位置に配置される形となりますが、事象が発生しているOSでは(横幅が0として判定されるため)親要素の左端から「XXpx」ずれた位置に配置される形となっております。 【質問】 これはOS起因のバグなのか仕様変更なのか確認いただきたいです。
Topic: UI Frameworks SubTopic: General
Replies
0
Boosts
0
Views
116
Activity
Jun ’25
Advanced App Clip experience URL Status
Hello Team, We have Advanced App Clip Experiences live but we have add App Clip experience URL since long ago but status remains as Received and never changed to Published, can you please help us to fix this issue. Please see attached. Thanks
Replies
6
Boosts
0
Views
1.6k
Activity
Jun ’25
applicationWillEnterForeground not getting called
Something func applicationWillEnterForeground is not getting called for specific iOS 18.3.2
Topic: UI Frameworks SubTopic: UIKit
Replies
0
Boosts
0
Views
61
Activity
May ’25
SwiftData .deny deleteRule not working
I tried to use the .deny deleteRule but it seems to have no effect. The toolbar button adds an item with a relationship to a category to the context. Swiping on the category deletes the category even though an item is referencing the category. There is also no error thrown when saving the context. It is as if the deleteRule was not there. For other deleteRules like .cascade, the provided sample code works as expected. import SwiftUI import SwiftData @Model class Category { var name: String @Relationship(deleteRule: .deny) var items: [Item] = [] init(name: String) { self.name = name } } @Model class Item { var name: String var category: Category? init(name: String, category: Category) { self.name = name self.category = category } } struct DenyDeleteRule: View { @Environment(\.modelContext) private var modelContext @Query private var categories: [Category] @Query private var items: [Item] var body: some View { List { Section("Items") { ForEach(items) { item in Text(item.name) } } Section("Categories") { ForEach(categories) { category in VStack(alignment: .leading) { Text(category.name).bold() ForEach(category.items) { item in Text("• \(item.name)") } } } .onDelete(perform: deleteCategory) } } .toolbar { Button("Add Sample") { let category = Category(name: "Sample") let item = Item(name: "Test Item", category: category) modelContext.insert(item) } } } func deleteCategory(at offsets: IndexSet) { for index in offsets { let category = categories[index] modelContext.delete(category) do { try modelContext.save() } catch { print(error) } } } } #Preview { NavigationStack { DenyDeleteRule() } .modelContainer(for: [Item.self, Category.self], inMemory: true) }
Replies
1
Boosts
0
Views
115
Activity
Jun ’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
87
Activity
Jun ’25
New WebView (Xcode 26 beta) doesn't resize when NavigationSplitView sidebar appears
I'm using the new Swifty WebView in 26.0 beta (17A5241e). Previously, I would wrap WKWebView in a ViewRepresentable and place it in the detail area of a NavigationSplitView. The page content correctly shrunk when the sidebar was opened. Now, the page content takes up the full width of the NavigationSplitView and the sidebar hovers over the page content with a translucent effect. This is in spite of setting .navigationSplitViewStyle(.balanced). Code below. I believe this is a problem with the new WebView not respecting size hints from parent views in the hierarchy. This is because if I replace the WebView with a centered Text view, it shifts over correctly when the sidebar is opened. struct OccludingNavSplitView: View { var body: some View { NavigationSplitView { Text("Sidebar") } detail: { WebView(url: URL(string: "https://www.google.com")!) } .navigationSplitViewStyle(.balanced) } } #Preview("Occluding sidebar") { OccludingNavSplitView() }
Replies
2
Boosts
0
Views
149
Activity
Jun ’25
macOS UIApplication not in scope
I'm trying to disable the sleep timer when a button is pressed in my macOS app but the problem is that from the resources I've seen elsewhere the code doesn't work. The code I'm trying is UIApplication.shared.isIdleTimerDisabled = true When I try and run my app I get this error Cannot find 'UIApplication' in scope From what I've managed to search for regarding this it appears that UIApplication might be an iOS thing, but how can I adapt this for macOS? I've found some code samples from 5+ years ago but it involves lots of code. Surely, in 2025 macOS can disable sleep mode as easy as iOS, right? How can I achieve this please?
Topic: UI Frameworks SubTopic: General Tags:
Replies
1
Boosts
0
Views
174
Activity
Jun ’25
Updating sort order of items in a LazyVGrid
I have a grid setup where I'm displaying multiple images which is working fine. Images are ordered by the date they're added, newest to oldest. I'm trying to set it up so that the user can change the sort order themselves but am having trouble getting the view to update. I'm setting the fetch request using oldest to newest as default when initialising the view, then when its appears updating the sort descriptor struct ProjectImagesListView: View { @Environment(\.managedObjectContext) private var viewContext var project : Project let columns = [ GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()), GridItem(.flexible()) ] @FetchRequest var pictures: FetchedResults<Picture> var body: some View { ScrollView { LazyVGrid(columns: columns) { ForEach(pictures) { picture in NavigationLink(destination: ProjectImageDetailView(picture: picture)) { if let pictureData = picture.pictureThumbnailData, let uiImage = UIImage(data: pictureData) { Image(uiImage: uiImage) .resizable() .scaledToFit() .frame(height: 100) } else { Image("missing") .resizable() .scaledToFit() .frame(height: 100) } } } } } .navigationBarTitle("\(project.name ?? "") Images", displayMode: .inline) .onAppear() { guard let sortOrder = getSettingForPhotoOrder() else { return } guard let sortOrderValue = sortOrder.settingValue else { return } NSLog("sortOrderPhotos: \(String(describing: sortOrder.settingValue))") if sortOrderValue == "Newest" { NSLog("sortOrderPhotos: Change from default") let newSortDescriptor = NSSortDescriptor(keyPath: \Picture.dateTaken, ascending: false) pictures.nsSortDescriptors = [newSortDescriptor] } } } func getSettingForPhotoOrder() -> Setting? { let fetchRequest: NSFetchRequest<Setting> = Setting.fetchRequest() fetchRequest.predicate = NSPredicate(format: "name = %@", "photoSortOrder") fetchRequest.fetchLimit = 1 do { let results = try viewContext.fetch(fetchRequest) return results.first } catch { print("Fetching Failed") } return nil } init(project: Project) { self.project = project _pictures = FetchRequest( entity: Picture.entity(), sortDescriptors: [ NSSortDescriptor(keyPath: \Picture.dateTaken, ascending: true) ], predicate: NSPredicate(format: "project == %@", project) ) } }
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
93
Activity
May ’25
How to read a value when tapping a point on a Chart3D
Hi. Chart3D seems to be perfect to visualize a chart on one of my apps. However I would need a way to read the point of a SurfacePlot of a Chart3D that was touched by the user? Something like a Chart .chartOverlay that has a ChartProxy that can convert screen coordinates of the chart in values, but in 3D (maybe using hit testing ). Thanks and best regards. João Colaço
Replies
2
Boosts
0
Views
145
Activity
Jun ’25
Scroll offset incorrectly resets when animating insertion of ScrollView using .geometryGroup()
Hey, I've been having a problem with scroll views in combination with the .geometryGroup() modifier. I have filed a Feedback (FB17698293) but I also wanted to post this here in case someone maybe has a better workaround for the problem. Problem Whenever you conditionally insert a ScrollView inside a VStack that is modified with a .geometryGroup() modifier, the scroll view content offset resets itself after the insertion animation is done, even if you started scrolling inside the scroll view during the animation and haven't let go of the screen. This happens consistently and is fully reproducible (see below), both using a simulator and a real device. Unfortunately, this is a very annoying glitch that ruins a lot of cool UX components that rely on .geometryGroup(). The weird thing is that the glitch entirely disappears, if you add a simple, non-zero (but greater than 1) .padding() modifier to the VStack (.padding().geometryGroup()). I have no idea why this fixes the glitch, but it does. However, adding a padding is not feasible in many situations, so this workaround is not ideal. Steps to reproduce Launch the code below (using a simulator or a real device) and tap "Toggle Expansion" to insert the scroll view. As the view is animating in, drag the scroll content and hold it scrolled away from the top. Wait for the animation to complete. The scroll view will reset the content offset, even though the drag gesture is still active (i.e. you haven't lifted your finger to release the scroll view) On a real device, this sometimes even leads to an even worse visual artifact where the scroll view is rendered twice for a few frames; once with the correct offset, and once with the reset offset. I wanted to include a link to a gif/video showing the glitch, but it tells me that imgur is not allowed on the forums. Expected Behavior I want the scroll view to respect the content offset, even if I started changing it mid-animation. Xcode Version I am using Xcode 16.4 (16F6) but this problem has been occurring since the .geometryGroup() modifier has been release. I was only now able to pinpoint this problem exactly, so I'm filing this feedback. Code The entire code that reproduces the problem: import SwiftUI struct ContentView: View { @State private var isExpanded: Bool = false var body: some View { VStack { if isExpanded { ScrollView { Text(loremIpsum) } } Button("Toggle Expansion") { isExpanded.toggle() } } // .padding(10) // Adding a non-zero padding makes the glitch disappear .frame(maxWidth: .infinity) .geometryGroup() .animation(.default, value: isExpanded) } } #Preview { ContentView().preferredColorScheme(.dark) } // MARK: - Mock Data let loremIpsum = """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt \ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco \ laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla \ pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt \ mollit anim id est laborum. """
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
150
Activity
May ’25
A document-based app with NavigationSplitView shows duplicate file navigation controls on iPad
A document-based app with NavigationSplitView shows duplicate file navigation controls on iPad. This can be easily replicated by creating a multiplatform app in Xcode. The template app shows this behaviour when running on iPad. This looks very much like a bug.
Replies
4
Boosts
0
Views
131
Activity
Jun ’25
Recently used applications on guardian phone - FamilyControls, DeviceActivityReport
For an iOS app that runs in both child and parent mode across iOS devices. On the child device, with Family Controls enabled using .child permissions via AuthorizationCenter.requestAuthorization(for: .child). Is any way to display a list of recently used apps by the child on the parent (guardian) device, in a privacy-preserving and Apple-compliant way?
Replies
1
Boosts
0
Views
182
Activity
May ’25