In macOS 13.2, the NSTrackingEnabledDuringMouseDrag flag for NSTrackingArea is broken, i.e., mouse-entered and mouse-exited events are not sent during a drag. This problem did not exist in macOS 12. I've filed a bug report, FB11973492, just wondering if anyone knows a workaround.
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.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I've created a custom keyboard and implemented the:
class KeyboardViewController: UIInputViewController
The imlementation looks like this:
override func viewDidLoad() {
super.viewDidLoad()
var stack = UIStackView()
stack.axis = .vertical
stack.spacing = 8
stack.translatesAutoresizingMaskIntoConstraints = false
stack.distribution = .fill
stack.heightAnchor.constraint(equalToConstant: 200).isActive = true
....
view.addSubview(stack)
NSLayoutConstraint.activate([
stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
stack.topAnchor.constraint(equalTo: view.topAnchor, constant: 10),
stack.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -10)
])
The problem is that the keyboard seems to start showing in the size (I've printed the parent frame):
Optional(<UIView: 0x101008480; frame = (0 0; 390 844); autoresize = W+H; layer = <CALayer: 0x600000207b80>>)
and than resizes to my given height. But it's not fast enough so that I can see some glitches whenever I switch from another keyboard to my custom keyboard.
Is there a way to prevent this resizing or start the keyboard in a given size? This is just not the best user experience.
Topic:
UI Frameworks
SubTopic:
UIKit
Hello.
In my app, I use RegisterEventHotkey to implement global keyboard shortcuts to trigger actions.
Up until macOS Sequoia, I was able to use a keyboard shortcut with option and shift as the modifiers, like option shift 2 (⌥ ⇧ 2).
Now, on macOS Sequoia, using RegisterEventHotkey to register a hotkey with those exact modifiers (option and shift), regardless of the key, fails with the error -9868 (eventInternalErr).
Is this a documented and wanted change, or is this a bug? Other modifier keys (just command, command option, command shift, command control, control shift, etc), all work.
Any insight into this would be appreciated. (Feedback filed: FB15163561)
Thank you,
Matthias
In a modal dialog, when tabbing to next NSTextField, or programmatically selecting a NSTextField, the NSTextfField that is loosing focus (aka resigning FirstResponder) appears empty in Tahoe 26 ( aka not displaying its content) .
The same thing works oK in all systems before Tahoe.
Found no workaround this issue which looks to be a Tahoe problem.
i have a small app that demonstrate the issue.. but cannot be posted here due to zip format not accepted...
i appreciate any help or apple engineer attention to that issue also posted with Evaluation Assistant under #FB21102969
ThX
Hi
Is there a way to create a dynamic app clip card experience? I have advanced app clip experiences set up and working fine already and but I am looking to provider a more dynamic experience.
For example, my invocation url now is https://mycompany.com/profile/<profile_slug>, this URL shows the app clip card with the title, subheading, and cover image as configured in app store connect which is right. But I would like to show a different title, subheading, and cover image based on the <profile_slug> in the invocation URL. Like we can show the name as the title, job title as the subheading, and profile's banner image as the cover image for the app clip
It seems like this is possible as I have seen one company do this for their product. Apple has no mention for such a thing in their documentation from what I have seen.
Any help would be appreciated.
Thanks
Hi, does anyone know how to enable creating or configuring Near NFC Reader in SwiftUI?
I've already added the capability, the permissions in info.plist, the entitlement, and the SwiftUI code, but without success. Here's the example code:
class PaymentT2PViewModel: NSObject, ObservableObject {
@Published var paymentT2PUIState: PaymentT2PUIState
// MARK: - NFC Properties
@Published var nfcMessage: String = .empty
@Published var isNFCReading: Bool = false
private var nfcSession: NFCTagReaderSession?
init(paymentT2PUIState: PaymentT2PUIState) {
self.paymentT2PUIState = paymentT2PUIState
super.init()
)
}
func startNFCReading() {
print("INICIO: startNFCReading llamado")
guard NFCTagReaderSession.readingAvailable else {
print("ERROR: NFC NO disponible en este dispositivo")
Task { @MainActor in
self.nfcMessage = "NFC no disponible en este dispositivo"
}
return
}
print("NFC disponible, creando sesión...")
nfcSession = NFCTagReaderSession(
pollingOption: [.iso14443, .iso15693, .iso18092],
delegate: self,
queue: nil
)
print("Sesión creada, configurando mensaje...")
nfcSession?.alertMessage = "Acerca la tarjeta al iPhone"
nfcSession?.begin()
print("Sesión NFC INICIADA - debería aparecer popup")
Task { @MainActor in
self.isNFCReading = true
}
}
func stopNFCReading() {
nfcSession?.invalidate()
Task { @MainActor in
self.isNFCReading = false
}
}
extension PaymentT2PViewModel: NFCTagReaderSessionDelegate {
func tagReaderSession(_ session: NFCTagReaderSession, didInvalidateWithError error: Error) {
print("SESIÓN INVALIDADA")
print("Error: (error.localizedDescription)")
if let readerError = error as? NFCReaderError {
print("Código de error: \(readerError.code.rawValue)")
print("¿Es cancelación del usuario?: \(readerError.code == .readerSessionInvalidationErrorUserCanceled)")
}
Task { @MainActor in
if let readerError = error as? NFCReaderError {
if readerError.code != .readerSessionInvalidationErrorUserCanceled {
self.nfcMessage = "Error: \(readerError.localizedDescription)"
}
}
self.isNFCReading = false
}
}
func tagReaderSessionDidBecomeActive(_ session: NFCTagReaderSession) {
print("NFC Session activa")
}
func tagReaderSession(_ session: NFCTagReaderSession, didDetect tags: [NFCTag]) {
guard let firstTag = tags.first else { return }
session.connect(to: firstTag) { [weak self] error in
if let error = error {
session.invalidate(errorMessage: "Error al conectar: \(error.localizedDescription)")
return
}
Task { @MainActor [weak self] in
await self?.handleTag(firstTag, session: session)
}
}
}
private func handleTag(_ tag: NFCTag, session: NFCTagReaderSession) async {
switch tag {
case .iso7816(let tag):
await handleISO7816Tag(tag, session: session)
case .miFare(let tag):
await handleMiFareTag(tag, session: session)
case .iso15693(let tag):
await handleISO15693Tag(tag, session: session)
case .feliCa(let tag):
await handleFeliCaTag(tag, session: session)
@unknown default:
session.invalidate(errorMessage: "Tipo de tag no soportado")
}
}
private func handleISO7816Tag(_ tag: NFCISO7816Tag, session: NFCTagReaderSession) async {
let uid = tag.identifier.map { String(format: "%02X", $0) }.joined()
nfcMessage = """
ISO7816 Tag detectado
UID: \(uid)
Historical Bytes: \(tag.historicalBytes?.map { String(format: "%02X", $0) }.joined() ?? "N/A")
"""
session.alertMessage = "Tag leído exitosamente"
session.invalidate()
}
private func handleMiFareTag(_ tag: NFCMiFareTag, session: NFCTagReaderSession) async {
let uid = tag.identifier.map { String(format: "%02X", $0) }.joined()
nfcMessage = """
MiFare Tag detectado
UID: \(uid)
Tipo: \(tag.mifareFamily.description)
"""
session.alertMessage = "Tag leído exitosamente"
session.invalidate()
}
private func handleISO15693Tag(_ tag: NFCISO15693Tag, session: NFCTagReaderSession) async {
let uid = tag.identifier.map { String(format: "%02X", $0) }.joined()
nfcMessage = """
ISO15693 Tag detectado
UID: \(uid)
IC Manufacturer: \(tag.icManufacturerCode)
"""
session.alertMessage = "Tag leído exitosamente"
session.invalidate()
}
private func handleFeliCaTag(_ tag: NFCFeliCaTag, session: NFCTagReaderSession) async {
let idm = tag.currentIDm.map { String(format: "%02X", $0) }.joined()
let pmm = tag.currentSystemCode.map { String(format: "%02X", $0) }.joined()
nfcMessage = """
FeliCa Tag detectado
IDm: \(idm)
System Code: \(pmm)
"""
session.alertMessage = "Tag leído exitosamente"
session.invalidate()
}
}
// MARK: - Helper Extension
extension NFCMiFareFamily {
var description: String {
switch self {
case .unknown: return "Desconocido"
case .ultralight: return "Ultralight"
case .plus: return "Plus"
case .desfire: return "DESFire"
@unknown default: return "Otro"
}
}
}
struct PaymentT2PView: View {
@ObservedObject var paymentT2PViewModel: PaymentT2PViewModel
var body: some View {
ZStack {
if paymentT2PViewModel.paymentT2PUIState.showingResult {
print("Navigate")
} else {
print("False")
}
}
.onAppear {
paymentT2PViewModel.startNFCReading()
}
.onDisappear {
paymentT2PViewModel.stopNFCReading()
}
}}
However, I'm getting code error messages, and I'm testing this on an iPhone 11.
What am I doing wrong?
The ScreenCaptureKit sample application (https://developer.apple.com/documentation/screencapturekit/capturing-screen-content-in-macos) uses a filter initially set to capture content from the selected display, excluding only the sample application, and excepting no windows:
private var contentFilter: SCContentFilter {
var filter: SCContentFilter
switch captureType {
case .display:
guard let display = selectedDisplay else { fatalError("No display selected.") }
var excludedApps = [SCRunningApplication]()
// If a user chooses to exclude the app from the stream,
// exclude it by matching its bundle identifier.
if isAppExcluded {
excludedApps = availableApps.filter { app in
Bundle.main.bundleIdentifier == app.bundleIdentifier
}
}
// Create a content filter with excluded apps.
filter = SCContentFilter(display: display,
excludingApplications: excludedApps,
exceptingWindows: [])
.......
return filter
However, if another application uses the legacy NSWindowSharingType NSWindowSharingNone attribute, that application is initially not included in the captured stream. Only by toggling either the "Capture Type" or "Exclude sample from stream" checkbox does the initially hidden application become visible.
Additionally, if the "Stop Capture" button is used followed by "Start Capture", the application using the legacy NSWindowSharingType NSWindowSharingNone attribute is once again hidden from the stream, and is only made visible by toggling either the "Capture Type" or "Exclude sample from stream" checkbox.
Does some additional filter element or other SCStream configuration need to be included to verify that all applications, regardless of NSWindowSharingType, are captured using ScreenCaptureKit without requiring manual user interaction/filter refreshing? It seems odd that QuickTime screen recording (using ScreenCaptureKit) immediately captures an application using the NSWindowSharingNone attribute while the ScreenCaptureKit sample application linked above does not.
See images below showing the stream preview before and after toggling the "Capture Type" or "Exclude sample from stream" checkbox. Images were taken from a QuickTime screen recording during testing.
Is anyone else experiencing NavigationStack title disappearing in iOS 26?
Hey everyone,
I just updated to iOS 26 and I'm running into a really frustrating issue with my app. Wondering if anyone else is seeing this or if I'm missing something obvious.
What's happening:
My navigation titles are completely blank when the app first loads, but then magically appear when I scroll down. It's super weird and makes my app look broken at first glance.
My setup:
I'm using NavigationStack with some pretty standard stuff:
Navigation title with .navigationTitle()
A toolbar with a settings button
ScrollView content with a gradient background
Here's basically what I have:
NavigationStack {
ScrollView {
VStack(spacing: 24) {
// My app content here - cards, etc.
ForEach(myItems) { item in
// Content cards
}
}
.padding()
}
.background(
LinearGradient(
gradient: Gradient(colors: [
Color.surfacePrimary,
Color.surfacePrimary.opacity(0.95),
Color.surfaceSecondary.opacity(0.3)
]),
startPoint: .top,
endPoint: .bottom
)
)
.navigationTitle("My Title") // ← This doesn't show up initially!
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button("Settings") {
// Settings action
}
}
}
}
The weird part:
Works perfectly fine on my iOS 18.6.2 device
Completely broken on iOS 26 - blank navigation area
As soon as I scroll, the title appears and stays there
Happens on both simulator and physical device
What I've tried:
Double-checking my code (it's identical to what worked before)
Testing on multiple devices
Different navigation title strings
Removing and re-adding the toolbar
Has anyone else run into this? I'm thinking it might be an iOS 26 bug with NavigationStack, but I wanted to check if others are seeing it before filing a radar.
It's affecting my main landing screens (Tennis, NFL, and Prediction Markets tabs) and honestly looks pretty bad when users first open the app and see blank headers.
Temporary fix I found:
If anyone else hits this, I discovered that forcing inline titles works as a workaround:
.navigationTitle("My Title")
.navigationBarTitleDisplayMode(.inline) // This fixes it but kills large titles
Obviously not ideal since we lose the nice large title behavior, but at least the titles show up.
Questions:
Is this happening to anyone else's iOS 26 apps?
Any better workarounds that preserve large titles?
Should I file this as a radar or is Apple already aware?
Really hoping this gets fixed soon - having to choose between broken navigation or losing large titles is pretty frustrating.
Thanks for any insights!
Anyone else dealing with this NavigationStack nightmare in iOS 26? 😅
On Tahoe NSTextField (and NSTextFieldCell) appears to ignore backgroundColor, drawsBackground, isBezeled, bezelStyle and isBordered properties. Those worked on prior macOS, but not Tahoe. Is there a way to make those properties effective while targeting Tahoe? Note: a slight erratum: backgroundColor has an effect while the text field has first responder status, but the background area is an inset rectangle and I suspect that is a remnant feature and not by design.
Topic:
UI Frameworks
SubTopic:
AppKit
Our app was just rejected by Apple because they say the subscription management sheet never loads. It just spins indefinitely.
We're using StoreKit's manageSubscriptionsSheet view modifier to present the sheet, and it's always worked for us when testing in SandBox.
Has anyone else had this problem?
Given that it's Apple's own code that got us rejected, what's our path forward?
I know iPhone Cannot prohibit screenshots, but I have seen someone else's solution, which is to capture a white page instead of the current design page when taking screenshots. I want to use swift implement iPhone The photo generated when taking a screenshot is a white screen, and I don't want my page to be seen by others
Topic:
UI Frameworks
SubTopic:
General
Device: iPhone 11
iOS Version: 17.2.1
Frameworks: UIKit, Auto Layout
App Behavior: App supports Arabic (RTL). User can switch language in-app. When language is switched, the app sets UIView.appearance().semanticContentAttribute and fully rebuilds the window’s rootViewController.
Problem Summary
I update the global semantic direction only when the user explicitly switches language inside the app — e.g.:
// Only run when user switches language inside the app
UIView.appearance().semanticContentAttribute = .forceRightToLeft // or .forceLeftToRight
// then rebuild the window's rootViewController
I do not change UIView.appearance().semanticContentAttribute during navigation transitions. Despite that, after switching the language (and rebuilding the root), the app sometimes crashes during a subsequent UINavigationController push/pop animation. The crash appears to be caused by UIKit’s Auto Layout engine removing or updating directional constraints while a navigation transition is running.
Crash Log (most relevant portion)
Crashed: com.apple.main-thread
0 CoreAutoLayout 0x1372c -[NSISEngine positiveErrorVarForBrokenConstraintWithMarker:errorVar:] + 212
1 CoreAutoLayout 0x121d4 -[NSISEngine removeConstraintWithMarker:] + 1028
2 CoreAutoLayout 0x11d78 -[NSLayoutConstraint _removeFromEngine:] + 148
3 UIKitCore 0x124ba9c __58-[UIView _updateDirectionalConstraintsIfNeededWasFlipped:]_block_invoke_2 + 56
4 UIKitCore 0x484d4 ___UIViewEnumerateLayoutConstraintsAndAdjustForSelectedLayoutVariables_block_invoke + 296
5 UIKitCore 0x4801c -[UIView(AdditionalLayoutSupport) _withUnsatisfiableConstraintsLoggingSuspendedIfEngineDelegateExists:] + 112
6 UIKitCore 0x60830 -[UIView _updateDirectionalConstraintsIfNeededWasFlipped:] + 356
7 UIKitCore 0x60494 -[UIView setSemanticContentAttribute:] + 148
8 CoreFoundation 0x31794 __invoking___ + 148
9 CoreFoundation 0xe6360 -[NSInvocation invokeUsingIMP:] + 332
10 UIKitCore 0x1d93ec __workaround10030904InvokeWithTarget_block_invoke + 68
11 UIKitCore 0x250ec +[UIView _performSystemAppearanceModifications:] + 72
12 UIKitCore 0x3f008 applyInvocationsToTarget + 1004
13 UIKitCore 0x3dcd4 +[_UIAppearance _applyInvocationsTo:window:matchingSelector:onlySystemInvocations:] + 1180
14 UIKitCore 0x3d744 __88-[UIView(Internal) _performUpdatesForPossibleChangesOfIdiom:orScreen:traverseHierarchy:]_block_invoke + 68
15 UIKitCore 0x3d6c4 -[UIView _performUpdatesForPossibleChangesOfIdiom:orScreen:traverseHierarchy:] + 216
16 UIKitCore 0x3d5a0 -[UIView _didChangeFromIdiomOnScreen:traverseHierarchy:] + 112
17 UIKitCore 0x11644 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 1220
18 UIKitCore 0x1142c -[UIView(Internal) _didMoveFromWindow:toWindow:] + 684
19 UIKitCore 0x1142c -[UIView(Internal) _didMoveFromWindow:toWindow:] + 684
20 UIKitCore 0x1142c -[UIView(Internal) _didMoveFromWindow:toWindow:] + 684
21 UIKitCore 0x10eb4 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 124
22 CoreAutoLayout 0xa514 -[NSISEngine withBehaviors:performModifications:] + 84
23 UIKitCore 0x10ddc -[UIView _postMovedFromSuperview:] + 504
24 UIKitCore 0xfa24 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 2200
25 UIKitCore 0x7a63b8 __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke_2 + 1252
26 UIKitCore 0x41a70 +[UIView(Animation) performWithoutAnimation:] + 76
27 UIKitCore 0x7a5e84 __53-[_UINavigationParallaxTransition animateTransition:]_block_invoke + 240
28 UIKitCore 0x12749c +[UIView _performBlockDelayingTriggeringResponderEvents:forScene:] + 176
29 UIKitCore 0x7a5990 -[_UINavigationParallaxTransition animateTransition:] + 952
30 UIKitCore 0x291098 ___UIViewControllerTransitioningRunCustomTransition_block_invoke_3 + 52
31 UIKitCore 0x29100c +[UIKeyboardSceneDelegate _pinInputViewsForKeyboardSceneDelegate:onBehalfOfResponder:duringBlock:] + 96
32 UIKitCore 0x290f70 ___UIViewControllerTransitioningRunCustomTransition_block_invoke_2 + 196
33 UIKitCore 0x1d8c8c +[UIView(Animation) _setAlongsideAnimations:toRunByEndOfBlock:] + 180
34 UIKitCore 0x1d851c _UIViewControllerTransitioningRunCustomTransition + 484
35 UIKitCore 0x6f5a84 -[UINavigationController _startCustomTransition:] + 3292
36 UIKitCore 0x1182a8 -[UINavigationController _startDeferredTransitionIfNeeded:] + 496
37 UIKitCore 0x1179a0 -[UINavigationController __viewWillLayoutSubviews] + 96
38 UIKitCore 0x117904 -[UILayoutContainerView layoutSubviews] + 172
39 UIKitCore 0x3297c -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1528
40 QuartzCore 0x66aa8 CA::Layer::layout_if_needed(CA::Transaction*) + 500
41 QuartzCore 0x66630 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 144
42 QuartzCore 0x6cb60 CA::Context::commit_transaction(CA::Transaction*, double, double*) + 464
43 QuartzCore 0x65e3c CA::Transaction::commit() + 648
44 QuartzCore 0x65ae4 CA::Transaction::flush_as_runloop_observer(bool) + 88
45 CoreFoundation 0x3583c __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 36
46 CoreFoundation 0x34244 __CFRunLoopDoObservers + 548
47 CoreFoundation 0x33960 __CFRunLoopRun + 1028
48 CoreFoundation 0x33478 CFRunLoopRunSpecific + 608
49 GraphicsServices 0x34f8 GSEventRunModal + 164
50 UIKitCore 0x22c62c -[UIApplication _run] + 888
51 UIKitCore 0x22bc68 UIApplicationMain + 340
52 MyApp 0x46a040 main + 44 (AppDelegate.swift:44)
53 ??? 0x1c8d52dcc (缺少)
Questions / Requests
Recommended patterns for in-app language switching (LTR ⇄ RTL) to avoid direction/constraint races during animations? For example:
Should semantic direction be applied to the window/root view controller only?
Should we avoid rebuilding root during an active transition?
Any suggested synchronization (e.g., wait for transitions to finish) or APIs to call after rebuilding?
In third-party keyboard app, the app is crashed when call [[UIInputViewController textDocumentProxy] keyboardAppearance].
Environment)
iOS 26
crash dump call stack
Thread 0 Crashed: 0 libobjc.A.dylib 0x0000000198433008 objc_msgSend + 8
1 UIKitCore 0x00000001a1cea570 -[_UITextDocumentInterface _controllerState] + 68
2 UIKitCore 0x00000001a1ceaef0 -[_UITextDocumentInterface documentIdentifier] + 20
3 ThirtPartyKeyboardApp 0x0000000104aad190 -[NKBKeyboardViewController _updateThemeCenterAppearanceModeIfNeeds] + 56 (NKBKeyboardViewController.m:164)
UITabBarAppearance *appearance = UITabBarAppearance.alloc.init;
[appearance.stackedLayoutAppearance.normal setTitleTextAttributes:@{NSForegroundColorAttributeName:UIColor.redColor}];
[appearance.stackedLayoutAppearance.selected setTitleTextAttributes:@{NSForegroundColorAttributeName:UIColor.purpleColor}];
appearance.backgroundColor = UIColor.redColor;
self.tabBar.standardAppearance = appearance;
self.tabBar.scrollEdgeAppearance = appearance;
How to resolve?
Topic:
UI Frameworks
SubTopic:
UIKit
I understand this is a known issue, but it’s truly unacceptable that it remains unresolved. Allowing users to customize toolbars is a fundamental macOS feature, and it has been broken since the release of macOS 15.
How is it possible that this issue persists even in macOS 15.3 beta (24D5040f)?
FB15513599
import SwiftUI
struct ContentView: View {
@State private var showEditItem = false
var body: some View {
VStack {
VStack {
Text("Instructions to reproduce the crash")
.font(.title)
.padding()
Text("""
1. Click on "Toggle Item"
2. In the menu go to File > New Window
3. In new window, click on "Toggle Item"
""")
}
.padding()
Button {
showEditItem.toggle()
} label: {
Text("Toggle Item")
}
}
.padding()
.toolbar(id: "main") {
ToolbarItem(id: "new") {
Button {
} label: {
Text("New…")
}
}
if showEditItem {
ToolbarItem(id: "edit") {
Button {
} label: {
Text("Edit…")
}
}
}
}
}
}
[Also submitted as FB20225387]
When using a custom SF Symbol that combines a base symbol with a badge, the symbol doesn’t stay vertically centered when displayed in code. The vertical alignment shifts based on the Y offset of the badge.
There are two problems with this:
The base element shouldn’t move vertically when a badge is added—the badge is meant to add to the symbol, not change its alignment.
The badge position should be consistent with system-provided badged symbols, where badges always appear in a predictable spot relative to the corner they're in (usually at X,Y offsets of 90% or 10%).
Neither of these behaviors match what’s expected, leading to inconsistent and misaligned symbols in the UI.
Screenshot of Problem
The ellipsis shifts vertically whenever the badge Y offset is set to anything other than 50%. Even at a 90/10 offset, it still doesn’t align with the badge position of the system "envelope.badge" symbol.
SF Symbols Export
This seem to be a SwiftUI issue since both the export from SF Symbols is correctly centered:
Xcode Assets Preview
And it's also correct in the Xcode Assets preview:
Steps to Repro
In SF Symbols, create a custom symbol of "ellipsis" (right-click and Duplicate as Custom Symbol)
Combine it with the "badge" component (select Custom Symbols, select the newly-created "custom.ellipsis", then right-click and Combine Symbol with Component…)
Change the badge's Y Offset to 10%.
Export the symbol and add it to your Xcode asset catalog.
In Xcode, display the symbol inside a Button using Image(“custom.ellipsis.badge”).
Add a couple more buttons separated by spacers, using system images of "ellipsis" and "app.badge".
Compare the "custom.ellipsis.badge" button to the two system symbol buttons.
Expected
The combined symbol remains vertically centered, matching the alignment shown in both the SF Symbols export window and the Xcode asset catalog thumbnails.
Actual
The base symbol (e.g., the ellipsis portion) shifts vertically based on the Y offset of the badge element. This causes visual misalignment when displayed in SwiftUI toolbars or other layouts. Also included the system “envelope.badge” icon to show where a 90%, 10% badge offset should be located.
System Info
SF Symbols Version 7.0 (114)
Xcode Version 26.0 (17A321)
macOS 15.6.1 (24G90)
iOS 26.0 (23A340)
Hi everyone,
I am encountering an issue where my Live Activity (Dynamic Island) suddenly became invalid and failed to launch. It was working perfectly before, and I haven't modified any code since then.
My Environment:
Xcode: 26.1.1
Device iOS: 26.1
Testing: I also tested on iOS 18, but the Live Activity fails to start there as well.
Here is my code:
Live Activity Manager (Start/Update/End):
func startLiveActivity() {
// Initial static data
let attributes = SimpleIslandAttributes(name: "Test Order")
// Initial dynamic data
let initialContentState = SimpleIslandState(message: "Preparing...")
// Adapting for iOS 16.2+ new API (Content)
let activityContent = ActivityContent(state: initialContentState, staleDate: nil)
do {
let activity = try Activity.request(
attributes: attributes,
content: activityContent,
pushType: nil // Set to nil as remote push updates are not needed
)
print("Live Activity Started ID: \(activity.id)")
} catch {
print("Failed to start: \(error.localizedDescription)")
}
}
// 2. Update Live Activity
func updateLiveActivity() {
Task {
let updatedState = SimpleIslandState(message: "Delivering 🚀")
let updatedContent = ActivityContent(state: updatedState, staleDate: nil)
// Iterate through all active Activities and update them
for activity in Activity<SimpleIslandAttributes>.activities {
await activity.update(updatedContent)
print("Update")
}
}
}
// 3. End Live Activity
func endLiveActivity() {
Task {
let finalState = SimpleIslandState(message: "Delivered ✅")
let finalContent = ActivityContent(state: finalState, staleDate: nil)
for activity in Activity<SimpleIslandAttributes>.activities {
// dismissalPolicy: .default (immediate), .after(...) (delayed), .immediate (no animation)
await activity.end(finalContent, dismissalPolicy: .default)
print("End")
}
}
}
The Models (Shared between App and Widget Extension):
// 1. Define State (Dynamic data, changes over time, e.g., remaining delivery time)
public struct SimpleIslandState: Codable, Hashable {
var message: String
}
// 2. Define Attributes (Static data, constant after start, e.g., Order ID)
public struct SimpleIslandAttributes: ActivityAttributes {
public typealias ContentState = SimpleIslandState
var name: String // e.g., "My Order"
}
The Widget Code:
//
// SimpleIslandWidget.swift
// ReadyGo
//
// Created by Tang Yu on 2025/11/19.
//
import WidgetKit
import SwiftUI
import ActivityKit
struct SimpleIslandWidget: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: SimpleIslandAttributes.self) { context in
// UI shown on the Lock Screen
VStack {
Text("Lock Screen Notification: \(context.state.message)")
}
.activityBackgroundTint(Color.cyan)
.activitySystemActionForegroundColor(Color.black)
} dynamicIsland: { context in
// Inside Widget Extension
DynamicIsland {
// Expanded Region
DynamicIslandExpandedRegion(.center) {
Text("Test") // Pure text only
}
} compactLeading: {
Text("L") // Pure text only
} compactTrailing: {
Text("R") // Pure text only
} minimal: {
Text("M") // Pure text only
}
}
}
}
Additional Info:
This is the minimal code setup I created for testing, but even this basic version is failing.
I have set NSSupportsLiveActivities (Supports Live Activities) to YES (true) in the Info.plist for both the Main App and the Widget Extension.
Has anyone experienced this? Any help would be appreciated.
My project uses the UINavigationController's largeTitle on the latest iOS 26.1, but I found that when I set the backgroundColor, the navigation bar's largeTitle disappeared after switching between normal and large titles. I checked the latest documentation and consulted AI, but I have not found any good solutions. For the demo project, please refer to FB20986869
Hey there,
I have an app that allows picking any folder via UIDocumentPickerViewController. Up until iOS18 users were able to pick folders from connected servers (servers connected in the Files app) as well.
On iOS26, the picker allows for browsing into the connected servers, but the Select button is greyed out and does nothing when tapped.
Is this a known issue? This breaks the whole premise of my file syncronization application.
Noticed when using .glassEffect within NavigationStack gives different result when interacting with view.
When it is not in NavigationStack, when view pressed, glassEffect is within Capsule, clipped.
But when used with NavigationStack, pressing view gives additional background effect in rectangle form.
In image can see this effect, it is subtle but in other scenarios its much more visible.
Is there a way how to use glassEffect without rectangle appearing in NavigationStack?
Here is full code for this example.
struct ExampleGlass: View {
var body: some View {
GlassObject()
.padding()
.background(.blue)
}
}
struct ExampleGlassNavStack: View {
var body: some View {
NavigationStack {
GlassObject()
.padding()
.background(.blue)
}
}
}
struct GlassObject: View {
var body: some View {
Capsule()
.frame(height: 150)
.glassEffect(.clear.interactive())
}
}
#Preview {
ExampleGlass()
ExampleGlassNavStack()
}