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

UIHostingController adds extra backgrounds on iOS 26.1, breaks Liquid Glass effect
I was trying to figure out why my bottom sheet looks weird and doesn't have the "proper glass" look. I found that this issue seems to be new to iOS 26.1. See the images below, they show the same view hierarchy (in this case UIHostingController configured as bottom sheet that has NavigationStack and content. On iOS 26.1 there seems to be extra two layers of background - even though I am no adding any. iOS 26: iOS 26.1 Has anyone experienced something similar? Any workarounds? I am happy to completely disable the glass effect for this bottom sheet if it helps. The screenshots show one sheet, but the same thing happens for another ones.
1
2
145
3w
Popovers are broken on Catalyst builds without portrait support
On macOS 15.2, any Mac Catalyst project that does not support portrait iPad orientation will no longer be able to successfully show the contents of any popover controls. This does not appear to be a problem on earlier versions of macOS and it only affects Mac Catalyst builds, not "Designed for iPad" builds. STEPS TO REPRODUCE Create a project that utilizes Mac Catalyst. Create a simple button that shows a popover with simple content. Remove Portrait as a supported orientation. Run the project on macOS 15.2 as a Mac Catalyst build. Note that the content inside the popover is not shown the popover is shown. Run the project as Designed for iPad. Note that the popover content shows correctly.
4
2
369
3w
UIStatusBarHidden doesn't work expectedly on iOS 26
When UIStatusBarHidden is set to YES, the navigation bar is displayed in the wrong vertical position immediately after app launch. The layout only corrects itself after the device orientation changes (e.g., rotation). Steps to Reproduce: Create a new app with a navigation controller. Set UIStatusBarHidden = YES in Info.plist. Launch the app. Expected Result: The navigation bar should appear in the correct position immediately after launch. Actual Result: The navigation bar is misaligned on first launch, and only moves to the correct position after rotating the device.
Topic: UI Frameworks SubTopic: UIKit Tags:
2
1
173
3w
How to place scrollable header content above a Table in SwiftUI?
Hi everyone, I’m trying to reproduce the layout Apple Music uses for playlists, where there is header content above the table (artwork, title, buttons), and when you scroll, everything scrolls together—the header and table rows move as a single scrollable region. Here’s an example of what I’m trying to achieve: I’m using SwiftUI’s Table view and I haven’t found a clean way to place custom content above the table while keeping everything inside the same scroll view. Is there currently a recommended way to achieve Apple Music–style scrollable header + table content using SwiftUI? Thanks!
1
0
146
3w
SwiftUI Slider onEditingChanged is unreliable on iOS 26
For information I stumbled upon a regression with SwiftUI Slider on iOS 26. Its onEditingChanged closure might be called twice when interaction ends, with a final Boolean incorrect value of true provided to the closure. As a result apps cannot reliably rely on this closure to detect when an interaction with the slider starts or ends. I filed a feedback under FB20283439 (iOS 26.0 regression: Slider onEditingChanged closure is unreliable).
7
8
433
3w
Erratic numberPad keyboard behaviour on iPadOS26
Number keys on iPadOS 26 register incorrect/random characters, making numeric input unreliable across all applications. Affected Versions iPadOS 26.0 through 26.1 (build 23B85) Platform-specific: Only iPadOS (iPhone doesn't present the full on-screen keyboard) Reproduction Steps Open any app with a numeric text field (For example, Apple's Contacts) Tap numeric text field - a small number-only pad appears Dismiss this small numpad (tap outside or hit return) Tap the field again - full keyboard with numbers appears Type numbers on this full keyboard Result: Numbers register as random/incorrect characters Scope Affects numeric keyboard types (.numberPad, .decimalPad ) Reproducible in Apple's native apps (Contacts or any apps that has numeric TextField) Impact Critical: Users cannot reliably enter phone numbers, passwords, financial data, or any numeric input. Other findings Keyboard starts to register correct keys when switch from the full on-screen keyboard to alphabetic page, and then back to the page with numeric keys
1
1
169
3w
AlarmKit only triggers a short vibration when the screen is on — bug or expected behavior?
I'm building an alarm app using the new AlarmKit introduced in iOS 26. The alarm works correctly when the device is locked, but when the screen is already on and unlocked, it only gives a single short vibration. I tested another app that also uses AlarmKit just to confirm, and it behaves the same way—only one short vibration if the display is awake, and the developer added a push notification as a workaround. The default iOS Clock app works properly in both situations (though when the screen is on, it uses the Dynamic Island interface). So I'm wondering: is this behavior a bug in AlarmKit, or is it intentional?
Topic: UI Frameworks SubTopic: General
0
0
36
3w
hidesBottomBarWhenPushed is bugged on iOS 26
I am using a common UI pattern: UITabBarController as window root, each tab with a separate UINavigationController stack. I want the (bottom!) tab bar to be only visible when the user is at the root of the app and hide it when a detail page is opened. To do that, I used hidesBottomBarWhenPushed on any view controller that would be pushed on my navigation stacks and that worked fine in the past. But with iOS 26, I am seeing several issues: On iOS where when the bottom tab bar is used, when in a details page and navigating back, the tab bar becomes fully visible immediately instead of slowly animating in as it has been in the past. This is particular visible and annoying when using the "swipe to go back" gesture On iPad, the situation is even worse: On iPadOS 18, the tab bar appeared in the navigation controller's navigation bar - no matter if hidesBottomBarWhenPushed was set or not - fine. But now, with iPadOS 26, this top tab bar disappears when a child is pushed. Not only that, it disappears abruptly, without animation, and the Liquid Glass effect on the UIBarButtonItems is broken as well. There is no transition whatsoever, buttons are simply replaced with the new UIBarButtonItems of the pushed view controller once it became fully visible. It gets even worse when swipe-back navigating on iPadOS: As soon as the back transition starts, the tab bar becomes visible again (without animation), covering the title (view) of the UINavigationController. If the swipe-back transition is not completed the tab bar suddenly stays visible When the swipe-back transition is interrupted close to the end of the transition and it goes back to the pushed view controller, the top UIBarButtonItems are showing a visual glitch where the content (text or icon) stays on the area where the tab bar is, while their container (the glass effect) are on the vertically aligned to the title view. I am surprised that I have not found any similar reports of these problems, so I am wondering if I am doing anything wrong or using hidesBottomBarWhenPushed simply isn't recommended or supported any more.
1
2
245
3w
PaperKit: Adding Images is not functional
When utilizing Paperkit in its simplest form, PaperMarkupViewController does not show the option to add images. Furthermore, trying to add images directly to the PaperMarkup's insertNewImage() function does not display anything. It seems like image functionality is entirely broken on Xcode 26. This can be seen through the following example done by a fellow member here on the forums: https://gist.github.com/clarkezone/68eb3ee13b5607782ceb2e20cece4ab3
3
0
167
3w
Severe Delay When Tapping TextField/Searchable on iOS 18 (Real Device) — XPC “Reporter Disconnected” Loop Until Keyboard Appears
I’m running Xcode 26.1.1 (17B100) with deployment target iOS 18.0+, and I’m seeing a consistent and reproducible issue on real devices (iPhone 13 Pro, iPhone 15 Pro): Problem The first time the user taps into a TextField or a SwiftUI .searchable field after app launch, the app freezes for 30–45 seconds before the keyboard appears. During the freeze, the device console floods with: XPC connection interrupted Reporter disconnected. { function=sendMessage, reporterID=XXXXXXXXXXXX } -[RTIInputSystemClient remoteTextInputSessionWithID:performInputOperation:] perform input operation requires a valid sessionID. inputModality = Keyboard customInfoType = UIEmojiSearchOperations After the keyboard finally appears once, the issue never happens again until the app is force-quit. This occurs on device Reproduction Steps Minimal reproducible setup: Create a new SwiftUI app. Add a single TextField or .searchable modifier. Install Firebase (Firestore or Analytics is enough). Build and run on device. Tap the text field immediately after the home screen appears. Result: App freezes for 30–45 seconds before keyboard appears, with continuous XPC/RTIInputSystem errors in the logs. If Firebase is removed, the issue occurs less often, but still happens occasionally. Even If Firebase initialization is delayed by ~0.5 seconds, the issue is still there. Question Is this a known issue with iOS 18 / RTIInputSystem / Xcode 26.1.1, and is there a recommended workaround? Delaying Firebase initialization avoids the freeze, but this isn’t ideal for production apps with startup authentication requirements. Any guidance or confirmation would be appreciated.
Topic: UI Frameworks SubTopic: SwiftUI
1
0
91
3w
Since iOS 18.3, icons are no longer generated correctly with QLThumbnailGenerator
Since iOS 18.3, icons are no longer generated correctly with QLThumbnailGenerator. No error is returned either. But this error message now appears in the console: Error returned from iconservicesagent image request: <ISTypeIcon: 0x3010f91a0>,Type: com.adobe.pdf - <ISImageDescriptor: 0x302f188c0> - (36.00, 36.00)@3x v:1 l:5 a:0:0:0:0 t:() b:0 s:2 ps:0 digest: B19540FD-0449-3E89-AC50-38F92F9760FE error: Error Domain=NSOSStatusErrorDomain Code=-609 "Client is disallowed from making such an icon request" UserInfo={NSLocalizedDescription=Client is disallowed from making such an icon request} Does anyone know this error? Is there a workaround? Are there new permissions to consider? Here is the code how icons are generated: let request = QLThumbnailGenerator.Request(fileAt: url, size: size, scale: scale, representationTypes: self.thumbnailType) request.iconMode = true let generator = QLThumbnailGenerator.shared generator.generateRepresentations(for: request) { [weak self] thumbnail, _, error in }
16
5
1.3k
3w
AppKit Logging Internal inconsistency Errors on NSMenu on macOS 26.1
Appkit starting logging these warnings in macOS 26.1 about my app's MainMenu. **Internal inconsistency in menus - menu <NSMenu: 0xb91b2ff80> Title: AppName Supermenu: 0xb91a50b40 (Main Menu), autoenable: YES Previous menu: 0x0 (None) Next menu: 0x0 (None) Items: () believes it has [<NSMenuSubclassHereThisIsTheMenuBarMenuForMyApp:] 0xb91a50b40> Title: Main Menu Supermenu: 0x0 (None), autoenable: YES Previous menu: 0x0 (None) Next menu: 0x0 (None) Items: ( ) as a supermenu, but the supermenu does not seem to have any item with that submenu ** I don't what that means. The supermenu is the menu that represents the menu used for my app's menu bar (as described by NSMenuSubclassHereThisIsTheMenuBarMenuForMyApp Everything seems to work fine but log looks scary. Please don't throw!
Topic: UI Frameworks SubTopic: AppKit Tags:
4
0
405
3w
Problem with buildMenuWithBuilder and scenes
Bonjour, I have an (old) app. written in Objective-C which works fine under iPadOS 26 with custom menus and contextual menus but without scenedelegate. To be able to have multi-windows, I added scenedelegate but "buildMenuWithBuilder" is no more called. I asked AI Claude and tried many solutions but none worked. Has anyone else had and solved this problem? Thanks.
Topic: UI Frameworks SubTopic: General
0
0
126
3w
Switching to custom keyboard size glitches
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
0
0
137
3w
[macOS Sequoia] Using RegisterEventHotkey with option and shift modifiers doesn't working anymore
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
22
10
13k
3w
NSTextField behaviour out of control....
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
0
0
74
3w
Dynamic App Clip Card
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
2
0
169
3w
How to implement NFC Reader in SwiftUI?
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?
0
0
240
3w