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

Best Way to Help Users Diagnose iOS App Crashes with No UI Feedback
Hi all, We're working on an iOS application and would like to improve our ability to diagnose failures - especially in scenarios where the app crashes before it can present any UI to the user. A few specific questions: In case of an exception or crash, is there a way to log the issue so the user (or our support team) can understand the cause of the failure? If the app crashes abruptly (e.g., due to a runtime exception or crash during launch), is there a recommended way to persist error information before the process terminates? Are there Apple-supported mechanisms (like crash reporting tools or APIs) we can integrate that would help us capture such issues? What’s the best practice for enabling support teams to assist users based on crash reports - especially for crashes that happen before any user interaction? Our goal is to make sure users aren't left in the dark if the app fails to start, and to allow us to deliver timely updates or support based on the cause of the crash. Thanks in advance for your guidance!
Topic: UI Frameworks SubTopic: General Tags:
0
0
121
May ’25
popover no longer anchoring
My old UIKit popovers are no longer anchoring to their sourceView and sourceRect. Started happening while testing on IPadOS 18.5 after updating to Xcode 16.4. Has anyone else had to fix this problem? Popovers now slide up from the bottom to the center of the screen.
Topic: UI Frameworks SubTopic: UIKit
1
0
78
Jun ’25
how to get subviews of a SwiftUI view in UIKit environment
I have a SwiftUI view that I have wrapped using UIHostingController for use within UIKit. Requirement: Within the UIKit environment, I want to get all the subviews of this SwiftUI view and determine whether the images within those subviews have finished loading. For UIKit views, we can use view.subviews to get all the subviews and do the check. However, for SwiftUI views, I found that the view.subviews turns out to be an empty array, making it impossible to do further checks. So the question is How can I get the subviews of a SwiftUI view?
2
0
142
May ’25
Long press gesture on SwiftUI's Map View (watchOS)
Hi there, I’m developing a watchOS app using SwiftUI, and I want to allow users to interact with the map using the panning gesture and also drop waypoints by long pressing anywhere on the map—just like in the built-in Apple Maps app on watchOS, where a long press drops a pin and panning still works seamlessly. However, with SwiftUI’s Map, any attempt to attach a gesture other than .onTapGesture (such as LongPressGesture or DragGesture) seems to block the built-in map interactions, making panning impossible. Is there a supported approach to detect long press gestures anywhere on the map while still allowing all standard map interactions (as seen in Apple Maps on watchOS)? Or is this something only possible with private APIs or internal access? Any guidance or best practices would be greatly appreciated! Thank you!
1
0
175
Jun ’25
App Clip links encoded as a QR Code do not load when scanned on an iPhone camera
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!
2
4
294
Jun ’25
Can SwiftUI View Receive a Call When Window Will Close?
I have an NSStatusBar application. This is my first in SwiftUI. And I need to know when the window is closed so that I can disable some of menu commands. I can use NSWindowDelegate with AppDelegate as follows. import SwiftUI @main struct SomeApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @StateObject private var menuViewModel = MenuViewModel() var body: some Scene { WindowGroup { ContentView() .environmentObject(menuViewModel) } } } class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate { private var menuViewModel = MenuViewModel() func applicationDidFinishLaunching(_ notification: Notification) { if let window = NSApplication.shared.windows.first { window.setIsVisible(false) window.delegate = self } } func windowWillClose(_ notification: Notification) { menuViewModel.windowClosed = true } } When the window will close, MenuViewModel (ObservableObject) will receive a call, which I want my ContentView to receive. But, so far, it won't. import SwiftUI struct ContentView: View { var body: some View { ZStack { ... ... } .onReceive(statusBarViewModel.$windowClosed) { result in // never called... } } } Can a SwiftUI View receive a call somehow when its window closes? Muchos thankos.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
3
1
655
Jun ’25
ARView rotation animation changes when coming back to it from a navigationLink
I have an app that uses RealityKit and ARKit, which includes some capturing features (to capture and image with added Entities). I have a navigationLink that allows the user to see the gallery of the images he has taken. When launching the App, the rotation animation of the ARView happens smoothly, the navigationBar transitions from one orientation to another with the ARView keeping it's orientation. However, when I go to the galeryView to see the images and go back to the root view where the ARView is, the rotation animation of the ARView changed: When transitioning from one orientation to another, the ARView is flipped by 90° before transitioning to the new orientation. The issue is shown in this gif (https://i.stack.imgur.com/IOvCx.gif) Any idea why this happens and how I could resolve it without locking the App's orientation changes? Thanks!
1
0
848
May ’25
tabItem vs. Tab() — how to support iOS 17 and 18?
Hi, I'm adding tabs to the iOS version of my multiplatform app using TabView. I want the individual tabs to have names and icons. In iOS 17 and below, I have to do this using: tabContent().tabItem { Label(titleKey, systemImage: systemImage) } but this is deprecated, so in iOS 18 I would like to use the new version: Tab(titleKey, image: systemImage) { content() } It would be annoying to have to have the two cases for each individual tab, so I'm trying to abstract it into a custom SwiftUI view like this: var body: some View { if #available(iOS 18.0, *) { Tab(titleKey, image: systemImage) { content() } } else { content().tabItem { Label(titleKey, systemImage: systemImage) } } } There's a bit more to the custom view because I also have cases for iPad and macOS where I just have the views next to each other without tabs, but that's not really relevant to the question other than providing further motivation for abstracting this. However, with this code, I get the error: 'buildExpression' is unavailable: this expression does not conform to 'View' on the Tab line, because Tab isn't a view, and it can only be used directly inside a TabView. For now at least, I can just use tabItem on all iOS versions and it works, but I'd prefer not to in case it is removed some time soon. I do want to support iOS 17 because that's what my iPad runs. Is there any clean way to do this?
Topic: UI Frameworks SubTopic: SwiftUI Tags:
1
0
266
May ’25
Question about `UITextField`'s `markedTextRange` when handling Korean input
I'm currently working on implementing a character limit for Korean text input using UITextField, but I've encountered two key issues. 1. How can I determine if Korean input is complete? I understand that markedTextRange represents provisional (composing) text during multistage text input systems (such as Korean, Japanese, Chinese). While testing with Korean input, I expected markedTextRange to reflect the composing state. However, it seems that markedTextRange remains nil throughout the composition process. 2. Problems limiting character count for Korean input I’ve tried two methods to enforce a character limit. Both lead to incorrect behavior due to how Korean characters are composed. Method 1 – Before replacement: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } return text.count <= 5 } This checks the text length before applying the replacementString. The issue is that when the user enters a character that is meant to combine with the previous one to form a composed character, the input should result in a single, combined character. However, because the character limit check is based on the state before the replacement is applied, the second character does not get composed as expected. Method 2 – After change: textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged) @objc private func editingChanged(_ sender: UITextField) { guard var text = sender.text else { return } if text.count > limitCount { text.removeLast() sender.text = text } } This removes the last character if the count exceeds the limit after the change. But when a user keeps typing past the limit, the last character is overwritten by new input. I suspect this happens because the .editingChanged event occurs before the multistage input is finalized, and the final composed character is applied after that event. My understanding of the input flow: Standard input: shouldChangeCharactersIn is called replacementString is applied .editingChanged is triggered With multistage input (Korean, etc.): shouldChangeCharactersIn is called replacementString is applied .editingChanged is triggered Final composed character is inserted (after all the above) Conclusion Because both approaches lead to incorrect character count behavior with Korean input, I believe I need a new strategy. Is there an officially recommended way to handle multistage input properly with UITextField in this context? Any advice or clarification would be greatly appreciated. MacOS 15.5(24F74) Xcode 16.4 (16F6)
2
0
198
Jun ’25
ARKit Camera Feed Zoom & Macro Support for Close-Range Objects
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.
0
0
232
May ’25
visionOS 26.0 beta does not call .onTapGesture
Prior to visionOS 2.5, .onTapGesture was called with the following structure, but in visionOS 26.0 beta, it is no longer called. Is .onTapGesture deprecated in visionOS 26.0 and above? Or is it a bug? TabView(selection: $selectedTab) { WebViewView(selectedTab: $selectedTab) .onTapGesture { viewModel.userDidInteract = true } }
2
0
110
Jun ’25
Mac Catalyst SplitViewController, UITitlebar bugs?
Bringing my iPad app to Mac Catalyst as iPad idiom. Primary interface is a UISplitViewController. Two things I think are bugs unless someone replies with a fix. SplitViewController is setup in two column with left column as sidebar: split.setViewController(primary, for: .primary) split.setViewController(secondary, for: .secondary) split.preferredDisplayMode = .oneBesideSecondary split.preferredSplitBehavior = .tile split.presentsWithGesture = true #if targetEnvironment(macCatalyst) split.primaryBackgroundStyle = .sidebar split.displayModeButtonVisibility = .never #endif The displayMode button aligns vertically with the navigation bar and below the 3 window control buttons (close, minimize, full screen), whereas on other macOS apps using SplitViewController such as Apple Notes app, the displayMode button aligns vertically and just to the right of the the 3 window control buttons (close, minimize, full screen). I downloaded the Apple Example app called Menus that is supposed to be a prime example of a Mac Catalyst app, and I see author must have faced the same bug and instead created their own displayMode button and placed it on the UITitlebar's toolBar. In my secondary ViewController which is a subclass of a UITableViewController, tapping a row, calls show and in a SplitViewController, that pushes another detailVC onto the Nav stack as expected. The UIWindowScene's UITitlebar which appears over the top of the secondary VC looks correct. This detailVC is a subclass of a UITableViewController. Finally, tapping a row in the table of the detailVC calls show but this time, the ViewController is actually a UIHostingViewController wrapping a SwiftUI View. At this point the UIWindowScene's UITitlebar changes appearance and takes on the same lightened color similar to the sidebar (primary) appearance. With UITitlebarTitleVisibility set to hidden and if I set the titlebar.toolbar to nil, (which removes the UITitlebar, there is no appearance issue. Running on iPad, with no UITitlebar, there is no odd lightening experienced when the UIHostingController is shown. I think this has something to do with the UIHostingController within Mac Catalyst.
1
0
230
May ’25
How to listen for Locale change event in iOS using NSLocale.currentLocaleDidChangeNotification?
I have the following function private func SetupLocaleObserver () { NotificationCenter.default.addObserver ( forName: NSLocale.currentLocaleDidChangeNotification, object: nil, queue: .main ) {_ in print ("Locale changed to: \(Locale.current.identifier)"); } } I call this function inside the viewDidLoad () method of my view controller. The expectation was that whenever I change the system or app-specific language preference, the locale gets changed, and this change triggers my closure which should print "Locale changed to: " on the console. However, the app gets terminated with a SIGKILL whenever I change the language from the settings. So, it is observed that sometimes my closure runs, while most of the times it does not run - maybe the app dies even before the closure is executed. So, the question is, what is the use of this particular notification if the corresponding closure isn't guaranteed to be executed before the app dies? Or am I using it the wrong way?
1
0
316
Jun ’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
75
May ’25
SwiftUI List features within complex grids of content
Our app displays complex, data-driven layouts that can display grids of items in addition to full width rows (essentially, nested lists). We'd like to be able to preserve cell/item portability (i.e., display in any content strip) and allow them to carry capabilities like swipe actions. In UIKit we have features in compositional layout that allow for this. However, in SwiftUI the only support seems to be at the List level. Nesting a List within a ScrollView to get swipe actions feels like a dark road. We've rolled our own swipe actions system, but we'd much rather use a native solution. Any other options here? Improvement ticket here FB17994843.
1
1
81
Jun ’25
viewIsAppearing not be called in children Controllers below iOS 16?
I see viewIsAppearing is available on iOS 13 and above, but when I use it, found that the function not be called below iOS 16 https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing environment: Macos 14.4.1, Xcode 15.3 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let sub = SubViewController() addChild(sub) view.addSubview(sub.view) } @available(iOS 13.0, *) override func viewIsAppearing(_ animated: Bool) { super.viewIsAppearing(animated) print("ViewController viewIsAppearing") } } class SubViewController: UIViewController { @available(iOS 13.0, *) override func viewIsAppearing(_ animated: Bool) { super.viewIsAppearing(animated) print("SubViewController viewIsAppearing") } } In iOS 15 devcice console log: ViewController viewIsAppearing iOS 16, 17: ViewController viewIsAppearing SubViewController viewIsAppearing
Topic: UI Frameworks SubTopic: UIKit Tags:
3
0
1k
May ’25
UIPanGestureRecognizer is broken on iPadOS26
import UIKit class ViewController: UIViewController { var panGesture = UIPanGestureRecognizer() override func viewDidLoad() { super.viewDidLoad() panGesture.isEnabled = true panGesture.minimumNumberOfTouches = 0 panGesture.maximumNumberOfTouches = 5 panGesture.allowedScrollTypesMask = .continuous panGesture.addTarget(self, action: #selector(gestureUpdate(_:))) view.addGestureRecognizer(panGesture) } @objc private func gestureUpdate(_ gesture: UIPanGestureRecognizer) { print("OS: \(osVersion), date: \(Date.now), numberOfTouches: \(gesture.numberOfTouches)") } private var osVersion: String { let osVersion = ProcessInfo.processInfo.operatingSystemVersion return "\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)" } } it's hard to recognize 3 or more fingers gesture on iPadOS26.
Topic: UI Frameworks SubTopic: UIKit
0
1
101
Jun ’25
The URL authorization read and write obtained by UIDocumentPickerViewController
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?
1
0
84
May ’25
Best Way to Help Users Diagnose iOS App Crashes with No UI Feedback
Hi all, We're working on an iOS application and would like to improve our ability to diagnose failures - especially in scenarios where the app crashes before it can present any UI to the user. A few specific questions: In case of an exception or crash, is there a way to log the issue so the user (or our support team) can understand the cause of the failure? If the app crashes abruptly (e.g., due to a runtime exception or crash during launch), is there a recommended way to persist error information before the process terminates? Are there Apple-supported mechanisms (like crash reporting tools or APIs) we can integrate that would help us capture such issues? What’s the best practice for enabling support teams to assist users based on crash reports - especially for crashes that happen before any user interaction? Our goal is to make sure users aren't left in the dark if the app fails to start, and to allow us to deliver timely updates or support based on the cause of the crash. Thanks in advance for your guidance!
Topic: UI Frameworks SubTopic: General Tags:
Replies
0
Boosts
0
Views
121
Activity
May ’25
popover no longer anchoring
My old UIKit popovers are no longer anchoring to their sourceView and sourceRect. Started happening while testing on IPadOS 18.5 after updating to Xcode 16.4. Has anyone else had to fix this problem? Popovers now slide up from the bottom to the center of the screen.
Topic: UI Frameworks SubTopic: UIKit
Replies
1
Boosts
0
Views
78
Activity
Jun ’25
how to get subviews of a SwiftUI view in UIKit environment
I have a SwiftUI view that I have wrapped using UIHostingController for use within UIKit. Requirement: Within the UIKit environment, I want to get all the subviews of this SwiftUI view and determine whether the images within those subviews have finished loading. For UIKit views, we can use view.subviews to get all the subviews and do the check. However, for SwiftUI views, I found that the view.subviews turns out to be an empty array, making it impossible to do further checks. So the question is How can I get the subviews of a SwiftUI view?
Replies
2
Boosts
0
Views
142
Activity
May ’25
Long press gesture on SwiftUI's Map View (watchOS)
Hi there, I’m developing a watchOS app using SwiftUI, and I want to allow users to interact with the map using the panning gesture and also drop waypoints by long pressing anywhere on the map—just like in the built-in Apple Maps app on watchOS, where a long press drops a pin and panning still works seamlessly. However, with SwiftUI’s Map, any attempt to attach a gesture other than .onTapGesture (such as LongPressGesture or DragGesture) seems to block the built-in map interactions, making panning impossible. Is there a supported approach to detect long press gestures anywhere on the map while still allowing all standard map interactions (as seen in Apple Maps on watchOS)? Or is this something only possible with private APIs or internal access? Any guidance or best practices would be greatly appreciated! Thank you!
Replies
1
Boosts
0
Views
175
Activity
Jun ’25
Using Camera in ASWebAuthenticationSession
Is is possible to use the camera in ASWebAuthenticationSession? We want to support signing in with a QR Code in our custom OAuth flow but the browser can't seem to access the camera.
Topic: UI Frameworks SubTopic: General
Replies
0
Boosts
0
Views
98
Activity
May ’25
App Clip links encoded as a QR Code do not load when scanned on an iPhone camera
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!
Replies
2
Boosts
4
Views
294
Activity
Jun ’25
Can SwiftUI View Receive a Call When Window Will Close?
I have an NSStatusBar application. This is my first in SwiftUI. And I need to know when the window is closed so that I can disable some of menu commands. I can use NSWindowDelegate with AppDelegate as follows. import SwiftUI @main struct SomeApp: App { @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate @StateObject private var menuViewModel = MenuViewModel() var body: some Scene { WindowGroup { ContentView() .environmentObject(menuViewModel) } } } class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate { private var menuViewModel = MenuViewModel() func applicationDidFinishLaunching(_ notification: Notification) { if let window = NSApplication.shared.windows.first { window.setIsVisible(false) window.delegate = self } } func windowWillClose(_ notification: Notification) { menuViewModel.windowClosed = true } } When the window will close, MenuViewModel (ObservableObject) will receive a call, which I want my ContentView to receive. But, so far, it won't. import SwiftUI struct ContentView: View { var body: some View { ZStack { ... ... } .onReceive(statusBarViewModel.$windowClosed) { result in // never called... } } } Can a SwiftUI View receive a call somehow when its window closes? Muchos thankos.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
3
Boosts
1
Views
655
Activity
Jun ’25
ARView rotation animation changes when coming back to it from a navigationLink
I have an app that uses RealityKit and ARKit, which includes some capturing features (to capture and image with added Entities). I have a navigationLink that allows the user to see the gallery of the images he has taken. When launching the App, the rotation animation of the ARView happens smoothly, the navigationBar transitions from one orientation to another with the ARView keeping it's orientation. However, when I go to the galeryView to see the images and go back to the root view where the ARView is, the rotation animation of the ARView changed: When transitioning from one orientation to another, the ARView is flipped by 90° before transitioning to the new orientation. The issue is shown in this gif (https://i.stack.imgur.com/IOvCx.gif) Any idea why this happens and how I could resolve it without locking the App's orientation changes? Thanks!
Replies
1
Boosts
0
Views
848
Activity
May ’25
UI Scene
What is UI Scene lifecycle all about? Where is more information about this?
Topic: UI Frameworks SubTopic: UIKit
Replies
1
Boosts
0
Views
98
Activity
Jun ’25
tabItem vs. Tab() — how to support iOS 17 and 18?
Hi, I'm adding tabs to the iOS version of my multiplatform app using TabView. I want the individual tabs to have names and icons. In iOS 17 and below, I have to do this using: tabContent().tabItem { Label(titleKey, systemImage: systemImage) } but this is deprecated, so in iOS 18 I would like to use the new version: Tab(titleKey, image: systemImage) { content() } It would be annoying to have to have the two cases for each individual tab, so I'm trying to abstract it into a custom SwiftUI view like this: var body: some View { if #available(iOS 18.0, *) { Tab(titleKey, image: systemImage) { content() } } else { content().tabItem { Label(titleKey, systemImage: systemImage) } } } There's a bit more to the custom view because I also have cases for iPad and macOS where I just have the views next to each other without tabs, but that's not really relevant to the question other than providing further motivation for abstracting this. However, with this code, I get the error: 'buildExpression' is unavailable: this expression does not conform to 'View' on the Tab line, because Tab isn't a view, and it can only be used directly inside a TabView. For now at least, I can just use tabItem on all iOS versions and it works, but I'd prefer not to in case it is removed some time soon. I do want to support iOS 17 because that's what my iPad runs. Is there any clean way to do this?
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
1
Boosts
0
Views
266
Activity
May ’25
Question about `UITextField`'s `markedTextRange` when handling Korean input
I'm currently working on implementing a character limit for Korean text input using UITextField, but I've encountered two key issues. 1. How can I determine if Korean input is complete? I understand that markedTextRange represents provisional (composing) text during multistage text input systems (such as Korean, Japanese, Chinese). While testing with Korean input, I expected markedTextRange to reflect the composing state. However, it seems that markedTextRange remains nil throughout the composition process. 2. Problems limiting character count for Korean input I’ve tried two methods to enforce a character limit. Both lead to incorrect behavior due to how Korean characters are composed. Method 1 – Before replacement: func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard let text = textField.text else { return true } return text.count <= 5 } This checks the text length before applying the replacementString. The issue is that when the user enters a character that is meant to combine with the previous one to form a composed character, the input should result in a single, combined character. However, because the character limit check is based on the state before the replacement is applied, the second character does not get composed as expected. Method 2 – After change: textField.addTarget(self, action: #selector(editingChanged), for: .editingChanged) @objc private func editingChanged(_ sender: UITextField) { guard var text = sender.text else { return } if text.count > limitCount { text.removeLast() sender.text = text } } This removes the last character if the count exceeds the limit after the change. But when a user keeps typing past the limit, the last character is overwritten by new input. I suspect this happens because the .editingChanged event occurs before the multistage input is finalized, and the final composed character is applied after that event. My understanding of the input flow: Standard input: shouldChangeCharactersIn is called replacementString is applied .editingChanged is triggered With multistage input (Korean, etc.): shouldChangeCharactersIn is called replacementString is applied .editingChanged is triggered Final composed character is inserted (after all the above) Conclusion Because both approaches lead to incorrect character count behavior with Korean input, I believe I need a new strategy. Is there an officially recommended way to handle multistage input properly with UITextField in this context? Any advice or clarification would be greatly appreciated. MacOS 15.5(24F74) Xcode 16.4 (16F6)
Replies
2
Boosts
0
Views
198
Activity
Jun ’25
ARKit Camera Feed Zoom & Macro Support for Close-Range Objects
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.
Replies
0
Boosts
0
Views
232
Activity
May ’25
visionOS 26.0 beta does not call .onTapGesture
Prior to visionOS 2.5, .onTapGesture was called with the following structure, but in visionOS 26.0 beta, it is no longer called. Is .onTapGesture deprecated in visionOS 26.0 and above? Or is it a bug? TabView(selection: $selectedTab) { WebViewView(selectedTab: $selectedTab) .onTapGesture { viewModel.userDidInteract = true } }
Replies
2
Boosts
0
Views
110
Activity
Jun ’25
Mac Catalyst SplitViewController, UITitlebar bugs?
Bringing my iPad app to Mac Catalyst as iPad idiom. Primary interface is a UISplitViewController. Two things I think are bugs unless someone replies with a fix. SplitViewController is setup in two column with left column as sidebar: split.setViewController(primary, for: .primary) split.setViewController(secondary, for: .secondary) split.preferredDisplayMode = .oneBesideSecondary split.preferredSplitBehavior = .tile split.presentsWithGesture = true #if targetEnvironment(macCatalyst) split.primaryBackgroundStyle = .sidebar split.displayModeButtonVisibility = .never #endif The displayMode button aligns vertically with the navigation bar and below the 3 window control buttons (close, minimize, full screen), whereas on other macOS apps using SplitViewController such as Apple Notes app, the displayMode button aligns vertically and just to the right of the the 3 window control buttons (close, minimize, full screen). I downloaded the Apple Example app called Menus that is supposed to be a prime example of a Mac Catalyst app, and I see author must have faced the same bug and instead created their own displayMode button and placed it on the UITitlebar's toolBar. In my secondary ViewController which is a subclass of a UITableViewController, tapping a row, calls show and in a SplitViewController, that pushes another detailVC onto the Nav stack as expected. The UIWindowScene's UITitlebar which appears over the top of the secondary VC looks correct. This detailVC is a subclass of a UITableViewController. Finally, tapping a row in the table of the detailVC calls show but this time, the ViewController is actually a UIHostingViewController wrapping a SwiftUI View. At this point the UIWindowScene's UITitlebar changes appearance and takes on the same lightened color similar to the sidebar (primary) appearance. With UITitlebarTitleVisibility set to hidden and if I set the titlebar.toolbar to nil, (which removes the UITitlebar, there is no appearance issue. Running on iPad, with no UITitlebar, there is no odd lightening experienced when the UIHostingController is shown. I think this has something to do with the UIHostingController within Mac Catalyst.
Replies
1
Boosts
0
Views
230
Activity
May ’25
How to listen for Locale change event in iOS using NSLocale.currentLocaleDidChangeNotification?
I have the following function private func SetupLocaleObserver () { NotificationCenter.default.addObserver ( forName: NSLocale.currentLocaleDidChangeNotification, object: nil, queue: .main ) {_ in print ("Locale changed to: \(Locale.current.identifier)"); } } I call this function inside the viewDidLoad () method of my view controller. The expectation was that whenever I change the system or app-specific language preference, the locale gets changed, and this change triggers my closure which should print "Locale changed to: " on the console. However, the app gets terminated with a SIGKILL whenever I change the language from the settings. So, it is observed that sometimes my closure runs, while most of the times it does not run - maybe the app dies even before the closure is executed. So, the question is, what is the use of this particular notification if the corresponding closure isn't guaranteed to be executed before the app dies? Or am I using it the wrong way?
Replies
1
Boosts
0
Views
316
Activity
Jun ’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
75
Activity
May ’25
SwiftUI List features within complex grids of content
Our app displays complex, data-driven layouts that can display grids of items in addition to full width rows (essentially, nested lists). We'd like to be able to preserve cell/item portability (i.e., display in any content strip) and allow them to carry capabilities like swipe actions. In UIKit we have features in compositional layout that allow for this. However, in SwiftUI the only support seems to be at the List level. Nesting a List within a ScrollView to get swipe actions feels like a dark road. We've rolled our own swipe actions system, but we'd much rather use a native solution. Any other options here? Improvement ticket here FB17994843.
Replies
1
Boosts
1
Views
81
Activity
Jun ’25
viewIsAppearing not be called in children Controllers below iOS 16?
I see viewIsAppearing is available on iOS 13 and above, but when I use it, found that the function not be called below iOS 16 https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing environment: Macos 14.4.1, Xcode 15.3 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let sub = SubViewController() addChild(sub) view.addSubview(sub.view) } @available(iOS 13.0, *) override func viewIsAppearing(_ animated: Bool) { super.viewIsAppearing(animated) print("ViewController viewIsAppearing") } } class SubViewController: UIViewController { @available(iOS 13.0, *) override func viewIsAppearing(_ animated: Bool) { super.viewIsAppearing(animated) print("SubViewController viewIsAppearing") } } In iOS 15 devcice console log: ViewController viewIsAppearing iOS 16, 17: ViewController viewIsAppearing SubViewController viewIsAppearing
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
3
Boosts
0
Views
1k
Activity
May ’25
UIPanGestureRecognizer is broken on iPadOS26
import UIKit class ViewController: UIViewController { var panGesture = UIPanGestureRecognizer() override func viewDidLoad() { super.viewDidLoad() panGesture.isEnabled = true panGesture.minimumNumberOfTouches = 0 panGesture.maximumNumberOfTouches = 5 panGesture.allowedScrollTypesMask = .continuous panGesture.addTarget(self, action: #selector(gestureUpdate(_:))) view.addGestureRecognizer(panGesture) } @objc private func gestureUpdate(_ gesture: UIPanGestureRecognizer) { print("OS: \(osVersion), date: \(Date.now), numberOfTouches: \(gesture.numberOfTouches)") } private var osVersion: String { let osVersion = ProcessInfo.processInfo.operatingSystemVersion return "\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)" } } it's hard to recognize 3 or more fingers gesture on iPadOS26.
Topic: UI Frameworks SubTopic: UIKit
Replies
0
Boosts
1
Views
101
Activity
Jun ’25
The URL authorization read and write obtained by UIDocumentPickerViewController
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?
Replies
1
Boosts
0
Views
84
Activity
May ’25