Is there a way to detect when your apps (or any app I guess) is being moved by the user clicking and dragging the main window around the desktop at all?
I'm trying to find out if there's a way I can find out if a window is being clicked and dragged and whether there's certain triggers to the movement a little bit like shaking an iPhone with Shake to Undo.
Thanks
How did we do? We’d love to know your thoughts on this year’s conference. Take the survey here
General
RSS for tagExplore the various UI frameworks available for building app interfaces. Discuss the use cases for different frameworks, share best practices, and get help with specific framework-related questions.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello all,
I'm confused about how to show lanes in CarPlay.
I understand CPLaneGuidance and CPLane
I don't find anywhere where to tell Carplay which icon to show for each lane.
I've found some information saying we put the icon in CPManeuver, but then CPManeuver is linked to only one CPLaneGuidance, and we can put only one icon in CPManeuver.
At the same time, we might have multiple lanes.
Any help, tips, or examples would be highly helpful.
When I run my iOS app on a Mac using Mac Catalyst, several sharing options that show up on an iOS device in a share sheet are absent on the Mac. Clicking on Edit Extensions, I see Mail, Message and AirDrop, their switches are on and disabled. All three items show up when I share from Safari or Notes.
How can I make Mail, Message and AirDrop available?
For example, when sharing data, no share extensions are shown.
For text, only Simulator, Shortcuts and Copy are shown.
In iOS 26, the mini keyboard bar does not consistently appear when typing with a hardware keyboard. This behavior differs from iOS 18, where the bar was always visible. See screenshots:
With the latest iPadOS 26 changes, the traditional multitasking experience using Slide Over and Split View has been removed in favor of Stage Manager. While Stage Manager is a great option for some, the old multitasking UI was more intuitive, stable, and ideal for quick productivity. Please consider restoring the classic multitasking gestures as an optional feature or toggle alongside Stage Manager. Many users like myself rely on the traditional layout for studying, work, and multitasking efficiency.
I'm developing a CarPlay version of my app, with the CarPlay EV Charging App entitlement (com.apple.developer.carplay-charging).
However, I would like to use the Search template to searching for charging stations — but it seems this template is only available for Navigation Apps(maps).
In this case, what is the recommended approach?
Is it possible to apply both entitlements simultaneously and use the Search template only?
🔹 Description of the issue:
My app uses Adapty to fetch and display in-app subscription products on a paywall. The system has worked perfectly until recently. After I edited the localizations of the subscriptions in App Store Connect, they were temporarily rejected. Since that moment, the products no longer show in the app.
Even though I re-submitted the localizations and they were approved, StoreKit still does not return any products, and Adapty returns the error:
less
CopyEdit
AdaptyError(code: 1000, message: "No products were found for provided product ids")
🔹 Error Message:
noProductIDsFound — from Adapty SDK when attempting to load paywall products.
🔹 Steps to Reproduce:
Open the Aida Nena app (App ID: 6737695739).
Sign in with a test account or create a new one.
Go to Profile → Subscription.
The paywall will show but no products will appear.
Logs show Adapty attempting to fetch product IDs but none are found in StoreKit.
🔹 What I’ve Tried:
Re-activating the Adapty SDK.
Forcing a cache reset via app reinstall.
Re-checking App Store Connect: all subscriptions and localizations now show Approved (green).
Waiting several hours in case of propagation.
Verifying correct product identifiers are in use — they haven’t changed.
🔹 My Hypothesis:
The StoreKit product metadata is still not properly refreshed after the rejection and re-approval of the localizations. This is preventing Adapty (and StoreKit) from returning the product data even though the products are live and approved.
🔹 Additional Info:
SDK: @adapty/react-native + Adapty iOS SDK under the hood.
This seems to be a known edge case among developers after a product's metadata/localization is changed and re-approved.
Thanks, I appreciate any help.
In keyboard shortcuts this buttons at the bottom are overlappin.
Any one
else?
Topic:
UI Frameworks
SubTopic:
General
Using an App Clip link encoded into a QR Code shows an error when scanning the encoded QR Code on an iPhone or iPad.
After being scanned, the App Clip's banner is visible, but a message says: "App Clip Unavailable".
Accessing the same App Clip URL via Safari works as expected.
I've filed a feedback with more details and screenshots of the issue here: FB17891015
Thanks!
The swift syntax compilation reported an error.
as follows
How should I be compatible
I noticed on the Find My app in the new iOS 26 beta that the TabView and the sheet seem to be part of the same view. When you collapse the sheet, the TabView is still visible, and you can swipe up to view the sheet again. Is there a way to recreate this effect? Preferably in SwiftUI, but UIKit works too.
Logic Pro recently changed the way it accepts drag and drop. If the ItemProvider contains UTType.midi, then Logic Pro shows visual feedback for the drop operation, but when the item is dropped, nothing happens. In the past, drag-and-drop used to work. With today's version (Logic Pro 11.2), the only way I was able to successfully drop MIDI was to provide UTType.fileURL and no other data types. But that's not a viable solution; I need other data types to be included too.
As a side note, I tested with Ableton Live 12 and it works with no issue.
Is this a bug in Logic Pro? What ItemProvider structure does Logic Pro expect to correctly receive the MIDI data?
We are using openURL:options:completionHandler: to open a tel:// number in the dialer to place a call. This works on iPhones and WiFi-only iPads (tested with a iPad Mini 6th Gen), but it is failing to open on an iPad 8th Gen (WiFi + Cellular) running iPadOS 18.5 being used by a customer. Prior to updating the iPad to iPadOS 18, the call worked on iPadOS 15.2 and opened the call in FaceTime as expected. Despite not opening the dialer in iPadOS 18, the completionHandler returns the success parameter as true. canOpenUrl also returns true. We created a small test application that reproduces the issue using the code snippet below in a new application, with the tel schema added to the info.plist Queried URL Schemes. We are currently using Xcode 16.3.
Test Steps:
Create a new blank application and replace ContentView.swift with the code snippet below
Run the test app on a physical iPad 8th Gen (WiFi + Cellular)
Tap the "place a test call" button
Expected Results:
The user is prompted to call the number and is taken to FaceTime to attempt the call. The user may then receive an alert telling them an iPhone must be paired if not already. Alternatively: return success = false in the completionHandler.
Actual Results:
No action occurs that is visible to the user, and the completionHandler returns success = true.
Separately, we should be able to have some method of checking if the device can actually complete a call, i.e. if an iPhone is paired, so that we can correctly show or hide a phone icon in the app based on if the user can place a call. canOpenUrl returns true even if there is not a device paired and the call cannot actually be placed, and there doesn't seem to be a proper method for making that check.
Code Snippet:
import SwiftUI
struct ContentView: View {
@State private var showAlert = false
var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
Button("Place a test call") {
if let url = URL(string: "tel://5555554567") {
UIApplication.shared.open(url) { success in
if success {
print("Call initiated successfully.")
} else {
showAlert = true
}
}
}
}
}
.padding()
.alert("Call Failed", isPresented: $showAlert) {
Button("OK") { showAlert = false }
} message: {
Text("The call could not be initiated.")
}
}
}
#Preview {
ContentView()
}
I have a Chart displaying Counts per Date over 2-3 years. I'd like to have the XAxis mark consist of MM-yy or even MM/nyy. Is this possible?
OK, just saw
AxisValueLabel(format: .dateTime.month().year())
which gives e.g. Mar 2024. This is good.
Better might be Mar 24 (maybe a Y3K problem ;-) or even better
Mar. OR Mar
24. 2024
Or best increment the year when it changes.
Are any of these alternate formats possible?
Thanks, David
PS, my current .chartXAxis code
.chartXAxis {
AxisMarks(values: .stride(by: .month, count: 3)) { value in
if value.as(Date.self) != nil {
AxisValueLabel(format: .dateTime.month().year())
AxisGridLine()
AxisTick()
}
}
}
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.
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?
We have some rather old code that worked for many years, but recently started to crash sporadically here:
The crash looks like this:
or
Our code is called from many threads concurrently, but as said it worked without any issues until recently.
I've found the apparently same crash on iOS at this Reddit post: https://www.reddit.com/r/iOSProgramming/comments/1kle4h4/ios_185_doesnt_fix_cicontext_rendering_crash/
Recap: we believe it started on macOS 18.4 and is still on macOS 18.5. But maybe it was already on macOS 18.3. This matches the observation in the Reddit post well.
Should we create a feedback with sysdiagnose?
Thanks! :)
Hi, after upgrading to iOS 18.5 our app crashes in CarPlay. Only when the app is running on our mobile the carplay app works fine.
If we run the same app in mobiles with iOS < 18.5 everything works.
What has changed in iOS 18.5?
Thanks
The URL directory obtained by UIDocumentPickerVieweController can be read and written in the directory after calling startAccessingDecurityScopeResource. However, after restarting the app, if the URL saved in the package is called startAccessingDecurityScopeResource again and returns NO, UIDocumentPickerVieweController must be called again to retrieve the URL, and then startAccessingDecurityScopeResource must be called again before continuing the operation. This is too troublesome. Is there a way to continue reading and writing operations in the URL directory after restarting the app?
I am currently developing an AR experience using ARKit with SceneKit and am looking to implement functionality that enables:
Zooming into the AR camera feed, ideally leveraging the ultra-wide or telephoto lenses available on supported devices.
Macro-style focus capabilities, allowing users to view and interact with virtual content closely aligned with small or nearby real-world objects (within a few centimeters).
My objective is to ensure that ARKit continues to render the scene accurately while enabling a zoomed-in view or macro-level focus for better detail visibility and alignment.
Could you please advise on:
Whether ARKit currently supports camera zoom or allows access to macro or ultra-wide cameras within an ARSession.
Limitations or considerations when using multi-camera setups in conjunction with ARKit.
Any guidance or references to documentation or sample code would be greatly appreciated.