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

VisionOS custom hover effect and click sound
I have created a custom hover effect per this WWDC video and many other examples on the Net: https://developer.apple.com/videos/play/wwdc2024/10152/ I can get the button to expand when looked at within a VisionOS device and it will invoke a tap event when tapped but there is no click sound like a normal SwiftUI button does in VisionOS! I can't for the life of me figure out why. Any help would be appreciated!
2
0
305
Apr ’25
macOS Sequoia/Xcode 16.2 - Catalyst App Missing Tab Bar
My Objective-C Catalyst app when built with Xcode 16.x/iOS 18 does not have a visible Tab Bar when run on Sequoia. App starts up in first tab, but there is no way to access other tabs. The same app when run on macOS Sonoma (or macOS Catalina) has a normal Tab Bar. The app has an initial View UITabBarController with 3 tabs. The main tab is a UiSplitViewController. Minimum macOS deployment 10.5. If app is built on Sonoma with Xcode 15.x/iOS 17 the Tab Bar is normal on macOS Sonoma, Sequoia, and Catalina. I've tried without success: if (@available(macCatalyst 18.0, *)) { self.tabBarController.tabBarHidden = false; } else { // Fallback on earlier versions } I wonder if this console log message has anything to do with the problem: CLIENT OF UIKIT REQUIRES UPDATE: This process does not adopt UIScene lifecycle. This will become an assert in a future version.
2
0
250
Jun ’25
Implement Continuity Markup in Mac app?
Hello, is there a way to implement Continuity Markup in our own apps? (This is what I'm talking about: https://support.apple.com/en-us/102269 , scroll down to "Use Continuity Markup"). Also, why does a QuickLook panel (QLPreviewPanel.shared()) not display the markup options when triggered from my app for png image files in my app's Group Container? Do I need to implement certain NSServicesMenuRequestor methods for that? Sadly, I could not find any docs on that. Thank you, – Matthias
0
0
136
Apr ’25
Live activity widget not updated locally after server update
I am using live activity in my app. Functionality is start, update & end events are started from the server. There is one interaction button added using app intent in live activity widget. That button needs to update widget ui locally using activity kit. Issue is when os receives first start event push then update ui works fine and reflecting on live activity widget but when update notification receives by os after 1 mins then action button stops updating the ui locally. Can anyone please add some suggestions to fix this.
0
0
138
May ’25
GPS Track Navigation with MapKit?
I want to create a MKRoute from a list of MKMapPoints or coordinates. But apparently MKRoute can only be generated from a MKDirections request from Apple's servers. The primary use of my app will be activities (eg hiking) in the back country where (1) a network connection likely won't be available and (2) there likely will not be a trail in Apple's map network. For example I want to provide navigation for following a recorded GPS track or my only MKPolyLines. Note that I am required to use MapKit (3rd party map SDKs are not an option for a number of reasons). It feels like a huge missed opportunity if MapKit doesn't allow Routes to be created from a predetermined list of coordinates. Does anyone know of any solutions for this problem either somehow creating a MKRoute from a list of coordinates or a 3rd party library? I've searched but haven't had any luck finding a solution. It seems like something like this must exist so I thought I'd ask.
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
83
Apr ’25
SwiftUI internal crash when interacting with long list quickly
Hello! We encountered a very intermittent crash with our application starting with devices running iOS 18.4. We have a screen that can display a long list of products in 2 states (expanded or collapsed) based off of a boolean if the user has interacted with that product yet. With this list, we very intermittently encounter a crash when we scroll like crazy up and down the list search the list quickly (search is performed each character change and list is filtered) Our project has iOS 17.0 as a minimum deployment target, and is Swift 6 enabled. Again, this started happening only with iOS 18.4, and is still visible (handful of occurrences each week). The crash report seems to be very internal to SwiftUI/Obj-c runtime. 5895AC17-6886-4070-BC80-8912E8394BDB.crash Any insights would be greatly appreciated!
3
0
192
Jun ’25
Replaykit stop screen record failed, recording status is false
I want to record screen ,and than when I call the method stopCaptureWithHandler:(nullable void (^)(NSError *_Nullable error))handler to stop recording and saving file. before call it,I check the value record of RPScreenRecorder sharedRecorder ,the value is false , It's weird! The screen is currently being recorded ! I wonder if the value of [RPScreenRecorder sharedRecorder].record will affect the method stopCaptureWithHandler: -(void)startCaptureScreen { [[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error) { //code } completionHandler:^(NSError * _Nullable error) { //code }]; } - (void)stopRecordingHandler { if([[RPScreenRecorder sharedRecorder] isRecording]){ // deal error .sometime isRecording is false }else { [[RPScreenRecorder sharedRecorder] stopCaptureWithHandler:^(NSError * _Nullable error) { }]; } } here are my code.
0
0
118
Apr ’25
The NSTextViewDelegate method textViewDidChangeSelection(:) will not fire, while all other text view delegate methods do.
I am trying to implement the NSTextViewDelegate function textViewDidChangeSelection(_ notification: Notification). My text view's delegate is the Coordinator of my NSViewRepresentable. I've found that this delegate function never fires, but any other delegate function that I implement, as long as it doesn't take a Notification as an argument, does fire (e.g., textView(:willChangeSelectionFromCharacterRange:toCharacterRange:), fires and is called on the delegate exactly when it should be). For context, I've verified all of the below: textView.isSelectable = true textView.isEditable = true textView.delegate === my coordinator I can call textViewDidChangeSelection(:) directly on the delegate without issue. I can select and edit text without issues. I.e., the selections are being set correctly. But the delegate method is never called when they are. I am able to add the intended delegate as an observer for the selector textViewDidChangeSelection via NotificationCenter. If I do this, the function executes when it should, but fires for every text view in my view hierarchy, which can number in the hundreds. I'm using an NSLayoutManager, so I figure this should only fire once. I've added a check within my code: func textViewDidChangeSelection(_ notification: Notification) { guard let textView = notification.object as? NSTextView, textView === layoutManager.firstTextView else { return } // Any code I want to execute... } But the above guard check lets through every notification, so, no matter what, my closure executes hundreds of times if I have hundreds of text views, all of them being sent by textView === layoutManager.firstTextView, but once for each and every text view managed by that layoutManager. Does anyone know why this method isn't ever called on the delegate, while seemingly all other delegate methods are? I could go the NotificationCenter route, but I'd love to know why this won't execute as a delegate method when documentation says that it should, and I don't want to have to implement a counter to make sure my code only executes once per selection update. And for more reasons than that, implementing via delegate method is preferable to using notifications for my use case. Thanks for any help!
3
0
247
May ’25
AVAudioSession dropping wired USBAudio source
My app inputs electrical waveforms from an IV485B39 2 channel USB device using an AVAudioSession. Before attempting to acquire data I make sure the input device is available as follows: AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; I have been using this code for about 10 years. My app is scriptable so a user can acquire data from the IV485B29 multiple times with various parameter settings (sampling rates and sample duration). Recently the scripts have been failing to complete and what I have notice that when it fails the list of available inputs is missing the USBAudio input. While debugging I have noticed that when working properly the list of inputs includes both the internal microphone as well as the USBAudio device as shown below. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584c7d0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>", "<AVAudioSessionPortDescription: 0x11584cae0, type = USBAudio; name = 485B39 200095708064650803073200616; UID = AppleUSBAudioEngine:Digiducer.com :485B39 200095708064650803073200616:000957 200095708064650803073200616:1; selectedDataSource = (null)>" ) But when it fails I only see the built in microphone. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584cef0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>" ) If I only see the built in microphone I immediately repeat the three lines of code and most of the "inputs" contains both the internal microphone and the USBAudioDevice AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; This fix always works on my M2 iPadPro and my iPhone 14 but some of my customers have older devices and even with 3 tries they still get faults about 1 in 10 tries. I rolled back my code to a released version from about 12 months ago where I know we never had this problem and compiled it against the current libraries and the problem still exists. I assume this is a problem caused by a change in the AVAudioSession framework libraries. I need to find a way to work around the issue or get the library fixed.
0
0
120
May ’25
CATiledLayer flashes and re-draws entirely when re-drawing a single tile
I have filed a bug report for this (FB17734946), but I'm posting it here verbatim in case others have the same issue and in hopes of getting attention from an Apple engineer sooner. When calling setNeedsDisplayInRect on a CATiledLayer - or a UIView whose backing layer is CATiledLayer - one would expect to re-draw only a region identified by the rect passed to the method. This is even written in the documentation for the class: "Regions of the layer may be invalidated using the setNeedsDisplayInRect: method however the update will be asynchronous. While the next display update will most likely not contain the updated content, a future update will." However, upon calling this method, CATiledLayer redraws whole contents instead of just the tile at the specified rect, and it flashes when doing so. It behaves exactly the same as if one had called setNeedsDisplay without passing any rect; all contents are cleared and re-drawn again. I'm 100% sure I've passed in the correct rect of the exact tile that I need to redraw. I have even tried passing much smaller rects, but still the same. (And yes, the rect I've passed accounts for the current level of detail.) I have found this GitHub repo https://github.com/frankus/NetPhotoScroller, which based on discussion from here https://forums.macrumors.com/threads/catiledlayer-blanks-out-tiles-when-redrawing.1333948/ aims at solving these issues by using two private methods on CATiledLayer class: (void)setNeedsDisplayInRect:(CGRect)r levelOfDetail:(int)level; (BOOL)canDrawRect:(CGRect)rect levelOfDetail:(int)level; I have explored the repo in detail, however I wasn't able to test exactly this code from the GitHub repo. I have tried using those two private methods myself (through an Objective-C class that defines the methods in the header file and then a swift class which inherits it), but I couldn't solve the issue; the flashing and the full re-draw is still there. After doing a lot of research, the conclusion seems to be that one cannot use CATiledLayer with contents that are downloaded remotely, on demand, as tiles are being requested. I have, however, found one interesting thing which seems to work so far: before calling setNeedsDisplayInRect (or just setNeedsDisplay, as they behave the same for CATiledLayer in my testing), cache the current layer's contents, and after calling setNeedsDisplay (or setNeedsDisplayInRect), restore the contents back to the layer. This prevents flashing and preserves any tiles that were drawn at the time of the re-draw. let c = tiledLayer.contents tiledLayer.setNeedsDisplay(tileRect) tiledLayer.contents = c However! Docs clearly state the warning: Do not attempt to directly modify the contents property of a CATiledLayer object. Doing so disables the ability of a tiled layer to asynchronously provide tiled content, effectively turning the layer into a regular CALayer object. I believe this message implies modifying the contents property with some raw content, like image data, and that it may be safe to re-apply the existing contents (which are in my testing of type CAImageProvider) -- but I can't rely on an implementation detail in my production app. I have tested this and confirmed that the bug appears on: iPhone 14 Pro, iOS 18.5 iPhone 13 Pro, iOS 17.5.1 iPhone 5s, iOS 15.8.3 iPad Pro 1st gen, iPadOS 18.4.1 a couple simulator versions I can also confirm that the fix (to re-apply contents property) is also working properly on all these versions. Is this expected behavior, that tiled layer redraws itself entirely instead of redrawing specific tiles? Is it safe to modify contents of a CATiledLayer by re-applying the existing contents? If not, is there an alternative to avoid flashing?
3
0
199
May ’25
NSTableView.clickedRow sometimes is greater than number of rows
Xcode has been downloading many similar crash reports for my app for some time now, related to an index out of range runtime exception when accessing a Swift array. The crashes always happen in methods triggered by user input or during menu item validation when I try to access the data source array by using the following code to determine the indexes of the relevant table rows: let indexes = clickedRow == -1 || selectedRowIndexes.contains(clickedRow) ? selectedRowIndexes : IndexSet(integer: clickedRow) I was never able to reproduce the crash until today. When the app crashed in the Xcode debugger, I examined the variables clickedRow and selectedRowIndexes.first, which were 1 and 0 respectively. What's interesting: the table view only contained one row, so clickedRow was effectively invalid. I tried to reproduce the issue several times afterwards, but it never happened again. What could cause this issue? What are the circumstances where it is invalid? Do I always have to explicitly check if clickedRow is within the data source range?
Topic: UI Frameworks SubTopic: AppKit Tags:
4
0
104
Apr ’25
Mixing ReferenceFileDocument and @Observable
I have an app in which the data model is @Observable, and views see it through @Environment(dataModel.self) private var dataModel. Since there are a large number of views, only some of which may need to be redrawn at a given time, I believe that @Observable is more efficient at run time than @Published and @ObservedObject I’ve been trying to make the app document based. Although I started using SwiftData, it has trouble with Codable, and a long thread in the Developer forum suggests that SwiftData does not support the Undo manager - and in any event, simple JSON serialization is all that this app requires. Unfortunately, ReferenceFileDocument inherits from ObservableObject, which seems to not play nice with @Observable. I’d like to keep using @Observable, but haven’t been able to figure out how. When I deserialize a JSON ReferenceFileDocument, I can’t seem to connect it to an @Observable class instance and to let the various views and view models know where to find and update it. I’d appreciate advice on how to implement document persistence in this app. Also, the default behaviour of DoumentGroup provides a nice menu to, another things, rename a new file to something other than Untitled xx, but it doesn’t appear to work (there is an extensive thread on the Developer website discussing this issue). Is there a solution to this problem? Thanks for any help you can offer.
3
0
169
May ’25
popup window don't react to touch on iOS 18, works fine on iOS 17
popup window don't react to touch on iOS 18, works fine on iOS 17, this is the code: import SwiftUI extension View { public func popup<Content, Item>( item: Binding<Item?>, onDismiss: (() -> Void)? = nil, @ViewBuilder content: @escaping (Item) -> Content ) -> some View where Content: View, Item: Equatable { return self.overlay( PopupWrapper(item: item, onDismiss: onDismiss, content: content) ) } } struct PopupWrapper<Content, Item>: View where Content: View, Item: Equatable { @Binding var item: Item? var onDismiss: (() -> Void)? var content: (Item) -> Content @State var isAnimating = false var body: some View { Group { if let item { ZStack { Color.black .opacity(0.3) .ignoresSafeArea() .contentShape(Rectangle()) .gesture( TapGesture().onEnded { withAnimation(.spring(duration: 0.2)) { isAnimating = false DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { dismiss() } } } ) content(item) .scaleEffect(isAnimating ? 1 : 0.3) .opacity(isAnimating ? 1 : 0) .onAppear { withAnimation(.spring(duration: 0.3)) { isAnimating = true } } .gesture( TapGesture().onEnded { withAnimation(.spring(duration: 0.2)) { isAnimating = false DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { dismiss() } } } ) .onDisappear { dismiss() } } } else { EmptyView() } } } func dismiss() { item = nil isAnimating = false onDismiss?() } }
Topic: UI Frameworks SubTopic: SwiftUI
2
0
84
Apr ’25
PKPass Framework
I am trying to work with the data inside the barcode string in shared PKPass. The documentation shows that is should look for @property (nonatomic, readonly, nullable) PKBarcode *primaryBarcode; I have tried to use it like this guard let code = pass.primaryBarcode?.message else { return } I get a constant message that PKPass has no member primaryBarcode The PKPass.h file in my IOS SDK does not seem to include the @property primaryBarcode or @property barcode. I am running Xcode 16.4 (16F6) and my app target is 17.6 + Is there a restriction on this property? I cannot find an SDK later than mine - the App Store does not offer one. I am unsure of this is a public or private issue - does anyone know? Thanks for reading this. Max
Topic: UI Frameworks SubTopic: SwiftUI
0
0
99
Jun ’25
UIPasteControl Not Recognizing Tap
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up. For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not. Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl. import UniformTypeIdentifiers class ViewController: UIViewController { private let pasteControl = UIPasteControl() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground pasteControl.target = self pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [ UTType.text.identifier, UTType.url.identifier, UTType.plainText.identifier ]) view.addSubview(pasteControl) pasteControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } extension ViewController { override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in guard let url = reading as? URL else { return } print(url) } } else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) { provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in guard let nsstr = reading as? NSString else { return } let str = nsstr as String if let url = URL(string: str) { print(url) } } } } } }
2
0
125
Apr ’25
visionOS NavigationSplitView - Refreshable ProgressView Disappears
Description I've encountered an issue with NavigationSplitView on visionOS when using a refreshable ScrollView or List in the detail view. The Problem: When implementing pull-to-refresh in the detail view of a NavigationSplitView, the ProgressView disappears and generates this warning: Trying to convert coordinates between views that are in different UIWindows, which isn't supported. Use convertPoint:fromCoordinateSpace: instead. I discovered that if the detail view includes a .navigationTitle(), the ProgressView remains visible and works correctly! Below is a minimal reproducible example showing this behavior. When you run this code, you'll notice: The sidebar refreshable works fine The detail refreshable works only when .navigationTitle("Something") is present Remove the navigationTitle and the detail view's refresh indicator disappears minimal Demo import SwiftUI struct MinimalRefreshableDemo: View { @State private var items = ["Item 1", "Item 2", "Item 3"] @State private var detailItems = ["Detail 1", "Detail 2", "Detail 3"] @State private var selectedItem: String? = "Item 1" var body: some View { NavigationSplitView { List(items, id: \.self, selection: $selectedItem) { item in Text(item) } .refreshable { items = ["Item 1", "Item 2", "Item 3"] } .navigationTitle("Chat") } detail: { List { ForEach(detailItems, id: \.self) { item in Text(item) .frame(height: 100) .frame(maxWidth: .infinity) } } .refreshable { detailItems = ["Detail 1", "Detail 2", "Detail 3"] } .navigationTitle("Something") } } } #Preview { MinimalRefreshableDemo() } Is this expected behavior? Has anyone else encountered this issue or found a solution that doesn't require adding a navigation title?
1
0
96
May ’25
Problems visualizing UIApplicationShortcutIcon with shortcuts
Hi Everybody, I am actually developing dynamic shortcuts for my app. I have a problem with the class UIApplicationShortcutIcon. When I pass a personalized icon in the parameter icon as a UIApplicationShortcutIcon(templateImageName: "nameOfTheAsset" I always visualize a black dot instead of my Icon. The icon is imported as .SVG file and rendered as a template. Sincerely I do not know what to do to solve this problem since the documentation is little. Hoping somebody can give some tips to solve the problem
1
0
70
Apr ’25
CollectionViewCell switch back to single column once UImage is assigned
Hi I am building a simple multi column CollectionView here and trying to add 3 cell in a row. Well, in short the column and rows looks all fine if I comment the below code. which is no image and text assigned to cells. let framework = list[indexPath.item] cell.configure(framework) However, once uncommented, only a single cell is displayed per row and the image doesn't seem to be resizing automatically. Can you please advise. Below is the ViewController. import UIKit class FrameworkListViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! let list: [AppleFramework] = AppleFramework.list override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self } } extension FrameworkListViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return list.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else { return UICollectionViewCell() } let framework = list[indexPath.item] cell.configure(framework) return cell } } extension FrameworkListViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let interItemSpacing: CGFloat = 10 let width = (collectionView.bounds.width - interItemSpacing * 2) / 3 let height = width * 1.5 return CGSize(width: width, height: height) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 10 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 10 } } This is Cell class FrameworkCell: UICollectionViewCell { @IBOutlet weak var thumbnailImageView: UIImageView! @IBOutlet weak var nameLabel: UILabel! func configure(_ framework: AppleFramework) { thumbnailImageView.image = UIImage(named: framework.imageName) nameLabel.text = framework.name } }
Topic: UI Frameworks SubTopic: UIKit
1
0
56
May ’25
VisionOS custom hover effect and click sound
I have created a custom hover effect per this WWDC video and many other examples on the Net: https://developer.apple.com/videos/play/wwdc2024/10152/ I can get the button to expand when looked at within a VisionOS device and it will invoke a tap event when tapped but there is no click sound like a normal SwiftUI button does in VisionOS! I can't for the life of me figure out why. Any help would be appreciated!
Replies
2
Boosts
0
Views
305
Activity
Apr ’25
Understanding how to make focusedImage work on CPMapButton
When my CPMapButton is selected/focused, I would like to be able to provide a focusedImage to correctly show the button when the blue focus is shown. Currently I have: What do I need to do to create an image that works more like the panning interface buttons?
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
0
Boosts
0
Views
176
Activity
Jun ’25
macOS Sequoia/Xcode 16.2 - Catalyst App Missing Tab Bar
My Objective-C Catalyst app when built with Xcode 16.x/iOS 18 does not have a visible Tab Bar when run on Sequoia. App starts up in first tab, but there is no way to access other tabs. The same app when run on macOS Sonoma (or macOS Catalina) has a normal Tab Bar. The app has an initial View UITabBarController with 3 tabs. The main tab is a UiSplitViewController. Minimum macOS deployment 10.5. If app is built on Sonoma with Xcode 15.x/iOS 17 the Tab Bar is normal on macOS Sonoma, Sequoia, and Catalina. I've tried without success: if (@available(macCatalyst 18.0, *)) { self.tabBarController.tabBarHidden = false; } else { // Fallback on earlier versions } I wonder if this console log message has anything to do with the problem: CLIENT OF UIKIT REQUIRES UPDATE: This process does not adopt UIScene lifecycle. This will become an assert in a future version.
Replies
2
Boosts
0
Views
250
Activity
Jun ’25
Status Bar Driving Orientation
With CarPlay, is it possible to programmatically know which side of the screen the status bar is placed on?
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
178
Activity
Jun ’25
Implement Continuity Markup in Mac app?
Hello, is there a way to implement Continuity Markup in our own apps? (This is what I'm talking about: https://support.apple.com/en-us/102269 , scroll down to "Use Continuity Markup"). Also, why does a QuickLook panel (QLPreviewPanel.shared()) not display the markup options when triggered from my app for png image files in my app's Group Container? Do I need to implement certain NSServicesMenuRequestor methods for that? Sadly, I could not find any docs on that. Thank you, – Matthias
Replies
0
Boosts
0
Views
136
Activity
Apr ’25
Live activity widget not updated locally after server update
I am using live activity in my app. Functionality is start, update & end events are started from the server. There is one interaction button added using app intent in live activity widget. That button needs to update widget ui locally using activity kit. Issue is when os receives first start event push then update ui works fine and reflecting on live activity widget but when update notification receives by os after 1 mins then action button stops updating the ui locally. Can anyone please add some suggestions to fix this.
Replies
0
Boosts
0
Views
138
Activity
May ’25
GPS Track Navigation with MapKit?
I want to create a MKRoute from a list of MKMapPoints or coordinates. But apparently MKRoute can only be generated from a MKDirections request from Apple's servers. The primary use of my app will be activities (eg hiking) in the back country where (1) a network connection likely won't be available and (2) there likely will not be a trail in Apple's map network. For example I want to provide navigation for following a recorded GPS track or my only MKPolyLines. Note that I am required to use MapKit (3rd party map SDKs are not an option for a number of reasons). It feels like a huge missed opportunity if MapKit doesn't allow Routes to be created from a predetermined list of coordinates. Does anyone know of any solutions for this problem either somehow creating a MKRoute from a list of coordinates or a 3rd party library? I've searched but haven't had any luck finding a solution. It seems like something like this must exist so I thought I'd ask.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
83
Activity
Apr ’25
SwiftUI internal crash when interacting with long list quickly
Hello! We encountered a very intermittent crash with our application starting with devices running iOS 18.4. We have a screen that can display a long list of products in 2 states (expanded or collapsed) based off of a boolean if the user has interacted with that product yet. With this list, we very intermittently encounter a crash when we scroll like crazy up and down the list search the list quickly (search is performed each character change and list is filtered) Our project has iOS 17.0 as a minimum deployment target, and is Swift 6 enabled. Again, this started happening only with iOS 18.4, and is still visible (handful of occurrences each week). The crash report seems to be very internal to SwiftUI/Obj-c runtime. 5895AC17-6886-4070-BC80-8912E8394BDB.crash Any insights would be greatly appreciated!
Replies
3
Boosts
0
Views
192
Activity
Jun ’25
Replaykit stop screen record failed, recording status is false
I want to record screen ,and than when I call the method stopCaptureWithHandler:(nullable void (^)(NSError *_Nullable error))handler to stop recording and saving file. before call it,I check the value record of RPScreenRecorder sharedRecorder ,the value is false , It's weird! The screen is currently being recorded ! I wonder if the value of [RPScreenRecorder sharedRecorder].record will affect the method stopCaptureWithHandler: -(void)startCaptureScreen { [[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error) { //code } completionHandler:^(NSError * _Nullable error) { //code }]; } - (void)stopRecordingHandler { if([[RPScreenRecorder sharedRecorder] isRecording]){ // deal error .sometime isRecording is false }else { [[RPScreenRecorder sharedRecorder] stopCaptureWithHandler:^(NSError * _Nullable error) { }]; } } here are my code.
Replies
0
Boosts
0
Views
118
Activity
Apr ’25
The NSTextViewDelegate method textViewDidChangeSelection(:) will not fire, while all other text view delegate methods do.
I am trying to implement the NSTextViewDelegate function textViewDidChangeSelection(_ notification: Notification). My text view's delegate is the Coordinator of my NSViewRepresentable. I've found that this delegate function never fires, but any other delegate function that I implement, as long as it doesn't take a Notification as an argument, does fire (e.g., textView(:willChangeSelectionFromCharacterRange:toCharacterRange:), fires and is called on the delegate exactly when it should be). For context, I've verified all of the below: textView.isSelectable = true textView.isEditable = true textView.delegate === my coordinator I can call textViewDidChangeSelection(:) directly on the delegate without issue. I can select and edit text without issues. I.e., the selections are being set correctly. But the delegate method is never called when they are. I am able to add the intended delegate as an observer for the selector textViewDidChangeSelection via NotificationCenter. If I do this, the function executes when it should, but fires for every text view in my view hierarchy, which can number in the hundreds. I'm using an NSLayoutManager, so I figure this should only fire once. I've added a check within my code: func textViewDidChangeSelection(_ notification: Notification) { guard let textView = notification.object as? NSTextView, textView === layoutManager.firstTextView else { return } // Any code I want to execute... } But the above guard check lets through every notification, so, no matter what, my closure executes hundreds of times if I have hundreds of text views, all of them being sent by textView === layoutManager.firstTextView, but once for each and every text view managed by that layoutManager. Does anyone know why this method isn't ever called on the delegate, while seemingly all other delegate methods are? I could go the NotificationCenter route, but I'd love to know why this won't execute as a delegate method when documentation says that it should, and I don't want to have to implement a counter to make sure my code only executes once per selection update. And for more reasons than that, implementing via delegate method is preferable to using notifications for my use case. Thanks for any help!
Replies
3
Boosts
0
Views
247
Activity
May ’25
AVAudioSession dropping wired USBAudio source
My app inputs electrical waveforms from an IV485B39 2 channel USB device using an AVAudioSession. Before attempting to acquire data I make sure the input device is available as follows: AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; I have been using this code for about 10 years. My app is scriptable so a user can acquire data from the IV485B29 multiple times with various parameter settings (sampling rates and sample duration). Recently the scripts have been failing to complete and what I have notice that when it fails the list of available inputs is missing the USBAudio input. While debugging I have noticed that when working properly the list of inputs includes both the internal microphone as well as the USBAudio device as shown below. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584c7d0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>", "<AVAudioSessionPortDescription: 0x11584cae0, type = USBAudio; name = 485B39 200095708064650803073200616; UID = AppleUSBAudioEngine:Digiducer.com :485B39 200095708064650803073200616:000957 200095708064650803073200616:1; selectedDataSource = (null)>" ) But when it fails I only see the built in microphone. VIB_TimeSeriesViewController:***Available inputs = ( "<AVAudioSessionPortDescription: 0x11584cef0, type = MicrophoneBuiltIn; name = iPad Microphone; UID = Built-In Microphone; selectedDataSource = Front>" ) If I only see the built in microphone I immediately repeat the three lines of code and most of the "inputs" contains both the internal microphone and the USBAudioDevice AVAudiosSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory :AVAudioSessionCategoryRecord error:&err]; NSArray *inputs = [audioSession availableInputs]; This fix always works on my M2 iPadPro and my iPhone 14 but some of my customers have older devices and even with 3 tries they still get faults about 1 in 10 tries. I rolled back my code to a released version from about 12 months ago where I know we never had this problem and compiled it against the current libraries and the problem still exists. I assume this is a problem caused by a change in the AVAudioSession framework libraries. I need to find a way to work around the issue or get the library fixed.
Replies
0
Boosts
0
Views
120
Activity
May ’25
CATiledLayer flashes and re-draws entirely when re-drawing a single tile
I have filed a bug report for this (FB17734946), but I'm posting it here verbatim in case others have the same issue and in hopes of getting attention from an Apple engineer sooner. When calling setNeedsDisplayInRect on a CATiledLayer - or a UIView whose backing layer is CATiledLayer - one would expect to re-draw only a region identified by the rect passed to the method. This is even written in the documentation for the class: "Regions of the layer may be invalidated using the setNeedsDisplayInRect: method however the update will be asynchronous. While the next display update will most likely not contain the updated content, a future update will." However, upon calling this method, CATiledLayer redraws whole contents instead of just the tile at the specified rect, and it flashes when doing so. It behaves exactly the same as if one had called setNeedsDisplay without passing any rect; all contents are cleared and re-drawn again. I'm 100% sure I've passed in the correct rect of the exact tile that I need to redraw. I have even tried passing much smaller rects, but still the same. (And yes, the rect I've passed accounts for the current level of detail.) I have found this GitHub repo https://github.com/frankus/NetPhotoScroller, which based on discussion from here https://forums.macrumors.com/threads/catiledlayer-blanks-out-tiles-when-redrawing.1333948/ aims at solving these issues by using two private methods on CATiledLayer class: (void)setNeedsDisplayInRect:(CGRect)r levelOfDetail:(int)level; (BOOL)canDrawRect:(CGRect)rect levelOfDetail:(int)level; I have explored the repo in detail, however I wasn't able to test exactly this code from the GitHub repo. I have tried using those two private methods myself (through an Objective-C class that defines the methods in the header file and then a swift class which inherits it), but I couldn't solve the issue; the flashing and the full re-draw is still there. After doing a lot of research, the conclusion seems to be that one cannot use CATiledLayer with contents that are downloaded remotely, on demand, as tiles are being requested. I have, however, found one interesting thing which seems to work so far: before calling setNeedsDisplayInRect (or just setNeedsDisplay, as they behave the same for CATiledLayer in my testing), cache the current layer's contents, and after calling setNeedsDisplay (or setNeedsDisplayInRect), restore the contents back to the layer. This prevents flashing and preserves any tiles that were drawn at the time of the re-draw. let c = tiledLayer.contents tiledLayer.setNeedsDisplay(tileRect) tiledLayer.contents = c However! Docs clearly state the warning: Do not attempt to directly modify the contents property of a CATiledLayer object. Doing so disables the ability of a tiled layer to asynchronously provide tiled content, effectively turning the layer into a regular CALayer object. I believe this message implies modifying the contents property with some raw content, like image data, and that it may be safe to re-apply the existing contents (which are in my testing of type CAImageProvider) -- but I can't rely on an implementation detail in my production app. I have tested this and confirmed that the bug appears on: iPhone 14 Pro, iOS 18.5 iPhone 13 Pro, iOS 17.5.1 iPhone 5s, iOS 15.8.3 iPad Pro 1st gen, iPadOS 18.4.1 a couple simulator versions I can also confirm that the fix (to re-apply contents property) is also working properly on all these versions. Is this expected behavior, that tiled layer redraws itself entirely instead of redrawing specific tiles? Is it safe to modify contents of a CATiledLayer by re-applying the existing contents? If not, is there an alternative to avoid flashing?
Replies
3
Boosts
0
Views
199
Activity
May ’25
NSTableView.clickedRow sometimes is greater than number of rows
Xcode has been downloading many similar crash reports for my app for some time now, related to an index out of range runtime exception when accessing a Swift array. The crashes always happen in methods triggered by user input or during menu item validation when I try to access the data source array by using the following code to determine the indexes of the relevant table rows: let indexes = clickedRow == -1 || selectedRowIndexes.contains(clickedRow) ? selectedRowIndexes : IndexSet(integer: clickedRow) I was never able to reproduce the crash until today. When the app crashed in the Xcode debugger, I examined the variables clickedRow and selectedRowIndexes.first, which were 1 and 0 respectively. What's interesting: the table view only contained one row, so clickedRow was effectively invalid. I tried to reproduce the issue several times afterwards, but it never happened again. What could cause this issue? What are the circumstances where it is invalid? Do I always have to explicitly check if clickedRow is within the data source range?
Topic: UI Frameworks SubTopic: AppKit Tags:
Replies
4
Boosts
0
Views
104
Activity
Apr ’25
Mixing ReferenceFileDocument and @Observable
I have an app in which the data model is @Observable, and views see it through @Environment(dataModel.self) private var dataModel. Since there are a large number of views, only some of which may need to be redrawn at a given time, I believe that @Observable is more efficient at run time than @Published and @ObservedObject I’ve been trying to make the app document based. Although I started using SwiftData, it has trouble with Codable, and a long thread in the Developer forum suggests that SwiftData does not support the Undo manager - and in any event, simple JSON serialization is all that this app requires. Unfortunately, ReferenceFileDocument inherits from ObservableObject, which seems to not play nice with @Observable. I’d like to keep using @Observable, but haven’t been able to figure out how. When I deserialize a JSON ReferenceFileDocument, I can’t seem to connect it to an @Observable class instance and to let the various views and view models know where to find and update it. I’d appreciate advice on how to implement document persistence in this app. Also, the default behaviour of DoumentGroup provides a nice menu to, another things, rename a new file to something other than Untitled xx, but it doesn’t appear to work (there is an extensive thread on the Developer website discussing this issue). Is there a solution to this problem? Thanks for any help you can offer.
Replies
3
Boosts
0
Views
169
Activity
May ’25
popup window don't react to touch on iOS 18, works fine on iOS 17
popup window don't react to touch on iOS 18, works fine on iOS 17, this is the code: import SwiftUI extension View { public func popup<Content, Item>( item: Binding<Item?>, onDismiss: (() -> Void)? = nil, @ViewBuilder content: @escaping (Item) -> Content ) -> some View where Content: View, Item: Equatable { return self.overlay( PopupWrapper(item: item, onDismiss: onDismiss, content: content) ) } } struct PopupWrapper<Content, Item>: View where Content: View, Item: Equatable { @Binding var item: Item? var onDismiss: (() -> Void)? var content: (Item) -> Content @State var isAnimating = false var body: some View { Group { if let item { ZStack { Color.black .opacity(0.3) .ignoresSafeArea() .contentShape(Rectangle()) .gesture( TapGesture().onEnded { withAnimation(.spring(duration: 0.2)) { isAnimating = false DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { dismiss() } } } ) content(item) .scaleEffect(isAnimating ? 1 : 0.3) .opacity(isAnimating ? 1 : 0) .onAppear { withAnimation(.spring(duration: 0.3)) { isAnimating = true } } .gesture( TapGesture().onEnded { withAnimation(.spring(duration: 0.2)) { isAnimating = false DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) { dismiss() } } } ) .onDisappear { dismiss() } } } else { EmptyView() } } } func dismiss() { item = nil isAnimating = false onDismiss?() } }
Topic: UI Frameworks SubTopic: SwiftUI
Replies
2
Boosts
0
Views
84
Activity
Apr ’25
PKPass Framework
I am trying to work with the data inside the barcode string in shared PKPass. The documentation shows that is should look for @property (nonatomic, readonly, nullable) PKBarcode *primaryBarcode; I have tried to use it like this guard let code = pass.primaryBarcode?.message else { return } I get a constant message that PKPass has no member primaryBarcode The PKPass.h file in my IOS SDK does not seem to include the @property primaryBarcode or @property barcode. I am running Xcode 16.4 (16F6) and my app target is 17.6 + Is there a restriction on this property? I cannot find an SDK later than mine - the App Store does not offer one. I am unsure of this is a public or private issue - does anyone know? Thanks for reading this. Max
Topic: UI Frameworks SubTopic: SwiftUI
Replies
0
Boosts
0
Views
99
Activity
Jun ’25
UIPasteControl Not Recognizing Tap
I have an iOS app where I'm trying to paste something previously copied to the user's UIPasteboard. I came across the UIPasteControl as an option for a user to tap to silently paste without having the prompt "Allow Paste" pop up. For some reason, despite having what seemingly is the correct configurations for the UIPasteControl, on testing a tap, nothing is called. I expected override func paste(itemProviders: [NSItemProvider]) to fire, but it does not. Any help would be appreciated as there doesn't seem to be much info anywhere regarding UIPasteControl. import UniformTypeIdentifiers class ViewController: UIViewController { private let pasteControl = UIPasteControl() override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground pasteControl.target = self pasteConfiguration = UIPasteConfiguration(acceptableTypeIdentifiers: [ UTType.text.identifier, UTType.url.identifier, UTType.plainText.identifier ]) view.addSubview(pasteControl) pasteControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pasteControl.centerXAnchor.constraint(equalTo: view.centerXAnchor), pasteControl.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } extension ViewController { override func paste(itemProviders: [NSItemProvider]) { for provider in itemProviders { if provider.hasItemConformingToTypeIdentifier(UTType.url.identifier) { provider.loadObject(ofClass: URL.self) { [weak self] reading, _ in guard let url = reading as? URL else { return } print(url) } } else if provider.hasItemConformingToTypeIdentifier(UTType.plainText.identifier) { provider.loadObject(ofClass: NSString.self) { [weak self] reading, _ in guard let nsstr = reading as? NSString else { return } let str = nsstr as String if let url = URL(string: str) { print(url) } } } } } }
Replies
2
Boosts
0
Views
125
Activity
Apr ’25
visionOS NavigationSplitView - Refreshable ProgressView Disappears
Description I've encountered an issue with NavigationSplitView on visionOS when using a refreshable ScrollView or List in the detail view. The Problem: When implementing pull-to-refresh in the detail view of a NavigationSplitView, the ProgressView disappears and generates this warning: Trying to convert coordinates between views that are in different UIWindows, which isn't supported. Use convertPoint:fromCoordinateSpace: instead. I discovered that if the detail view includes a .navigationTitle(), the ProgressView remains visible and works correctly! Below is a minimal reproducible example showing this behavior. When you run this code, you'll notice: The sidebar refreshable works fine The detail refreshable works only when .navigationTitle("Something") is present Remove the navigationTitle and the detail view's refresh indicator disappears minimal Demo import SwiftUI struct MinimalRefreshableDemo: View { @State private var items = ["Item 1", "Item 2", "Item 3"] @State private var detailItems = ["Detail 1", "Detail 2", "Detail 3"] @State private var selectedItem: String? = "Item 1" var body: some View { NavigationSplitView { List(items, id: \.self, selection: $selectedItem) { item in Text(item) } .refreshable { items = ["Item 1", "Item 2", "Item 3"] } .navigationTitle("Chat") } detail: { List { ForEach(detailItems, id: \.self) { item in Text(item) .frame(height: 100) .frame(maxWidth: .infinity) } } .refreshable { detailItems = ["Detail 1", "Detail 2", "Detail 3"] } .navigationTitle("Something") } } } #Preview { MinimalRefreshableDemo() } Is this expected behavior? Has anyone else encountered this issue or found a solution that doesn't require adding a navigation title?
Replies
1
Boosts
0
Views
96
Activity
May ’25
Problems visualizing UIApplicationShortcutIcon with shortcuts
Hi Everybody, I am actually developing dynamic shortcuts for my app. I have a problem with the class UIApplicationShortcutIcon. When I pass a personalized icon in the parameter icon as a UIApplicationShortcutIcon(templateImageName: "nameOfTheAsset" I always visualize a black dot instead of my Icon. The icon is imported as .SVG file and rendered as a template. Sincerely I do not know what to do to solve this problem since the documentation is little. Hoping somebody can give some tips to solve the problem
Replies
1
Boosts
0
Views
70
Activity
Apr ’25
CollectionViewCell switch back to single column once UImage is assigned
Hi I am building a simple multi column CollectionView here and trying to add 3 cell in a row. Well, in short the column and rows looks all fine if I comment the below code. which is no image and text assigned to cells. let framework = list[indexPath.item] cell.configure(framework) However, once uncommented, only a single cell is displayed per row and the image doesn't seem to be resizing automatically. Can you please advise. Below is the ViewController. import UIKit class FrameworkListViewController: UIViewController { @IBOutlet weak var collectionView: UICollectionView! let list: [AppleFramework] = AppleFramework.list override func viewDidLoad() { super.viewDidLoad() collectionView.dataSource = self collectionView.delegate = self } } extension FrameworkListViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return list.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "FrameworkCell", for: indexPath) as? FrameworkCell else { return UICollectionViewCell() } let framework = list[indexPath.item] cell.configure(framework) return cell } } extension FrameworkListViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let interItemSpacing: CGFloat = 10 let width = (collectionView.bounds.width - interItemSpacing * 2) / 3 let height = width * 1.5 return CGSize(width: width, height: height) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return 10 } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return 10 } } This is Cell class FrameworkCell: UICollectionViewCell { @IBOutlet weak var thumbnailImageView: UIImageView! @IBOutlet weak var nameLabel: UILabel! func configure(_ framework: AppleFramework) { thumbnailImageView.image = UIImage(named: framework.imageName) nameLabel.text = framework.name } }
Topic: UI Frameworks SubTopic: UIKit
Replies
1
Boosts
0
Views
56
Activity
May ’25