Construct and manage graphical, event-driven user interfaces for iOS or tvOS apps using UIKit.

Posts under UIKit tag

88 Posts

Post

Replies

Boosts

Views

Activity

Why my CADisplayLink runs at low framerate, but UIScrollView doesn't?
I have a tiny iOS app project set up. I instantiate a CADisplayLink and then log the time that passes between its calls to target-action. This is on an iPhone 15 Pro, so 120 hertz. However, I am observing that in user space, the actual tick rate of my target-action being called is actually fluctuating around 70-80 hertz. But then, I instantiate a UIScrollView and give it a delegate. In the delegate I am observing that scrollViewDidScroll gets called with the correct 120 hz. And if I set a breakpoint inside scrollViewDidScroll, I can see that this is called from a CADisplayLink handler inside UIScrollView. How comes they can have 120hz, and I don't? Of course, I did set UIScreen.maximumFramesPerSecond to preferredFramerateRange, minimum, maximum and preferred. Also, I don no virtually no work in the handler - I am just setting UIView.transform = CGAffineTransform(translationY: 100). Also, my info.plist does indeed contain <key>CADisableMinimumFrameDurationOnPhone</key><true/>
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
192
Jul ’25
Label I Added in Storyboard Appears nil when I try to Dequeue a Cell Using a Data Source Cell Provider
I have added a UICollectionViewCell to my storyboard, and I added a UILabel to my UICollectionViewCell in storyboard. I have created a cell registration using UICollectionView.CellRegistration and have implemented the cellProvider closure for the datasource which dequeue a collection view cell of type TapLabelCollectionViewCell(I have subclassed the cell in my storyboard to this class). In my TapLabelCollectionViewCell, I am trying to set the tap gesture recogniser on the label, but the label appears nil, which I've connected using an @IBOutlet. Why is this and how can I fix it? My code : // UI View Controller: class TapGridViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. tapGridCollectionView.collectionViewLayout = createLayout() configureDataSource() applySnapshot() } func configureDataSource() { let cellRegistration = UICollectionView.CellRegistration<TapLabelCollectionViewCell, CellItem>(handler: { (cell: TapLabelCollectionViewCell, indexPath: IndexPath, item: CellItem) in cell.taplabel.text = String(item.labelCount) }) dataSource = UICollectionViewDiffableDataSource(collectionView: tapGridCollectionView, cellProvider: { (collectionView: UICollectionView, indexPath: IndexPath, item: CellItem) in let cell = collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: item) cell.delegate = self cell.index = indexPath.row return cell }) } } // UI Collection View Cell: protocol TapLabelCollectionViewCellDelegate: AnyObject { func incrementNumberOfTaps(index: Int) } class TapLabelCollectionViewCell: UICollectionViewCell { @IBOutlet var taplabel: UILabel! var delegate: TapLabelCollectionViewCellDelegate? var index: Int! static let identifier = "tapLabelCellIdentifier" override init(frame: CGRect) { super.init(frame: frame) setUpTapGestureRecognizer() } required init?(coder: NSCoder) { super.init(coder: coder) } func setUpTapGestureRecognizer() { let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(incrementNumberOfTaps)) print("tap Label,", taplabel) taplabel.addGestureRecognizer(tapGestureRecognizer) } @objc func incrementNumberOfTaps() { delegate?.incrementNumberOfTaps(index: index) } }
Topic: UI Frameworks SubTopic: UIKit Tags:
9
0
178
Jul ’25
UIScrollEdgeElementContainerInteraction crashed on iOS 26 Beta 3
after i updated to iOS 26.0 Beta3, UIScrollEdgeElementContainerInteraction crashed: let scrollInteraction = UIScrollEdgeElementContainerInteraction() scrollInteraction.edge = .bottom scrollInteraction.scrollView = webView?.scrollView bottomBar.addInteraction(scrollInteraction) i got this crash info:unrecognized selector sent to instance: UIScrollEdgeElementContainerInteraction setEdge: and UIScrollEdgeElementContainerInteraction setScrollView
Topic: UI Frameworks SubTopic: UIKit Tags:
2
3
227
Jul ’25
The Liquid glass blur effect does not show over the UITabBar as content scrolls underneath.
In iOS26, when using a standalone UITabBar without UITabBarController, the liquid glass blur effect is not applied when scrollable content moves behind the tab bar. However, the blur effect appears correctly when using UITabBarController. Sample Screenshots: When using UITababr When using UITababrController Sample Code: class SimpleTabBarController: UIViewController, UITabBarDelegate { let tabBar = UITabBar() let redItem = UITabBarItem(title: "Red", image: .add, tag: 0) let blueItem = UITabBarItem(title: "Blue", image: .checkmark, tag: 1) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white tabBar.items = [redItem, blueItem] tabBar.selectedItem = redItem tabBar.delegate = self tabBar.translatesAutoresizingMaskIntoConstraints = false let tableContainerView = TableContainerView() view.addSubview(tableContainerView) tableContainerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ tableContainerView.topAnchor.constraint(equalTo: view.topAnchor), tableContainerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), tableContainerView.trailingAnchor.constraint(equalTo: view.trailingAnchor), tableContainerView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) view.addSubview(tabBar) NSLayoutConstraint.activate([ tabBar.leadingAnchor.constraint(equalTo: view.leadingAnchor), tabBar.trailingAnchor.constraint(equalTo: view.trailingAnchor), tabBar.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) }
1
0
432
Jul ’25
The async/await API crashes in Xcode 16.3 and later
We use several UIKit and AVFoundation APIs in our project, including: setAlternateIconName(_:completionHandler:) getAllTasks(completionHandler:) loadMediaSelectionGroup(for:completionHandler:) Moreover, we use the Swift Concurrency versions for these APIs: @MainActor func setAlternateIconName(_ alternateIconName: String?) async throws var allTasks: [URLSessionTask] { get async } func loadMediaSelectionGroup(for mediaCharacteristic: AVMediaCharacteristic) async throws -> AVMediaSelectionGroup? Everything worked well with these APIs in Xcode 16.2 and earlier, but starting from Xcode 16.3 (and in 16.4), they cause crashes. We've rewritten the APIs to use completion blocks instead of async/await, and this approach works. Stack traces: setAlternateIconName(_:completionHandler:) var allTasks: [URLSessionTask] { get async } loadMediaSelectionGroup(for:completionHandler:) Also, I attached some screenshots from Xcode 16.4.
6
0
492
Jul ’25
Is the new iPadOS/macOS 26 help icon available in SF Symbols?
Under macOS 26 and iPadOS, the Help menu in many cases has a menu item for "App Help". This item has the following icon: I need to use this in my own app. I am unable to find this icon in SF Symbols 7 beta. I've scanned all of the icons under "What's New". I've searched for "help", "light", and "bulb" and this icon does not appear. Does anyone know if it's even a new SF Symbol? Or does anyone know of a way to use this icon?
2
0
213
Jul ’25
Using GlassEffectContainer with UIKit
I'm working on a UIKit-based iOS app and would like to use the new GlassEffectContainer with liquid glass effects introduced in iOS 26 beta. Currently, I have two buttons (heart and comment) in a UIToolbar and want to wrap them in a glass effect container to get the morphing/blending effect when they're close together. The API appears to be SwiftUI-only: GlassEffectContainer .glassEffect() modifier Is there a UIKit equivalent, or is the recommended approach to embed a SwiftUI view using UIHostingController? I'm already using UIVisualEffectView with UIGlassEffect elsewhere, but that doesn't provide the liquid morphing behavior between multiple views. From, "Applying liquid glass" article: GlassEffectContainer(spacing: 40.0) { HStack(spacing: 40.0) { Image(systemName: "scribble.variable") .frame(width: 80.0, height: 80.0) .font(.system(size: 36)) .glassEffect() Image(systemName: "eraser.fill") .frame(width: 80.0, height: 80.0) .font(.system(size: 36)) .glassEffect() // An `offset` shows how Liquid Glass effects react to each other in a container. // Use animations and components appearing and disappearing to obtain effects that look purposeful. .offset(x: -40.0, y: 0.0) } } Thanks!
Topic: UI Frameworks SubTopic: UIKit Tags:
2
1
454
Jul ’25
UIDefines.h breaking tvOS on 26 in Tahoe
We have an app that optionally includes UIKit, and in Xcode 16.3 it builds just fine, but with Xcode 26 it fails because it cannot find UIDefines.h. Error: /Applications/Xcode-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS26.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKitDefines.h:10:9: fatal error: 'UIUtilities/UIDefines.h' file not found I looked for it, and inside of Xcode 26 there is a new folder(SubFrameworks) inside of the TV Simulator that does not exist in 18 and it only has one thing in that folder and it's UIUtilities.framework. Reference path: /Applications/Xcode-beta.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/SubFrameworks/UIUtilities.framework/ Not sure how to get around this except to put in a bunch of new ifdefines maybe to deal with it, but it is weird that the subframeworks file is part of the issue. Anyone have any ideas besides copying the files over (doesn't work anyway)?
2
1
740
Jul ’25
hidesBottomBarWhenPushed does not work on iOS 26
Since iOS 26, hidesBottomBarWhenPushed no longer works. We have numerous screens in our app which depend on being able to extend content to the bottom of the screen, and this feels like a bug. Consider this example, running the exact same code across iOS 18 and iOS 26. On iOS 18, pushing the button pushes a view controller and the tab bar disappears, on iOS 26, however, pushing the view controller does not hide the tab bar. I've filed this as FB18543961 and attached the sample project.
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
223
Jul ’25
How do I present a UIAlertController from the button that triggers it?
In iOS 26 there is a new way of displaying action sheets from the buttons that triggers them. I figured out that in SwiftUI you can just set the confirmationDialog view modifier on the button that triggers it. However, I can't find a way to get this behavior in UIKit when a UIButton triggers an alert. Has anyone got this work? The behavior is mentioned briefly in the "Get to know the new design system" session.
4
0
305
Jul ’25
EXC_BREAKPOINT, QuartzCore , Crash CA::Render::Image::new_image
We are seeing crashes in Xcode organizer. So far we are not able to reproduce them locally. They affect multiple app releases (some older, built with Xcode 15.x and newer built with Xcode 16.0). They only affect iOS 18.5. Is there anything that changed in latest iOS? It's hard to tell what exactly is causing this crash because setting symbolic breakpoint on CA::Render::Image::new_image(unsigned int, unsigned int, unsigned int, unsigned int, CGColorSpace*, void const*, unsigned long const*, void (*)(void const*, void*), void*) triggers this breakpoint all the time, but not necessarily with exactly the previous stack frames matching the crash report. Is it a known issue? crash.crash Thank you.
0
5
591
Jul ’25
In iOS 26, the tab bar never disappears when new controller is pushed
In my app, I have a tab bar controller whose first tab is a navigation controller. Taking a certain action in that controller will push a new controller onto the navigation stack. The new controller has hidesBottomBarWhenPushed set to true, which hides the tab bar and shows the new controller's toolbar. It's worked like this for years. But in the iOS 26 simulator (I don't have the beta installed on any physical iPhones yet), when I tried this behavior in my app, I instead saw: the tab bar remained exactly where it was when I pushed the new controller the toolbar never appeared at all and all of its buttons were inaccessible If you set the deployment target to iOS 18 and run the code in an iOS 18 simulator: when you tap "Tap Me", the new controller is pushed onto the screen simultaneously, the tab bar hides and the second controller's toolbar appears. If you set the deployment target to iOS 26 and run the code in an iOS 26 simulator: when you tap "Tap Me", the new controller is pushed onto the screen the toolbar never appears and the tab bar remains unchanged after the push animation completes Is this a bug in the iOS 26 beta, or is it an intentional behavior change in how hidesBottomBarWhenPushed works in these cases? Below is sample code that reproduces the problem: class TabController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = UIButton(type: .roundedRect, primaryAction: UIAction(title: "Test Action") { action in let newController = SecondaryController() self.navigationController!.pushViewController(newController, animated: true) }) button.setTitle("Tap Me", for: .normal) button.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(button) NSLayoutConstraint.activate([ self.view.centerXAnchor.constraint(equalTo: button.centerXAnchor), self.view.centerYAnchor.constraint(equalTo: button.centerYAnchor), ]) } } class SecondaryController: UIViewController { override func loadView() { super.loadView() self.toolbarItems = [ UIBarButtonItem(image: UIImage(systemName: "plus"), style: .plain, target: nil, action: nil) ] } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.isToolbarHidden = false } } class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? var tabController: UITabBarController? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let tab1 = UITab(title: "Test 1", image: UIImage(systemName: "globe"), identifier: "test1") { _ in UINavigationController(rootViewController: TabController()) } let tab2 = UITab(title: "Test 2", image: UIImage(systemName: "globe"), identifier: "test2") { _ in UINavigationController(rootViewController: TabController()) } window = UIWindow(windowScene: windowScene) self.tabController = UITabBarController(tabs: [tab1, tab2]) self.window!.rootViewController = self.tabController self.window!.makeKeyAndVisible() } }
Topic: UI Frameworks SubTopic: UIKit Tags:
2
1
714
Jul ’25
`UIHostingConfiguration` for cells not cancelling touches on `UIScrollView` scroll (drag)?
The default behavior on UIScrollView is that "canCancelContentTouches" is true. If you add a UIButton to a UICollectionViewCell and then scroll (drag) the scroll view with a touch beginning on that button in that cell, it cancels ".touchUpInside" on the UIButton. However, if you have a Button in a SwiftUI view configured with "contentConfiguration" it does not cancel the touch, and the button's action is triggered if the user is still touching that cell when the scroll (drag) completes. Is there a way to forward the touch cancellations to the SwiftUI view, or is it expected that all interactivity is handled only in UIKit, and not inside of "contentConfiguration" in specific cases? This behavior seems to occur on all SwiftUI versions supporting UIHostingConfiguration so far.
4
0
110
Jun ’25
How to determine if a cold start is a background launch when using SceneDelegate (scene-based lifecycle)
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (application.applicationState == UIApplicationStateBackground) { // ✅ Background launch } else { // ✅ Normal foreground launch } } Previously, when using AppDelegate to handle lifecycle methods, I could determine whether a cold start was a background launch as shown above. This allowed me to accurately measure cold start time for real-world users. The platform now requires migration to scene-based lifecycle management by iOS 16. However, after migration: In both application:didFinishLaunchingWithOptions: and scene:willConnectToSession:options: methods, application.applicationState == UIApplicationStateBackground and scene.activationState == UISceneActivationStateUnattached These values remain fixed regardless of whether it's a background launch, making them unusable for differentiation. I attempted to use information from UISceneConnectionOptions for distinction but found it ineffective. Question: Are there alternative approaches to achieve this distinction?
1
0
152
Jun ’25
Ambiguous use of 'textField' in Xcode 26
func textField( _ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String ) -&gt; Bool { if let delegate = delegate, let shouldChangeCharactersIn = delegate.textField { return shouldChangeCharactersIn(textField, range, string) } return true } This is from an extension extension TextInput: UITextFieldDelegate, ObservableTextFieldDelegateProtocol { The delegate is already a UITextFieldDelegate, but when you click on the error, it returns 7 instances of: "Found this candidate in module 'UIKit' (UIKit.UITextFieldDelegate.textField)" This doesn't give an error in Xcode 16. Is this an Xcode 26 bug?
0
0
244
Jun ’25
TN3187: Question About AppDelegate and SceneDelegate Lifecycle Method Behaviors During Migration to the UIKit Scene-Based Life Cycle
Hello, I’m currently working on migrating an existing AppDelegate-based application to use the scene-based life cycle, as recommended in the TN3187 technical note. As part of this process, I’ve been conducting some tests. After completely removing the scene-based setup (i.e., removing the UIApplicationSceneManifest from Info.plist and deleting SceneDelegate.swift), the app runs in a legacy AppDelegate-only life cycle as expected. In this case, lifecycle methods such as applicationWillEnterForeground and applicationDidEnterBackground in the AppDelegate are called properly. SceneDelegate methods are, naturally, not called—since the class is removed. However, here’s where the confusion arises: Even in this AppDelegate-only configuration, if I register for UIScene notifications via NotificationCenter, the corresponding selectors are invoked at runtime, which suggests that UIScene lifecycle notifications are still being broadcast internally by the system. Below is the test code I used, along with console output: func addObserver() { NotificationCenter.default.addObserver(self, selector: #selector(appDidEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) if #available(iOS 13.0, *) { NotificationCenter.default.addObserver(self, selector: #selector(sceneDidEnterBackground), name: UIScene.didEnterBackgroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(sceneWillEnterForeground), name: UIScene.willEnterForegroundNotification, object: nil) } } @objc func sceneWillEnterForeground() { print("sceneWillForeground") } @objc func sceneDidEnterBackground() { print("sceneDidEnterBackground") } @objc func appWillEnterForeground() { print("appWillEnterForeground") } @objc func appDidEnterBackground() { print("appDidEnterBackground") } sceneWillForeground AppDelegate::willenterforeground appWillEnterForeground So, my question is: Even in an AppDelegate-only app running on iOS 13 or later, is it expected behavior that UIScene lifecycle notifications such as UIScene.didEnterBackgroundNotification and UIScene.willEnterForegroundNotification are still posted by the system? === Additional Question: The TN3187 note lists only four methods to migrate between AppDelegate and SceneDelegate. Are there any other lifecycle methods (beyond the four listed) that also require manual migration during this transition? Thank you in advance for your insights.
Topic: UI Frameworks SubTopic: UIKit Tags:
1
0
244
Jun ’25
Creating UI instance using 'XML' like data at runtime
In windows there is a support for generating Xaml strings at runtime for the UI artefact and use it on the main thread for loading the Xaml strings with properties and creating the UI artefact. Below is a code example for it. static void createxaml(hstring & str) { str = LR"( <Button xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation Name="MyButton" Content="Click Me" Width="200" Height="60" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" FontFamily="Segoe UI" Foreground="White" )"; } { hstring xaml; createxaml(xaml); Button obj = XamlReader::Load(xaml).as<Button>(); } My question is, Is there similar support available in uikit to create ui instances like UIButton. Is there some native support from apple that allows us to create a button object using an XML like string?
Topic: UI Frameworks SubTopic: General Tags:
2
0
118
Jun ’25
Why my CADisplayLink runs at low framerate, but UIScrollView doesn't?
I have a tiny iOS app project set up. I instantiate a CADisplayLink and then log the time that passes between its calls to target-action. This is on an iPhone 15 Pro, so 120 hertz. However, I am observing that in user space, the actual tick rate of my target-action being called is actually fluctuating around 70-80 hertz. But then, I instantiate a UIScrollView and give it a delegate. In the delegate I am observing that scrollViewDidScroll gets called with the correct 120 hz. And if I set a breakpoint inside scrollViewDidScroll, I can see that this is called from a CADisplayLink handler inside UIScrollView. How comes they can have 120hz, and I don't? Of course, I did set UIScreen.maximumFramesPerSecond to preferredFramerateRange, minimum, maximum and preferred. Also, I don no virtually no work in the handler - I am just setting UIView.transform = CGAffineTransform(translationY: 100). Also, my info.plist does indeed contain <key>CADisableMinimumFrameDurationOnPhone</key><true/>
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
192
Activity
Jul ’25
Label I Added in Storyboard Appears nil when I try to Dequeue a Cell Using a Data Source Cell Provider
I have added a UICollectionViewCell to my storyboard, and I added a UILabel to my UICollectionViewCell in storyboard. I have created a cell registration using UICollectionView.CellRegistration and have implemented the cellProvider closure for the datasource which dequeue a collection view cell of type TapLabelCollectionViewCell(I have subclassed the cell in my storyboard to this class). In my TapLabelCollectionViewCell, I am trying to set the tap gesture recogniser on the label, but the label appears nil, which I've connected using an @IBOutlet. Why is this and how can I fix it? My code : // UI View Controller: class TapGridViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. tapGridCollectionView.collectionViewLayout = createLayout() configureDataSource() applySnapshot() } func configureDataSource() { let cellRegistration = UICollectionView.CellRegistration<TapLabelCollectionViewCell, CellItem>(handler: { (cell: TapLabelCollectionViewCell, indexPath: IndexPath, item: CellItem) in cell.taplabel.text = String(item.labelCount) }) dataSource = UICollectionViewDiffableDataSource(collectionView: tapGridCollectionView, cellProvider: { (collectionView: UICollectionView, indexPath: IndexPath, item: CellItem) in let cell = collectionView.dequeueConfiguredReusableCell(using: cellRegistration, for: indexPath, item: item) cell.delegate = self cell.index = indexPath.row return cell }) } } // UI Collection View Cell: protocol TapLabelCollectionViewCellDelegate: AnyObject { func incrementNumberOfTaps(index: Int) } class TapLabelCollectionViewCell: UICollectionViewCell { @IBOutlet var taplabel: UILabel! var delegate: TapLabelCollectionViewCellDelegate? var index: Int! static let identifier = "tapLabelCellIdentifier" override init(frame: CGRect) { super.init(frame: frame) setUpTapGestureRecognizer() } required init?(coder: NSCoder) { super.init(coder: coder) } func setUpTapGestureRecognizer() { let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(incrementNumberOfTaps)) print("tap Label,", taplabel) taplabel.addGestureRecognizer(tapGestureRecognizer) } @objc func incrementNumberOfTaps() { delegate?.incrementNumberOfTaps(index: index) } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
9
Boosts
0
Views
178
Activity
Jul ’25
UIScrollEdgeElementContainerInteraction crashed on iOS 26 Beta 3
after i updated to iOS 26.0 Beta3, UIScrollEdgeElementContainerInteraction crashed: let scrollInteraction = UIScrollEdgeElementContainerInteraction() scrollInteraction.edge = .bottom scrollInteraction.scrollView = webView?.scrollView bottomBar.addInteraction(scrollInteraction) i got this crash info:unrecognized selector sent to instance: UIScrollEdgeElementContainerInteraction setEdge: and UIScrollEdgeElementContainerInteraction setScrollView
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
3
Views
227
Activity
Jul ’25
The Liquid glass blur effect does not show over the UITabBar as content scrolls underneath.
In iOS26, when using a standalone UITabBar without UITabBarController, the liquid glass blur effect is not applied when scrollable content moves behind the tab bar. However, the blur effect appears correctly when using UITabBarController. Sample Screenshots: When using UITababr When using UITababrController Sample Code: class SimpleTabBarController: UIViewController, UITabBarDelegate { let tabBar = UITabBar() let redItem = UITabBarItem(title: "Red", image: .add, tag: 0) let blueItem = UITabBarItem(title: "Blue", image: .checkmark, tag: 1) override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .white tabBar.items = [redItem, blueItem] tabBar.selectedItem = redItem tabBar.delegate = self tabBar.translatesAutoresizingMaskIntoConstraints = false let tableContainerView = TableContainerView() view.addSubview(tableContainerView) tableContainerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ tableContainerView.topAnchor.constraint(equalTo: view.topAnchor), tableContainerView.leadingAnchor.constraint(equalTo: view.leadingAnchor), tableContainerView.trailingAnchor.constraint(equalTo: view.trailingAnchor), tableContainerView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) view.addSubview(tabBar) NSLayoutConstraint.activate([ tabBar.leadingAnchor.constraint(equalTo: view.leadingAnchor), tabBar.trailingAnchor.constraint(equalTo: view.trailingAnchor), tabBar.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) }
Replies
1
Boosts
0
Views
432
Activity
Jul ’25
The async/await API crashes in Xcode 16.3 and later
We use several UIKit and AVFoundation APIs in our project, including: setAlternateIconName(_:completionHandler:) getAllTasks(completionHandler:) loadMediaSelectionGroup(for:completionHandler:) Moreover, we use the Swift Concurrency versions for these APIs: @MainActor func setAlternateIconName(_ alternateIconName: String?) async throws var allTasks: [URLSessionTask] { get async } func loadMediaSelectionGroup(for mediaCharacteristic: AVMediaCharacteristic) async throws -> AVMediaSelectionGroup? Everything worked well with these APIs in Xcode 16.2 and earlier, but starting from Xcode 16.3 (and in 16.4), they cause crashes. We've rewritten the APIs to use completion blocks instead of async/await, and this approach works. Stack traces: setAlternateIconName(_:completionHandler:) var allTasks: [URLSessionTask] { get async } loadMediaSelectionGroup(for:completionHandler:) Also, I attached some screenshots from Xcode 16.4.
Replies
6
Boosts
0
Views
492
Activity
Jul ’25
System close and prominent done buttons in SwiftUI
How do you create a toolbar item using the standard system close button or prominent done (✔️) button in SwiftUI? In UIKit UIBarButtonItem provides .close and .done system items, and to get the tinted checkmark for done you set style = .prominent.
Replies
2
Boosts
0
Views
245
Activity
Jul ’25
Trying to Connect an Outlet to a Gesture Recogniser in Storyboard
I connected a tap gesture recogniser to a label in storyboard by dragging a tap gesture recogniser object onto the label. When I connect the outlet to the gesture recogniser I get this error: How can I connect the tap gesture recogniser in storyboard to my code?
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
3
Boosts
0
Views
267
Activity
Jul ’25
Is the new iPadOS/macOS 26 help icon available in SF Symbols?
Under macOS 26 and iPadOS, the Help menu in many cases has a menu item for "App Help". This item has the following icon: I need to use this in my own app. I am unable to find this icon in SF Symbols 7 beta. I've scanned all of the icons under "What's New". I've searched for "help", "light", and "bulb" and this icon does not appear. Does anyone know if it's even a new SF Symbol? Or does anyone know of a way to use this icon?
Replies
2
Boosts
0
Views
213
Activity
Jul ’25
cornerConfiguration API not available for UIVisualEffectView()
Hi, There is new cornerConfiguration API introduced for UIVisualEffectView mentioned in tutorial below. https://developer.apple.com/videos/play/wwdc2025/284/ But it is not available to use as of now. Using Xcode 26 Beta 2. Please get it fixed.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
199
Activity
Jul ’25
Using GlassEffectContainer with UIKit
I'm working on a UIKit-based iOS app and would like to use the new GlassEffectContainer with liquid glass effects introduced in iOS 26 beta. Currently, I have two buttons (heart and comment) in a UIToolbar and want to wrap them in a glass effect container to get the morphing/blending effect when they're close together. The API appears to be SwiftUI-only: GlassEffectContainer .glassEffect() modifier Is there a UIKit equivalent, or is the recommended approach to embed a SwiftUI view using UIHostingController? I'm already using UIVisualEffectView with UIGlassEffect elsewhere, but that doesn't provide the liquid morphing behavior between multiple views. From, "Applying liquid glass" article: GlassEffectContainer(spacing: 40.0) { HStack(spacing: 40.0) { Image(systemName: "scribble.variable") .frame(width: 80.0, height: 80.0) .font(.system(size: 36)) .glassEffect() Image(systemName: "eraser.fill") .frame(width: 80.0, height: 80.0) .font(.system(size: 36)) .glassEffect() // An `offset` shows how Liquid Glass effects react to each other in a container. // Use animations and components appearing and disappearing to obtain effects that look purposeful. .offset(x: -40.0, y: 0.0) } } Thanks!
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
1
Views
454
Activity
Jul ’25
UIDefines.h breaking tvOS on 26 in Tahoe
We have an app that optionally includes UIKit, and in Xcode 16.3 it builds just fine, but with Xcode 26 it fails because it cannot find UIDefines.h. Error: /Applications/Xcode-beta.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS26.0.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIKitDefines.h:10:9: fatal error: 'UIUtilities/UIDefines.h' file not found I looked for it, and inside of Xcode 26 there is a new folder(SubFrameworks) inside of the TV Simulator that does not exist in 18 and it only has one thing in that folder and it's UIUtilities.framework. Reference path: /Applications/Xcode-beta.app/Contents/Developer/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/System/Library/SubFrameworks/UIUtilities.framework/ Not sure how to get around this except to put in a bunch of new ifdefines maybe to deal with it, but it is weird that the subframeworks file is part of the issue. Anyone have any ideas besides copying the files over (doesn't work anyway)?
Replies
2
Boosts
1
Views
740
Activity
Jul ’25
hidesBottomBarWhenPushed does not work on iOS 26
Since iOS 26, hidesBottomBarWhenPushed no longer works. We have numerous screens in our app which depend on being able to extend content to the bottom of the screen, and this feels like a bug. Consider this example, running the exact same code across iOS 18 and iOS 26. On iOS 18, pushing the button pushes a view controller and the tab bar disappears, on iOS 26, however, pushing the view controller does not hide the tab bar. I've filed this as FB18543961 and attached the sample project.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
223
Activity
Jul ’25
How do I present a UIAlertController from the button that triggers it?
In iOS 26 there is a new way of displaying action sheets from the buttons that triggers them. I figured out that in SwiftUI you can just set the confirmationDialog view modifier on the button that triggers it. However, I can't find a way to get this behavior in UIKit when a UIButton triggers an alert. Has anyone got this work? The behavior is mentioned briefly in the "Get to know the new design system" session.
Replies
4
Boosts
0
Views
305
Activity
Jul ’25
EXC_BREAKPOINT, QuartzCore , Crash CA::Render::Image::new_image
We are seeing crashes in Xcode organizer. So far we are not able to reproduce them locally. They affect multiple app releases (some older, built with Xcode 15.x and newer built with Xcode 16.0). They only affect iOS 18.5. Is there anything that changed in latest iOS? It's hard to tell what exactly is causing this crash because setting symbolic breakpoint on CA::Render::Image::new_image(unsigned int, unsigned int, unsigned int, unsigned int, CGColorSpace*, void const*, unsigned long const*, void (*)(void const*, void*), void*) triggers this breakpoint all the time, but not necessarily with exactly the previous stack frames matching the crash report. Is it a known issue? crash.crash Thank you.
Replies
0
Boosts
5
Views
591
Activity
Jul ’25
In iOS 26, the tab bar never disappears when new controller is pushed
In my app, I have a tab bar controller whose first tab is a navigation controller. Taking a certain action in that controller will push a new controller onto the navigation stack. The new controller has hidesBottomBarWhenPushed set to true, which hides the tab bar and shows the new controller's toolbar. It's worked like this for years. But in the iOS 26 simulator (I don't have the beta installed on any physical iPhones yet), when I tried this behavior in my app, I instead saw: the tab bar remained exactly where it was when I pushed the new controller the toolbar never appeared at all and all of its buttons were inaccessible If you set the deployment target to iOS 18 and run the code in an iOS 18 simulator: when you tap "Tap Me", the new controller is pushed onto the screen simultaneously, the tab bar hides and the second controller's toolbar appears. If you set the deployment target to iOS 26 and run the code in an iOS 26 simulator: when you tap "Tap Me", the new controller is pushed onto the screen the toolbar never appears and the tab bar remains unchanged after the push animation completes Is this a bug in the iOS 26 beta, or is it an intentional behavior change in how hidesBottomBarWhenPushed works in these cases? Below is sample code that reproduces the problem: class TabController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let button = UIButton(type: .roundedRect, primaryAction: UIAction(title: "Test Action") { action in let newController = SecondaryController() self.navigationController!.pushViewController(newController, animated: true) }) button.setTitle("Tap Me", for: .normal) button.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(button) NSLayoutConstraint.activate([ self.view.centerXAnchor.constraint(equalTo: button.centerXAnchor), self.view.centerYAnchor.constraint(equalTo: button.centerYAnchor), ]) } } class SecondaryController: UIViewController { override func loadView() { super.loadView() self.toolbarItems = [ UIBarButtonItem(image: UIImage(systemName: "plus"), style: .plain, target: nil, action: nil) ] } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.isToolbarHidden = false } } class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? var tabController: UITabBarController? func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } let tab1 = UITab(title: "Test 1", image: UIImage(systemName: "globe"), identifier: "test1") { _ in UINavigationController(rootViewController: TabController()) } let tab2 = UITab(title: "Test 2", image: UIImage(systemName: "globe"), identifier: "test2") { _ in UINavigationController(rootViewController: TabController()) } window = UIWindow(windowScene: windowScene) self.tabController = UITabBarController(tabs: [tab1, tab2]) self.window!.rootViewController = self.tabController self.window!.makeKeyAndVisible() } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
1
Views
714
Activity
Jul ’25
`UIHostingConfiguration` for cells not cancelling touches on `UIScrollView` scroll (drag)?
The default behavior on UIScrollView is that "canCancelContentTouches" is true. If you add a UIButton to a UICollectionViewCell and then scroll (drag) the scroll view with a touch beginning on that button in that cell, it cancels ".touchUpInside" on the UIButton. However, if you have a Button in a SwiftUI view configured with "contentConfiguration" it does not cancel the touch, and the button's action is triggered if the user is still touching that cell when the scroll (drag) completes. Is there a way to forward the touch cancellations to the SwiftUI view, or is it expected that all interactivity is handled only in UIKit, and not inside of "contentConfiguration" in specific cases? This behavior seems to occur on all SwiftUI versions supporting UIHostingConfiguration so far.
Replies
4
Boosts
0
Views
110
Activity
Jun ’25
How to determine if a cold start is a background launch when using SceneDelegate (scene-based lifecycle)
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (application.applicationState == UIApplicationStateBackground) { // ✅ Background launch } else { // ✅ Normal foreground launch } } Previously, when using AppDelegate to handle lifecycle methods, I could determine whether a cold start was a background launch as shown above. This allowed me to accurately measure cold start time for real-world users. The platform now requires migration to scene-based lifecycle management by iOS 16. However, after migration: In both application:didFinishLaunchingWithOptions: and scene:willConnectToSession:options: methods, application.applicationState == UIApplicationStateBackground and scene.activationState == UISceneActivationStateUnattached These values remain fixed regardless of whether it's a background launch, making them unusable for differentiation. I attempted to use information from UISceneConnectionOptions for distinction but found it ineffective. Question: Are there alternative approaches to achieve this distinction?
Replies
1
Boosts
0
Views
152
Activity
Jun ’25
Ambiguous use of 'textField' in Xcode 26
func textField( _ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String ) -&gt; Bool { if let delegate = delegate, let shouldChangeCharactersIn = delegate.textField { return shouldChangeCharactersIn(textField, range, string) } return true } This is from an extension extension TextInput: UITextFieldDelegate, ObservableTextFieldDelegateProtocol { The delegate is already a UITextFieldDelegate, but when you click on the error, it returns 7 instances of: "Found this candidate in module 'UIKit' (UIKit.UITextFieldDelegate.textField)" This doesn't give an error in Xcode 16. Is this an Xcode 26 bug?
Replies
0
Boosts
0
Views
244
Activity
Jun ’25
TN3187: Question About AppDelegate and SceneDelegate Lifecycle Method Behaviors During Migration to the UIKit Scene-Based Life Cycle
Hello, I’m currently working on migrating an existing AppDelegate-based application to use the scene-based life cycle, as recommended in the TN3187 technical note. As part of this process, I’ve been conducting some tests. After completely removing the scene-based setup (i.e., removing the UIApplicationSceneManifest from Info.plist and deleting SceneDelegate.swift), the app runs in a legacy AppDelegate-only life cycle as expected. In this case, lifecycle methods such as applicationWillEnterForeground and applicationDidEnterBackground in the AppDelegate are called properly. SceneDelegate methods are, naturally, not called—since the class is removed. However, here’s where the confusion arises: Even in this AppDelegate-only configuration, if I register for UIScene notifications via NotificationCenter, the corresponding selectors are invoked at runtime, which suggests that UIScene lifecycle notifications are still being broadcast internally by the system. Below is the test code I used, along with console output: func addObserver() { NotificationCenter.default.addObserver(self, selector: #selector(appDidEnterBackground), name: UIApplication.didEnterBackgroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(appWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil) if #available(iOS 13.0, *) { NotificationCenter.default.addObserver(self, selector: #selector(sceneDidEnterBackground), name: UIScene.didEnterBackgroundNotification, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(sceneWillEnterForeground), name: UIScene.willEnterForegroundNotification, object: nil) } } @objc func sceneWillEnterForeground() { print("sceneWillForeground") } @objc func sceneDidEnterBackground() { print("sceneDidEnterBackground") } @objc func appWillEnterForeground() { print("appWillEnterForeground") } @objc func appDidEnterBackground() { print("appDidEnterBackground") } sceneWillForeground AppDelegate::willenterforeground appWillEnterForeground So, my question is: Even in an AppDelegate-only app running on iOS 13 or later, is it expected behavior that UIScene lifecycle notifications such as UIScene.didEnterBackgroundNotification and UIScene.willEnterForegroundNotification are still posted by the system? === Additional Question: The TN3187 note lists only four methods to migrate between AppDelegate and SceneDelegate. Are there any other lifecycle methods (beyond the four listed) that also require manual migration during this transition? Thank you in advance for your insights.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
1
Boosts
0
Views
244
Activity
Jun ’25
Creating UI instance using 'XML' like data at runtime
In windows there is a support for generating Xaml strings at runtime for the UI artefact and use it on the main thread for loading the Xaml strings with properties and creating the UI artefact. Below is a code example for it. static void createxaml(hstring & str) { str = LR"( <Button xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation Name="MyButton" Content="Click Me" Width="200" Height="60" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" FontFamily="Segoe UI" Foreground="White" )"; } { hstring xaml; createxaml(xaml); Button obj = XamlReader::Load(xaml).as<Button>(); } My question is, Is there similar support available in uikit to create ui instances like UIButton. Is there some native support from apple that allows us to create a button object using an XML like string?
Topic: UI Frameworks SubTopic: General Tags:
Replies
2
Boosts
0
Views
118
Activity
Jun ’25