We are using a column style split view controller as root view of our app and in iOS26 the navigation titles of primary and supplementary view controllers are not visible and secondary view controller title is displayed in supplementary column.
Looks the split view hidden all the child view controllers title and shown the secondary view title as global in macCatlayst. The right and left barbutton items are showing properly for individual view controllers.
Facing this weird issue in iOS26 betas. The secondary navigation title also visible only when WindowScene,titlebar.titleVisibility is not hidden.
Kindly suggest the fix for this issue as we can't use the secondary view navigation title for showing supplementary view's data. The issue not arises in old style split views or when the split view embedded in another splitView.
Refer the sample code and attachment here
let splitView = UISplitViewController(style: .tripleColumn)
splitView.preferredDisplayMode = .twoBesideSecondary
splitView.setViewController(SplitViewChildVc(title: "Primary"), for: .primary)
splitView.setViewController(SplitViewChildVc(title: "Supplementary"), for: .supplementary)
splitView.setViewController(SplitViewChildVc(title: "Secondary"), for: .secondary)
class SplitViewChildVc: UIViewController {
let viewTitle: String
init(title: String = "Default") {
self.viewTitle = title
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
self.title = viewTitle
self.navigationItem.title = viewTitle
if #available(iOS 26.0, *) {
navigationItem.subtitle = "Subtitle"
}
let leftbutton = UIBarButtonItem(barButtonSystemItem: .cancel, target: nil, action: nil)
navigationItem.leftBarButtonItem = leftbutton
let rightbutton = UIBarButtonItem(barButtonSystemItem: .add, target: nil, action: nil)
navigationItem.rightBarButtonItem = rightbutton
}
}
UIKit
RSS for tagConstruct and manage graphical, event-driven user interfaces for iOS or tvOS apps using UIKit.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello,
I hope you're all doing well! I'm currently working on integrating new iOS 26 features into my app, and so far, the process has been really exciting. However, I've encountered an issue when updating the badge of a UIBarButtonItem, and I’m hoping to get some insights or suggestions.
The app has two UIViewController instances in the navigation stack, each containing a UIBarButtonItem.
On the first controller, the badge is set to 1, and on the second, the badge is set to 2. In the second controller, there is a "Reset" button that sets the badge of the second controller to nil.
However, when I tap the "Reset" button, instead of setting the badge to nil, it sets the value to 1.
I would appreciate any ideas or suggestions on how to solve this problem. Maybe I am using the badge API incorrectly.
Thank you!
class ViewController: UIViewController {
var cartButtonItem: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
configureNavigationItem()
}
func configureNavigationItem() {
cartButtonItem = UIBarButtonItem(image: UIImage(resource: .cartNavBar), style: .plain, target: self, action: #selector(showCartTab))
cartButtonItem.tintColor = UIColor.systemBlue
cartButtonItem.badge = .count(1)
navigationItem.rightBarButtonItem = cartButtonItem
}
@objc func showCartTab() {
// Add second view controller in navigation stack
performSegue(withIdentifier: "Cart", sender: nil)
}
}
class CartViewController: UIViewController {
var cartButtonItem: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
configureNavigationItem()
}
func configureNavigationItem() {
cartButtonItem = UIBarButtonItem(image: UIImage(resource: .cartNavBar), style: .plain, target: nil, action: nil)
cartButtonItem.tintColor = UIColor.systemBlue
cartButtonItem.badge = .count(2)
navigationItem.rightBarButtonItem = cartButtonItem
}
func updateBadge() {
cartButtonItem.badge = nil
}
@IBAction func resetButtonPressed(_ sender: Any) {
updateBadge()
}
}
Previously, when using AppDelegate, I was able to check the app’s launch options (launchOptions) to determine cases such as:
Location updates (UIApplication.LaunchOptionsKey.location)
Background push notifications (UIApplication.LaunchOptionsKey.remoteNotification)
However, after migrating to the SceneDelegate approach, launchOptions is no longer available — it always returns nil.
In my app, I need to branch the code depending on the launch options, but I can’t find a way to achieve this in the SceneDelegate environment.
👉 Is there a way to access launch options in SceneDelegate, similar to how it worked in AppDelegate?
Or, if that’s no longer possible, what would be the proper alternative approach?
Any guidance would be greatly appreciated.
Create an Installer Plug-in project and Add a WebView control to the pane’s .xib file.(Just the simple functionality of local HTML in reality.)
add .bundle file into Installer Package A.
Run Installer Package A on macOS 26.
Result: The WebView displays correctly, and the installation completes successfully, but the system produces crash reports.
I'm trying to customize the menu in my iPad app for iOS 26, since most of the default menu options aren't relevant to my app. Fortunately, I already have the code for this from my Mac Catalyst implementation. However, the functionality to replace menus with new sets of options has no effect on some menus on iOS. For example, updating the Format menu works fine on Mac Catalyst and iOS 26:
override func buildMenu(with builder: UIMenuBuilder) {
super.buildMenu(with: builder)
let transposeUpItem = UIKeyCommand(title: NSLocalizedString("TRANSPOSE_UP"), image: nil, action: #selector(TransposeToolbar.transposeUp(_:)), input: "=", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let transposeDownItem = UIKeyCommand(title: NSLocalizedString("TRANSPOSE_DOWN"), image: nil, action: #selector(TransposeToolbar.transposeDown(_:)), input: "-", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let transposeGroup = UIMenu(title: "", image: nil, identifier: UIMenu.Identifier(rawValue: "transposeGroup"), options: UIMenu.Options.displayInline, children: [transposeUpItem, transposeDownItem])
let boldItem = UIKeyCommand(title: NSLocalizedString("BOLD"), image: nil, action: #selector(FormatToolbar.bold), input: "b", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let italicItem = UIKeyCommand(title: NSLocalizedString("ITALIC"), image: nil, action: #selector(FormatToolbar.italic), input: "i", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let underlineItem = UIKeyCommand(title: NSLocalizedString("UNDERLINE"), image: nil, action: #selector(FormatToolbar.underline), input: "u", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let colorItem = UIKeyCommand(title: NSLocalizedString("COLOR"), image: nil, action: #selector(FormatToolbar.repeatColor), input: "c", modifierFlags: [.command, .alternate], propertyList: nil, alternates: [])
let clearItem = UIKeyCommand(title: NSLocalizedString("CLEAR_FORMATTING"), image: nil, action: #selector(FormatToolbar.clear), input: "x", modifierFlags: [.command, .alternate], propertyList: nil, alternates: [])
let formatGroup = UIMenu(title: "", image: nil, identifier: UIMenu.Identifier(rawValue: "formatGroup"), options: UIMenu.Options.displayInline, children: [boldItem, italicItem, underlineItem, colorItem, clearItem])
let markerItem = UIKeyCommand(title: NSLocalizedString("ADD_A_MARKER"), image: nil, action: #selector(FormatToolbar.marker), input: "m", modifierFlags: [.command, .alternate], propertyList: nil, alternates: [])
let markerGroup = UIMenu(title: "", image: nil, identifier: UIMenu.Identifier(rawValue: "markerGroup"), options: UIMenu.Options.displayInline, children: [markerItem])
var formatMenu = builder.menu(for: .format)
var formatItems = [transposeGroup, formatGroup, markerGroup]
formatMenu = formatMenu?.replacingChildren(formatItems)
if let formatMenu = formatMenu {
builder.replace(menu: .format, with: formatMenu)
}
}
The same approach for the View menu works fine on Mac Catalyst, but has no effect on iOS 26. I see the same View menu options as before:
override func buildMenu(with builder: UIMenuBuilder) {
super.buildMenu(with: builder)
let helpItem = UIKeyCommand(title: NSLocalizedString("HELP"), image: nil, action: #selector(utilityHelp), input: "1", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let actionItemsItem = UIKeyCommand(title: NSLocalizedString("ACTION_ITEMS"), image: nil, action: #selector(utilityActionItems), input: "2", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let remoteControlItem = UIKeyCommand(title: NSLocalizedString("APP_CONTROL_STATUS"), image: nil, action: #selector(utilityRemoteControl), input: "3", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let midiItem = UIKeyCommand(title: NSLocalizedString("MIDI_STATUS"), image: nil, action: #selector(utilityMidi), input: "4", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let linkingItem = UIKeyCommand(title: NSLocalizedString("LIVE_SHARING_STATUS"), image: nil, action: #selector(utilityLinking), input: "5", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let syncItem = UIKeyCommand(title: NSLocalizedString("SYNCHRONIZATION"), image: nil, action: #selector(utilitySync), input: "6", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let settingsItem = UIKeyCommand(title: NSLocalizedString("SETTINGS"), image: nil, action: #selector(utilitySettings), input: "7", modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let utilityGroup = UIMenu(title: "", image: nil, identifier: UIMenu.Identifier(rawValue: "utilityGroup"), options: UIMenu.Options.displayInline, children: [helpItem, actionItemsItem, remoteControlItem, midiItem, linkingItem, syncItem, settingsItem])
let backItem = UIKeyCommand(title: NSLocalizedString("BUTTON_BACK"), image: nil, action: #selector(navigateBack), input: UIKeyCommand.inputLeftArrow, modifierFlags: UIKeyModifierFlags.command, propertyList: nil, alternates: [])
let mainMenuItem = UIKeyCommand(title: NSLocalizedString("MAIN_MENU"), image: nil, action: #selector(navigateMain), input: UIKeyCommand.inputLeftArrow, modifierFlags: [.command, .alternate], propertyList: nil, alternates: [])
let navigateGroup = UIMenu(title: "", image: nil, identifier: UIMenu.Identifier(rawValue: "navigateGroup"), options: UIMenu.Options.displayInline, children: [backItem, mainMenuItem])
var viewMenu = builder.menu(for: .view)
var viewItems = [utilityGroup, navigateGroup]
viewMenu = viewMenu?.replacingChildren(viewItems)
if let viewMenu = viewMenu {
builder.replace(menu: .view, with: viewMenu)
}
}
I tried a couple other approaches, but they also did nothing:
var viewMenu = builder.menu(for: .view)
var viewItems = [utilityGroup, navigateGroup]
builder.replaceChildren(ofMenu: .view, from: { oldChildren in
viewItems
})
Also:
viewMenu = UIMenu(title: NSLocalizedString("VIEW"), image: nil, identifier: .view, options: UIMenu.Options.displayInline, children: viewItems)
if let viewMenu = viewMenu {
builder.replace(menu: .view, with: viewMenu)
}
Does anyone know how to make this work for the View menu?
It's frustrating that Apple added all these default options, without an easy way to remove options that aren't relevant.
Topic:
UI Frameworks
SubTopic:
UIKit
In my CarPlay app my CPMapButton with system images have the wrong tint when the CarPlay appearance is set to "Always Dark".
Here is what it looks like.
When I change the system appearance to "Automatic" the buttons look fine.
Has anyone encountered this or know how to fix it?
Is the Cancel button intentionally removed from UISearchBar (right side)?
Even when using searchController with navigationItem also.
showsCancelButton = true
doesn’t display the cancel button.
Also:
When tapping the clear ("x") button inside the search field, the search is getting canceled, and searchBarCancelButtonClicked(_:) is triggered (Generally it should only clear text, not cancel search).
If the search text is empty and I tap outside the search bar, the search is canceled.
Also when I have tableview in my controller(like recent searches) below search bar and if I try to tap when editing started, action is not triggered(verified in sample too). Just cancellation is happening.
In a split view controller, if the search is on the right side and I try to open the side panel, the search also gets canceled.
Are these behaviors intentional changes, beta issues, or are we missing something in implementation?
I’m trying to understand the exact role of the return value in the UITextFieldDelegate method textFieldShouldReturn(_:).
From my experiments in Xcode, I observed:
Returning true vs false does not seem to cause any visible difference (e.g., the keyboard does not automatically dismiss either way).
I know that in shouldChangeCharactersIn returning true allows the system to insert the character, and returning false prevents it. That’s clear.
For textFieldShouldReturn, my current understanding is that returning true means “let the OS handle the Return press,” and returning false means “I’ll handle it myself.”
My confusion: what is it that the OS actually does when it “handles” the Return press?
Does UIKit do anything beyond calling this delegate method?
If the system is supposed to dismiss the keyboard when returning true, why doesn’t it happen automatically?
I’d appreciate clarification on the expected use of this return value — specifically, what default behavior the system performs (if any) when we return true.
Thanks!
(NSString*)getClienttime
{
NSDate* currentDate = [NSDate date];
NSDateFormatter* dateformatter = [[NSDateFormatter alloc] init];
dateformatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:8*3600];
dateformatter.locale= [NSLocale systemLocale];
[dateformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
return [dateformatter stringFromDate:currentDate]?:@"";
}
the info of crash
1
libicucore.A.dylib
icu::UnicodeString::copyFrom(icu::UnicodeString const&, signed char) (in libicucore.A.dylib) + 36
2
libicucore.A.dylib
icu::DecimalFormatSymbols::operator=(icu::DecimalFormatSymbols const&) (in libicucore.A.dylib) + 64
3
libicucore.A.dylib
icu::DecimalFormatSymbols::operator=(icu::DecimalFormatSymbols const&) (in libicucore.A.dylib) + 64
4
libicucore.A.dylib
icu::DecimalFormat::DecimalFormat(icu::DecimalFormat const&) (in libicucore.A.dylib) + 188
5
libicucore.A.dylib
icu::DecimalFormat::clone() const (in libicucore.A.dylib) + 48
6
libicucore.A.dylib
icu::NumberFormat::createInstance(icu::Locale const&, UNumberFormatStyle, UErrorCode&) (in libicucore.A.dylib) + 188
7
libicucore.A.dylib
icu::SimpleDateFormat::initialize(icu::Locale const&, UErrorCode&) (in libicucore.A.dylib) + 580
8
libicucore.A.dylib
icu::SimpleDateFormat::SimpleDateFormat(icu::Locale const&, UErrorCode&) (in libicucore.A.dylib) + 332
9
libicucore.A.dylib
icu::DateFormat::create(icu::DateFormat::EStyle, icu::DateFormat::EStyle, icu::Locale const&) (in libicucore.A.dylib) + 264
10
libicucore.A.dylib
udat_open (in libicucore.A.dylib) + 396
11
CoreFoundation
__cficu_udat_open (in CoreFoundation) + 72
12
CoreFoundation
__ResetUDateFormat (in CoreFoundation) + 508
13
CoreFoundation
__CreateCFDateFormatter (in CoreFoundation) + 324
14
Foundation
-[NSDateFormatter _regenerateFormatter] (in Foundation) + 204
15
Foundation
-[NSDateFormatter stringForObjectValue:] (in Foundation) + 104
16
ABC
+[JMAContext getClienttime] (in DadaStaff) (JMAContext.m:73)
Topic:
UI Frameworks
SubTopic:
UIKit
I have a strange issue for iOS26. I have a UITabBarController at the root view of the app, but on certain actions, I want to hide it temporarily, and then have some options where the user can press a button which display some options using UIAlertController. It used to work fine before, but with iOS26, when the UIAlertController is presented, the tab bar (which is hidden by setting the ‘frame’) suddenly pops back into view automatically, when I don't want it to.
Here's an example that reproduces the issue:
class TestTableViewController: UITableViewController {
private var isEditMode: Bool = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Change", style: .plain, target: self, action: #selector(changeMode))
}
@objc func changeMode() {
print("change mode called")
if isEditMode == false {
isEditMode = true
// hide tab bar
setEditingBarVisible(true, animated: true)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Action", style: .plain, target: self, action: #selector(showActionsList))
} else {
isEditMode = false
// show tab bar
setEditingBarVisible(false, animated: true)
self.navigationItem.rightBarButtonItem = nil
}
}
@objc func showActionsList() {
let alert = UIAlertController(title: "Action", message: "showing message", preferredStyle: .actionSheet)
alert.addAction(UIAlertAction.init(title: "Cancel", style: .cancel, handler: nil))
self.present(alert, animated: true, completion: nil)
}
@objc func setEditingBarVisible(_ visible: Bool, animated: Bool) {
guard let tabBar = tabBarController?.tabBar else {
return
}
let performChanges = {
// Slide the tab bar off/on screen by adjusting its frame’s y.
// This is safe because UITabBar is frame-managed, not Auto Layout constrained.
var frame = tabBar.frame
let height = frame.size.height
if visible {
// push it down if not already
if frame.origin.y < self.view.bounds.height {
frame.origin.y = self.view.bounds.height + self.view.safeAreaInsets.bottom
}
// Give our content its full height back (remove bottom safe-area padding that tab bar created)
self.additionalSafeAreaInsets.bottom = 0
} else {
// bring it back to its normal spot
frame.origin.y = self.view.bounds.height - height
// Re-apply bottom safe-area so content clears the tab bar again
self.additionalSafeAreaInsets.bottom = height
}
tabBar.frame = frame
// Ensure layout updates during animation
self.tabBarController?.view.layoutIfNeeded()
self.view.layoutIfNeeded()
}
if animated {
UIView.animate(withDuration: 0.28, delay: 0, options: [.curveEaseInOut]) {
performChanges()
}
} else {
performChanges()
}
}
}
I have a bar button called 'Change', and selecting it should hide/show the UITabBar at the bottom, and show/hide a different bar button called 'Action'. Selecting the 'Action' button shows an alert.
With iOS26, with the tab bar moved out of view, when the 'Action' button is called, the alert shows but the tab bar automatically moves into view as well.
Is this a known issue? Any workaround for it?
I filed FB19954757 just in case.
Topic:
UI Frameworks
SubTopic:
UIKit
[NSBitmapImageRep imageRepsWithContentsOfFile] is returning empty/solid black bitmaps for some image files with HDR on macOS Tahoe beta. I opened an Apple feedback report but curious if anyone else is seeing this. Errors thrown in the debugger are:
IIOApplyHDRGainMap:351: FlexGTC headroom (4.0) doesn't match target headroom (1.0)
+[HDRImage getGainMapVersionMajor:minor:fromMetadata:]:417: Failed to get metadata tag: HDRGainMap:HDRGainMapVersion
+[HDRImage getGainMapHeadroom:fromMetadata:]:443: Failed to read gain map version info: <CGImageMetadata 0x9fc013700> (
iio:hasXMP = True
)
This function call has worked reliable for many years before the Tahoe beta.
Topic:
UI Frameworks
SubTopic:
UIKit
Observed on iPadOS 26 b8 in apps built with current SDK:
Floating keyboard lacks corner mask
Floating key blue highlight not aligned with its background
Invoking floating keyboard can result in “ghost” full-sized keyboard appearing at bottom of screen
Swipe-dismissing floating keyboard can result in it bouncing back up, again with ghost keyboard appearing
Touching globe key can produce menus truncated/obscured by ghost keyboard
Ghost keyboard can remain visible even after backgrounding the app
(Some of these issues may be limited to non-English keyboards)
FB19951605
Topic:
UI Frameworks
SubTopic:
UIKit
I am trying out iOS26 with my existing app. I have a UITabBarController which is set to the main window's rootViewController, and I setup my UITabBar viewControllers programmatically. The first tab's root view has a UITableView with 100s of rows. When I build and run with the new Xcode, the app has the iOS26 look, but the table view doesn't seem to scroll behind the tab bar. The tab bar seems to have a hard edge and the content doesn't show through behind that.
I have tried setting up the UITabBarController with the UITab items from iOS18 as well, but that doesn't help either.
If I build a new project using the Xcode template, with storyboards, it works as expected and table view content shows through the UITabBar.
What could be causing this? Is there something I need to configure to get the correct effect in iOS26?
--
Figure it out: I needed to pin the bottomAnchor of the view controller to view's bottomAnchor (not safeAreaLayoutGuide.bottomAnchor)
Topic:
UI Frameworks
SubTopic:
UIKit
Hi all,
Sharing a reproducible UIKit issue I’m seeing across multiple iPadOS 26 betas, with a tiny sample attached and a short video.
Short video
https://youtu.be/QekYNnHsfYk
Tiny project
https://github.com/yoasha/ListSwipeOvershootReproSwift
Summary
In a UISplitViewController (.doubleColumn), a UICollectionView using list layout shows a large leading-swipe overshoot when the split view is expanded (isCollapsed == false). The cell content translates roughly 3–4× the action width.
Repros with appearance = .plain and .grouped
Does not repro with .insetGrouped
Independent of trailing provider (issue persists when trailing provider is nil)
Collapsed split (compact width) behaves correctly
Environment
Devices: iPad Air (3rd gen), iPadOS 26.0 (23A5326a) → Repro
Simulators: iPad Pro 11-inch (M4), iPadOS 26.0 beta 6 → Repro
Also tested on device: iPadOS 26 beta 5, 6, 7, 8
Xcode: 26.0 beta 6 (17A5305f)
Steps to reproduce
Launch the sample; ensure the split is expanded (isCollapsed == false).
In the secondary list, set Appearance = Plain (also repros with Grouped).
Perform a leading swipe (LTR: swipe right) on any row.
Actual: content shifts ~3–4× the action width (overshoot).
Expected: content translates exactly the action width.
Switch Appearance = InsetGrouped and repeat the leading (swipe right) gesture → correct (no overshoot).
Feedback Assistant
FB ID: FB19785883 (full report + attachments filed; this forum thread mirrors the repro for wider visibility)
Minimal code (core of the sample)
If anyone from Apple needs additional traces or a sysdiagnose, I can attach promptly. Thanks!
// Secondary column VC (snippet)
var cfg = UICollectionLayoutListConfiguration(appearance: .plain) // also .grouped / .insetGrouped
cfg.showsSeparators = true
cfg.headerMode = .none
cfg.leadingSwipeActionsConfigurationProvider = { _ in
let read = UIContextualAction(style: .normal, title: "Read") { _,_,done in done(true) }
read.backgroundColor = .systemBlue
let s = UISwipeActionsConfiguration(actions: [read])
s.performsFirstActionWithFullSwipe = false
return s
}
// Trailing provider can be nil and the bug still repros for leading swipe:
cfg.trailingSwipeActionsConfigurationProvider = nil
let layout = UICollectionViewCompositionalLayout.list(using: cfg)
let collectionView = UICollectionView(frame: view.bounds, collectionViewLayout: layout)
// … standard data source with UICollectionViewListCell + UIListContentConfiguration
// Split setup (snippet)
let split = UISplitViewController(style: .doubleColumn)
split.preferredDisplayMode = .oneBesideSecondary
split.viewControllers = [
UINavigationController(rootViewController: PrimaryTableViewController()),
UINavigationController(rootViewController: SecondaryListViewController())
]
I need more time to adapt to the new iOS 26 UI, so I set the "UIDesignRequiresCompatibility" attribute to "Yes."
This works, but now all large titles are not aligned with the content.
Below you can see an example, but I have the issue with all large titles.
All good on iOS 18.
Does anyone have an idea why and how can i fix it?
I am building a centralized event handling system for UIKit controls and gesture recognizers. My current approach registers events using static methods inside a handler class, like this:
internal class TWOSInternalCommonEventKerneliOS {
internal static func RegisterTouchUpInside(_ pWidget: UIControl) -> Void {
pWidget.addTarget(
TWOSInternalCommonEventKerneliOS.self,
action: #selector(TWOSInternalCommonEventKerneliOS.WidgetTouchUpInsideListener(_:)),
for: .touchUpInside
)
}
@objc
internal static func WidgetTouchUpInsideListener(_ pWidget: UIView) -> Void {
print("WidgetTouchUpInside")
}
}
This works in my testing because the methods are marked @objc and static, but I couldn’t find Apple documentation explicitly confirming whether using ClassName.self (instead of an object instance) is officially supported.
Questions:
Is this approach (passing ClassName.self as the target) recommended or officially supported by UIKit?
If not, what is the safer alternative to achieve a similar pattern, where event registration can remain in static methods but still follow UIKit conventions?
Would using a shared singleton instance as the target (e.g., TWOSInternalCommonEventKerneliOS.shared) be the correct approach, or is there a better pattern?
Looking for official guidance to avoid undefined behavior in production.
Issue Description:
When toggling between the system keyboard and a custom input view, the keyboard height reported in subsequent keyboard notifications becomes incorrect!!! specifically missing the predictive text/suggestion bar height.
Environment:
Device: iPhone 11
Expected keyboard height: 346pt
Actual reported height: 301pt (missing 45pt suggestion bar)
Reproduction Steps:
Present system keyboard → Height correctly reported as 346pt
Switch to custom input view → Custom view displayed
Switch back to system keyboard(no suggestion bar) → Height correctly reported as 301pt
Trigger keyboard frame change → Height still incorrectly reported as 301pt despite suggestion bar being visible
Expected Behavior:
Keyboard height should consistently include the suggestion bar height (346pt total).
Actual Behavior:
After switching from custom input view, keyboard height excludes suggestion bar height (301pt instead of 346pt).
key code
private func bindEvents() {
customTextField.toggleInputViewSubject.sink { [weak self] isShowingCustomInput in
guard let strongSelf = self else {
return
}
if isShowingCustomInput {
strongSelf.customTextField.inputView = strongSelf.customInputView
strongSelf.customInputView.frame = CGRect(x: 0, y: 0, width: strongSelf.view.frame.size.width, height: strongSelf.storedKeyboardHeight)
} else {
strongSelf.cusTextField.inputView = nil
}
strongSelf.customTextField.reloadInputViews()
strongSelf.customTextField.becomeFirstResponder()
}.store(in: &cancellables)
}
In our app we have a UICollectionView with Drag&Drop functionality enable and collection view is covering the entire screen. When we drag a collection view item to the edge of the screen it does not scroll the UICollectionView instead that our item turns into the app icon and scrolling blocked. It is happening only if Stage Manager is enabled in the device and if Stage Manager is disabled it is working fine.
This issue we are facing after iOS 18.6 release, before 18.6 it was working fine i.e, collection view was scrolling to next items when we dragging an item to edge of the screen, similar to the iOS calendar app when we drag an event to edge it starts scrolling the date.
And in iOS 26 if we drag an item to edge, Springboard is getting crashed.
Hello,
First of all, I've already made a bug report here : https://feedbackassistant.apple.com/feedback/19731998
I'm facing a problem while using UIGraphicsImageRenderer to create an image, that is use to create a UIColor with a pattern via UIColor(patternImage:).
It's well displayed for iOS 18.2 and lower, whereas the whole color is blank with iOS 26.
-> Please find a sample project linked to the bug report
ViewController.swift
post that illustrates the issue, in the ViewController.swift file. I'll also link screenshots of the sample app, one built with iOS 18.2 and another with iOS 26.0.
Reproduction steps :
I create an image with UIGraphicsImageRenderer : let image = UIGraphicsImageRenderer().image { context in // Do anything here }
Then I use this image to create a UIColor : UIColor(patternImage: image)
I apply this color to the fillColor of a CAShapeLayer : shapeLayer.fillColor = UIColor(patternImage: image)
Expected result :
Run on iOS 26 and lower and the layer filled with the pattern color is correctly displayed, as it is on iOS 18.2 and lower.
Observed result :
Run on iOS 26 and the layer is filled with a blank/white color instead of the intended pattern color.
Has anyone been facing the problem ?
Thanks,
Thibault Poujat
I have a few view controllers in a large UIKit application that previously started showing content right below the bottom of the top navigation toolbar.
When testing the same code on iOS 26, these same views have their content extend under the navigation bar and toolbar. I was able to fix it with:
if #available(iOS 26, *, *) {
self.edgesForExtendedLayout = [.bottom]
}
when running on iOS 26. I also fixed one or two places where the main view was anchored to self.view.topAnchor instead of self.view.safeAreaLayoutGuide.topAnchor.
Although this seems to work, I wonder if this was an intended change in iOS 26 or just a temporary bug in the beta that will be resolved.
Were changes made to the safe area and edgesForExtendedLayout logic in iOS 26? If so, is there a place I can see what the specific changes were, so I know my code is handling it properly?
Thanks!
Topic:
UI Frameworks
SubTopic:
UIKit