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

Animating UIHostingController size change with SwiftUI view size change
I have a UIKit app with a UIHostingController embedded as a child controller. In this UIHostingController there's a SwiftUI view which expands and collapses with an animation to show/hide content within it. The hosting controller uses .intrinsicContentSize sizing option. This all works fine, and the animation of the expand/collapse looks good so far as the SwiftUI view, in a preview for example. But running the app the hosting controller doesn't animate its view's size alongside the SwiftUI view animating its size. Instead the hosting controller jumps from the correct start/end sizes without any animation. So technically although it has the right size when the SwiftUI view is expanded/collapsed, this not a nice UX as the hosting controller jumps immediately from its small size to its larger one on expanding and vice versa for collapsing while the SwiftUI contents animates nicely. I'm assuming there's somewhere I should be calling (in some form or another) a: UIView.animate(withDuration: 0.4) { hostingController.view.layoutIfNeeded() } alongside the SwiftUI animations - but I can't see any hook between my SwiftUI view .animation(value:) function and somewhere that hosting controller could jump in alongside this animation and animate its view's frame.
Topic: UI Frameworks SubTopic: SwiftUI
1
3
445
Mar ’25
How to await inside SwiftUI a #Preview?
In order to setup a preview, I need to create a Book; to do that, I need to await a function – however, one cannot await inside a Preview: import SwiftUI struct BookView: View { let book: Book var body: some View { VStack { Image(book.thumbnail, scale: 1.0, label: Text(book.title)) } } } #Preview { let url = URL(filePath: "/Users/dan/Documents/Curs confirmare RO.pdf")! // 👇 here, `createBook` should be awaited; but how? let book = createBook(for: url, of: CGSize(width: 254, height: 254), scale: 1.0) BookView(book: book) }
5
0
531
Mar ’25
Ios 18.4 AOD Bug
I recently updated my 16 pro to the latest software 18.4 developer beta. One issue i have encounter is that my always on display is not on or running in the background even tho the toggle option is ON. To fix this I have to go back to the setting and toggle the option back off and on.
Topic: UI Frameworks SubTopic: General Tags:
1
0
245
Mar ’25
how to make certain undo registrations not mark the document as edited
Hi. I thought the purpose of UndoManager.setActionIsDiscardable() was for this purpose - but the document still shows as edited. These changes like changing the zoom/viewing area should not cause the document to be considered edited - but you'd still like to be able to undo them. The documentation here https://developer.apple.com/documentation/foundation/undomanager/1415261-undoactionisdiscardable?changes=_6 even describes using it for just this purpose. If this isn't the method, how can I do this? Thanks.
Topic: UI Frameworks SubTopic: AppKit
1
0
165
Mar ’25
Widgets and App extensions
Hi, I have few questions regarding the widgets. I would like to know whether widget and app extensions are same ? This link(https://developer.apple.com/app-extensions/) says widget is type of app extension but I am not quite sure as few link in web says they are different. so need to confirm here :) Can a widget share same bundle id as the main app ? so basically can we use the same provisioning profile as the main app? If we use the same bundle id and provisioning profile, will there be any issue during the app store submission process.?
1
0
680
Mar ’25
Display Calculated Data in SwiftUI Charts ...
I am trying to discover how to display my application’s calculated Solar Information values in a chart. My application identifies a selected location in MapKit. The application identifies the location’s longitude, latitude, and current time of day. The application calculates the selected location’s NOAA [SOLAR ELEVATION], and the [SOLAR AZIMUTH] for the time of day. The application calculates the data, then stores the calculated values as a [Plist] file within my application’s Document Directory. For the moment, complete with repeated scouring of the Internet, I am not sure how to properly convert, transfer, or create a Structure, required by the chart to display the calculated values. I would like to create the chart once the calculations are complete, but I introduced a Plist to store the calculations for future use, too. The calculated values coincide with the NOAA Solar Calculations, complete to the displayed [h : m : s], whereas I also designed the application to create the [Array of Dictionary Objects] to store the calculated values for each subsequent six minute interval, until the end of the selected location’s day. The calculated values are properly appended to the [Array of Dictionary Objects] after each completed calculation, with data transfer constants. There are 240 calculations per day from [00:06:00 to 23:54:00], presented as a [STRING], complete with the [Elevation] presented as a [DOUBLE]. For example :: The application generates the following [Calculated Array of Dictionary Objects], then recreates, and appends a new Plist in the Document Directory. mySolarElevationDataArrayOfDictionaries :: [(theRequiredTimeOfDay: "00:06:00", theCalculatedElevation: -62.60301082991259), (theRequiredTimeOfDay: "00:12:00", theCalculatedElevation: -62.94818095051292), (theRequiredTimeOfDay: "00:18:00", theCalculatedElevation: -63.245198186807215), (theRequiredTimeOfDay: "00:24:00", theCalculatedElevation: -63.49236786176319), (theRequiredTimeOfDay: "00:30:00", theCalculatedElevation: -63.688223890934175), (theRequiredTimeOfDay: "00:36:00", theCalculatedElevation: -63.831564163806945), (theRequiredTimeOfDay: "00:42:00", theCalculatedElevation: -63.921486675739004), (theRequiredTimeOfDay: "00:48:00", theCalculatedElevation: -63.95741610687708), to the end of the data :: ===> (theRequiredTimeOfDay: "23:54:00", theCalculatedElevation: -60.69355458181633)] The application presents the initial data as follows :: Then presents a compass view to illustrate the results :: I modified the Chart’s [MOCK DATA] from the calculated values to test the Chart’s display in a [SwiftUI Hosting Controller]. For example :: The following Chart Mock Data in a [HourlySunElevation_MockChartData.swift] file is called by the application’s [Content View]. import Foundation struct Value { let theRequiredTimeOfDay: String let theCalculatedElevation: Double static func theSunElevationMockData() -> [Value] { return [Value(theRequiredTimeOfDay: "00:06:00", theCalculatedElevation: -62.60301082991259), Value(theRequiredTimeOfDay: "00:12:00", theCalculatedElevation: -62.94818095051292), Value(theRequiredTimeOfDay: "00:18:00", theCalculatedElevation: -63.245198186807215), Value(theRequiredTimeOfDay: "00:24:00", theCalculatedElevation: -63.49236786176319), Value(theRequiredTimeOfDay: "00:30:00", theCalculatedElevation: -63.688223890934175), Value(theRequiredTimeOfDay: "00:36:00", theCalculatedElevation: -63.831564163806945), Value(theRequiredTimeOfDay: "00:42:00", theCalculatedElevation: -63.921486675739004), Value(theRequiredTimeOfDay: "00:48:00", theCalculatedElevation: -63.95741610687708), to the end of the data :: ===> Value(theRequiredTimeOfDay: "23:54:00", theCalculatedElevation: -60.69355458181633)] The Chart illustrates the Mock Data as follows :: I also created a Struct within the [MySunElevationChart_ViewController] to try to append the calculated data, using the same logic with the Plist data transfer constants, as employed by the [Array of Dictionary Objects] :: struct ChartSolarElevationValues { var theRequiredTimeOfDay: String var theCalculatedElevation: Double // Structs have an implicit [init]. This is here for reference. init(theRequiredTimeOfDay: String, theCalculatedElevation: Double) { self.theRequiredTimeOfDay = theRequiredTimeOfDay self.theCalculatedElevation = theCalculatedElevation //mySolarElevationChartData.append(self) } // End of [init(theRequiredTimeOfDay: String, theCalculatedElevation: Double)] } // End of [struct ChartSolarElevationValues] Unfortunately, the result did not append each subsequent calculation, but continued to create the same calculation as a new distinct object :: NOTE :: I only called three calculations with the Struct test. // NOTE :: To prevent an [ERROR] at [var mySolarElevationChartData = [ChartSolarElevationValues]] since it has an init. // Therefore you must add () at the end of [var mySolarElevationChartData = [ChartSolarElevationValues]] let theData = [ChartSolarElevationValues]() //print("theData :: \(theData)\n") let someData = ChartSolarElevationValues(theRequiredTimeOfDay: TheTimeForDaySunElevation.theTheTimeForDaySunElevation, theCalculatedElevation:VerifyCityLocationSearchRequestCorrectedSolarElevation.theVerifyCityLocationSearchRequestCorrectedSolarElevation) var theData_New = theData theData_New.append(someData) print("theData_New :: \(theData_New)\n") // Prints :: theData_New :: [My_Map.ChartSolarElevationValues(theRequiredTimeOfDay: "00:06:00", theCalculatedElevation: -61.11000735370401)]] // Prints :: [theData_New :: [My_Map.ChartSolarElevationValues(theRequiredTimeOfDay: "00:12:00", theCalculatedElevation: -61.315092082911875)]] // Prints :: [theData_New :: [My_Map.ChartSolarElevationValues(theRequiredTimeOfDay: "00:18:00", theCalculatedElevation: -61.47403413313205)]] So, I am misintepreting the required coding structure to properly append the Elevation Chart, and the Azimuth Chart with the calculated data. I know something is amiss, but for the moment, I do not know how to address this issue. Your suggestions would be welcome ... :] jim_k
3
1
786
Mar ’25
Ornament buttons broken by hoverEffect clipShape
TLDR: Applying a clipShape in a hoverEffect closure is preventing taps from getting through to buttons nested within an ornament. I need to make a custom ornament menu, similar to the stock ornament available via TabView but with some visual tweaks. It displays icons, and then expands to display a label as the user hovers. Example: I've put together a piece of sample code, following guidance from WWDC docs: VStack { } .ornament(attachmentAnchor: .scene(.leading)) { VStack { ForEach(0...7, id:\.self) { index in Button(action: { print(index) // <---- This will not print }) { HStack { Text("\(index)") Text(" button") } } } } .padding(12) .glassBackgroundEffect() .hoverEffect { effect, isActive, proxy in effect .clipShape(RoundedRectangle(cornerRadius: 36) .size(width: isActive ? proxy.size.width : 72, height: proxy.size.height, anchor: .leading) ) } } } The buttons in this code cannot be interacted with, as the print statement never executes. What am I missing here? I've managed to get some weird behavior, sometimes a specific clipShape (like a circle) will allow a tap on a single button, but not others.
1
0
148
Mar ’25
Changing minimum deployment to iOS 17.0 Xcode compiler issues
I am developing an app that's near release. I changed the minimum deployment from iOS 16.X to 17.0 in order to be able to use the TipKit Framework. Making that change generated a ton of compiler warnings: .onChange(of:perform:)' was deprecated in iOS 17.0: Use onChange with a two or zero parameter action closure instead. After I fixed dozens of the warnings without issue, each subsequent attempt to fix a warning generated a compiler error: The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions. I decided to focus on just one file that had 13 different .onChange invocations. Nine were successfully converted to the new call, four were still deprecated. I tried to trace any possible source of type-check error for some of the simplest .onChange cases but nothing other than commenting out the .onChange in its entirety "fixed" the error. I tried commenting out one of the fixed/converted .onChange calls first and then fixing one of the problematic ones and that worked, no type-check error. The bottom line seems to be that I can only have nine of the new .onChange calls in that file, the other four have to be in the deprecated format or commented out. I tried upping the minimum deployment from 17.0 to 17.5 and that didn't work. I tried using a clean build folder and that also didn't work. Right now, I'm running Xcode 15.4 on Sonoma 14.7.2. I'm trying to avoid updating to the latest Xcode to avoid adding confounding variables and/or other possible issues. I am aware that for submission and release I will have to do so, I want to do it "on my terms" when everything is working properly. Any help would be appreciated.
Topic: UI Frameworks SubTopic: SwiftUI
3
0
211
Mar ’25
NSStatus Images missing in 15.4 Beta
In macOS 15.4 (24E5238a) and Xcode 16.2, the NSStatus images appear to be missing. To reproduce, add an NSImageView to a Nib or StoryBoard and set the default image to any of the NSStatus images: NSStatusAvailable, NSStatusPartiallyAvailable, etc. Instead of the expected Green, Yellow dots, no image is displayed. The same occurs when setting images programatically. Is the plan to remove these images, or is this just temporary?
Topic: UI Frameworks SubTopic: AppKit Tags:
2
0
145
Mar ’25
UIContextMenuInteraction not working if view is originally offscreen
I’m having a weird UIKit problem. I have a bunch of views in a UIScrollView and I add a UIContextMenuInteraction to all of them when the view is first loaded. Because they're in a scroll view, only some of the views are initially visible. The interaction works great for any of the views that are initially on-screen, but if I scroll to reveal new subviews, the context menu interaction has no effect for those. I used Xcode's View Debugger to confirm that my interaction is still saved in the view's interactions property, even for views that were initially off-screen and were then scrolled in. What could be happening here?
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
109
Mar ’25
Why this view modifier it's ambiguous?
To add a background to the tab content I implement the following background, nesting another modifier equal within this one. .background( .background // ERROR: Ambiguous use of 'background' .shadow(.drop( color: .primary.opacity(0.08), radius: 5, x: 5, y: 5) ) .shadow(.drop( color: .primary.opacity(0.08), radius: 5, x: -5, y: -5) ), in: .capsule )
2
0
299
Mar ’25
[tvOS] ScrollView with Text does not scroll
I'm trying to do something so seemingly basic, yet I can't get it to work and I'm flummoxed. In a basic, vanilla SwiftUI app for tvOS, embed a single Text element with a very long string (hundreds of lines) in it: struct ContentView: View { var body: some View { ScrollView(.vertical) { Text(veryLargeString) .focusable() } } } Then fire up the app on tvOS, and it will not scroll. No matter what I do. Pressing arrow keys, swiping fast with my thumb, and nothing. It will not move. Ironically, in the Xcode SwiftUI Preview window—it does scroll, so that's always a fun tease. What I do know is that the focus engine is throwing a few errors, so it's leading me to believe the issue is with how I have the focusable element attached. I'm using a combination of -UIFocusLoggingEnabled YES as well as listening for UIFocusSystem.movementDidFailNotification. Unfortunately since this is SwiftUI, the notification failure and debugging logs aren't really all that actionable. Help appreciated!
3
4
1.4k
Mar ’25
Not receive onDisappear event on the first WindowGroup
Hi, I'm working on visionOS and find I can't get onDisappear event just on the first window after app launch. It comes like that: WindowGroup(id:"WindowA"){ MyView() .onDisappear(){ print("WindowA disappear") } } WindowGroup(id:"WindowB"){ MyView() .onDisappear(){ print("WindowB disappear") } } WindowGroup(id:"WindowC"){ MyView() .onDisappear(){ print("WindowC disappear") } } When the app first launch, it will open WindowA automatically And then I open WindowB and WindowC programatically. Then I tap the close button on window bar below window. If I close WindowB/WindowC, I can receive onDisappear event If I close WindowA, I can't receive onDisappear event If I reopen WindowA after it is closed and then close it again by tap the close button below window, I can receive onDisappear event Is there any logic difference for the first window on app launch? How can I get onDisappear Event for it. I'm using Xcode 16 beta 2
5
0
1.1k
Mar ’25
ScrollView won't scroll
Hello. I have successfully created a scrollview with several buttons that stack on top of one another. But the View won't scroll. What am i doing wrong here? scrollView = UIScrollView.init(frame: CGRect.zero) &#9;&#9;&#9;&#9;scrollView.translatesAutoresizingMaskIntoConstraints = false &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;self.view.addSubview(scrollView) &#9;&#9;&#9;&#9;var leadingAnchor = self.scrollView!.topAnchor &#9;&#9;&#9;&#9;for i in 0..<20{ &#9;&#9;&#9;&#9;&#9;&#9;let t_button = UIButton.init(frame: CGRect.zero) &#9;&#9;&#9;&#9;&#9;&#9;t_button.translatesAutoresizingMaskIntoConstraints = false &#9;&#9;&#9;&#9;&#9;&#9;t_button.backgroundColor = UIColor.blue &#9;&#9;&#9;&#9;&#9;&#9;scrollView.addSubview(t_button) &#9;&#9;&#9;&#9;&#9;&#9;NSLayoutConstraint.activate([ &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;t_button.topAnchor.constraint(equalTo: leadingAnchor, constant:5.0), &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;t_button.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor), &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;t_button.heightAnchor.constraint(equalToConstant: 50.0), &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;t_button.widthAnchor.constraint(equalToConstant: 75.0) &#9;&#9;&#9;&#9;&#9;&#9;]) &#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;leadingAnchor = t_button.bottomAnchor &#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;&#9;&#9;t_button.setTitle("Button \(i)", for: .normal) &#9;&#9;&#9;&#9;&#9;&#9;t_button.addTarget(self, action: #selector(scrollViewButtonAction(_:)), for: .touchUpInside) &#9;&#9;&#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9; &#9;&#9;&#9;&#9;NSLayoutConstraint.activate([ &#9;&#9;&#9;&#9;&#9;&#9;scrollView.topAnchor.constraint(equalTo: self.titleHeader.bottomAnchor, constant: 10.0), &#9;&#9;&#9;&#9;&#9;&#9;scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), &#9;&#9;&#9;&#9;&#9;&#9;scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), &#9;&#9;&#9;&#9;&#9;&#9;scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor), &#9;&#9;&#9;&#9;])
4
0
7.5k
Mar ’25
iOS 18.4 App updates crashes the widget and the only solution is to restart the device or change the device language
App update in which there were no changes regarding the widget. Just after it updated, the widget turns black in some cases. It also appears black in the widget gallery. Removing and adding it again did not work in this case, only after an iOS restart it works fine again This is the log 2025-03-20 02:14:05.961611 +0800 Content load failed: unable to find or unarchive file for key: [com.aa.bb::com.aa.bb.widget:cc_widget:systemMedium::360.00/169.00/23.00:(null)~(null)] on no host. The session may still produce one shortly. Error: Using url file:///private/var/mobile/Containers/Data/PluginKitPlugin/51C5E4F2-6F1F-4466-A428-73C73B9CC887/SystemData/com.apple.chrono/placeholders/cc_widget/systemMedium----360.00w--169.00h--23.00r--1f--0.00t-0.00l-0.00b0.00t.chrono-timeline ... Error Domain=NSCocoaErrorDomain Code=4 "file“systemMedium----360.00w--169.00h--23.00r--1f--0.00t-0.00l-0.00b0.00t.chrono-timeline”not exist。" UserInfo={NSFilePath=/private/var/mobile/Containers/Data/PluginKitPlugin/51C5E4F2-6F1F-4466-A428-73C73B9CC887/SystemData/com.apple.chrono/placeholders/cc_widget/systemMedium----360.00w--169.00h--23.00r--1f--0.00t-0.00l-0.00b0.00t.chrono-timeline, NSUnderlyingError=0xa693d3a80 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
0
0
123
Mar ’25
Xcode 14: [Assert] UINavigationBar decoded as unlocked for UINavigationController
In Xcode 14 RC, I'm seeing this in the Console: [Assert] UINavigationBar decoded as unlocked for UINavigationController, or navigationBar delegate set up incorrectly. Inconsistent configuration may cause problems. navigationController=<MasterNavigationController: 0x135016200>, navigationBar=<UINavigationBar: 0x134f0aec0; frame = (0 20; 0 50); opaque = NO; autoresize = W; layer = <CALayer: 0x600000380be0>> delegate=0x135016200 The above message displays exactly four times immediately at app launch (top of the console) then does not repeat. MasterNavigationController is the internal class for the app's navigation controller. It is in a Storyboard, with very minimal ObjC code. I am not setting any specific size for the nav bar. I don't remember seeing this in earlier builds of Xcode, but I can't swear to it that this is new. No assertion actually fires.
Topic: UI Frameworks SubTopic: UIKit Tags:
42
23
31k
Mar ’25
Loading a DNG into CIRAWFilter and use HDR
I have DNG files that I want to open and show as EDR content in my app. It seems like the DNG files should have enough per pixel information to show more colors that Display P3 but whenever I load the images using CIRawFilter and then inspect the outputImage color space it is always "DisplayP3", not something like "ITU-R BT.2100 PQ" there doesn't seem to be any way to make it load with a different color space for displaying EDR images. Does this make sense for DNG files, it seems like it should? If I open the same file using CIImage with the expandToHDR option e.g. CIImage(contentsOf: rawURL, options: [.expandToHDR: true]) then it does have the desired EDR color space, but then I don't get any of the properties that are available via the CIRAWFilter class to manipulate the data. Basically I just want to be able to open the DNG file via CIRAWFilter and then display it in my SwiftUI app as an EDR image by adding the allowedDynamicRange(.high) property. Image("my-dng-image").allowedDynamicRange(.high) Or do DNG files (just RAW not ProRAW) not contain enough information to be displayed as EDR images, seems like they should.
1
0
170
Mar ’25
WidgetKit: add new widget to bundle
Hi, I have an existing Mac app on the App Store with a couple of widgets as part of the app. I want to now add a new widget to the WidgetBundle. When I build the updated app with Xcode, and then run the updated app, the widgets list doesn't seem to get updated in Notification Center or in the WidgetKit Simulator. I do have the App Store version installed in the /Applications folder as well, so there might be some conflict. What's the trick to getting the widgets list to run the debug version?
0
0
105
Mar ’25