Hello,
We are experiencing some issues with our USB accessory unexpectedly charging the iOS device it is connected with only when the iOS device supports USB-C and is on iOS 18+
The following is a description of the discrepancy we note between iOS versions:
After performing a USB Role switch, our Accessory becomes a typical USB Device and the Apple device becomes the USB host.
with iOS 17:
The Accessory then sends a PowerSourceUpdate message to the iOS 17 device via iAP2 protocol. Apple device has a USB Type C Connector. *
We are specifying:
AvailableCurrentForDevice = 0 mA
DeviceBatteryShouldChargeIfPowerIsPresent = 1.
Three observations:
iPad Battery Settings page - we observe 'Last charged to…' (indicating no charging)
On the Lumify App running (iOS 17), we observe that UIKit.current.batteryState indicated 'Not charging'
Battery icon on top right of the screen indicates 'No Charging'
with iOS 18:
The same Accessory sends the same PowerSourceUpdate message to the iOS 18 device via iAP2 protocol using USB Type C Connector.
We are specifying the same:
AvailableCurrentForDevice = 0 mA
DeviceBatteryShouldChargeIfPowerIsPresent = 1.
We observe:
iPad Battery Settings page - we observe 'Charging'
On the Lumify App running (iOS 18), we observe that UIKit.current.batteryState indicated 'Charging'
Battery icon on top right of the screen indicates 'No Charging'
Please could you help us understand why the Battery status is showing as 'Charging' in the Settings page and with the 'UIKit.current.batteryState' even though we have specified 'AvailableCurrentForDevice = 0 mA'?
Since our accessory is heavily reliant on the Battery status / Charging state, is there potentially another way we get an accurate battery charging status that we are missing? Or are there other suggestions outside of what we do currently to ensure our accessory does not place the iOS18 device into a charging state?
UIKit
RSS for tagConstruct and manage graphical, event-driven user interfaces for iOS or tvOS apps using UIKit.
Posts under UIKit tag
186 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
I have recently submitted a new app version to the Appstore with Xcode 15.0. Unfortunately, I have started to see the below crash in the Xcode organiser > Crashes section occurring for more number of times.
UIKitCore: +[UIAlertController _alertControllerContainedInViewController:] + 160
The exception trace is not leading to main() function but not pointing to any of the code line. I had used UIAlertController in the past versions to show the alerts but there is no code written in the current version code related to UIAlertController. Only from the latest version, this kind of crash started to surface.
In the latest release, We have added a third party SDK and while implementing the SDK, we had added the Location and Bluetooth Permissions in Info.plist file. But as we don't want to use/track the Location and Bluetooth details from the app, the SDK team has disabled the Location and Bluetooth settings to not reflect in the tracked data.
Is this behaviour creating any conflict with the UIAlertController and logging the crash? Because by default the OS tries to show the alert when the permissions exist in the plist file, but the alert will not come as the service is disabled on the SDK server settings. Is this creating any conflict and logging the crash.
Please extend your help.
I have a button with the following properties:
accessibilityLabel: "Action Button",
traits: "Button",
accessibilityHint: "Performs the main action".
The voiceover reads the button as follows:
Action Button, Button, Performs the main action.
I want to understand how to configure it to only speak the accessibilityHint or only the accessibilityLabel and never speak the traits.
In another example, a switch has the traits: Button, and Toggle. So these traits are a part of what the voiceover speaks. I want only the accessibilityLabel or accessibilityHint to be spoken in this case.
Please let me know how.
Thanks
Introduction
Hello,
As part of our ongoing migration to SwiftUI, we are currently managing navigation using UIKit. Our SwiftUI views are embedded in UIHostingController instances and pushed or presented via UINavigationController.
We’ve encountered an issue that causes either a UI glitch on iOS 18 or a crash on iOS 17 when using the .refreshable modifier in a SwiftUI view that is added to a UINavigationController via setViewControllers(_:animated:).
To reproduce the issue, we’re using the following simple SwiftUI view:
struct TestView: View {
var body: some View {
List {
ForEach(0...100, id: \.self) {
Text("Number: \($0)")
}
}
.refreshable {
// No action needed — the presence of this modifier alone triggers the issue
}
}
}
Problematic Scenario
The following code causes the issue:
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let initialNav = self.navigationController
let hostingController = UIHostingController(rootView: TestView())
let newNav = UINavigationController()
// This causes a freeze (iOS 18) or crash (iOS 17)
newNav.setViewControllers([hostingController], animated: true)
initialNav?.present(newNav, animated: true)
}
}
After presenting the navigation controller, our app is freezing on iOS 18 or crashing on iOS 17.
Working scenario
When using pushViewController(_:animated:), the issue does not occur:
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let initialNav = self.navigationController
let hostingController = UIHostingController(rootView: TestView())
let newNav = UINavigationController()
// This works without issue
newNav.pushViewController(hostingController, animated: true)
initialNav?.present(newNav, animated: true)
}
}
Conclusion
We would like to better understand the root cause of this behavior. While using pushViewController is a viable workaround, there are scenarios where we must rely on setViewControllers, and currently, that approach breaks the experience or crashes the app.
Is this a known issue, or are we missing something about how UIHostingController interacts with .refreshable in this context?
Thanks for your time — we look forward to any insights you can share.
I have find out that a UIViewRepresentable, even with a simples UIView, seems to never be dismantled when deleted from a ForEach and this can cause serious crashes.
In the following example you can observe this behavior by deleting a row from the list. The dismantleUIView function of SomeUIViewRepresentable or the deinit of SomeUIView are never called.
Has anyone faced this and found a solution for it?
I have also filled a Feedback: FB11979117
class SomeUIView: UIView {
deinit {
print(#function)
}
}
struct SomeUIViewRepresentable: UIViewRepresentable {
func makeUIView(context: Context) -> SomeUIView {
let uiView = SomeUIView()
uiView.backgroundColor = .systemBlue
return uiView
}
func updateUIView(_ uiView: SomeUIView, context: Context) { }
static func dismantleUIView(_ uiView: SomeUIView, coordinator: Coordinator) {
print(#function)
}
}
struct Model: Identifiable {
let id = UUID()
}
struct ContentView: View {
@State var models = [Model(), Model(), Model(), Model(), Model()]
var body: some View {
List {
ForEach(models) { _ in
SomeUIViewRepresentable()
}
.onDelete {
models.remove(atOffsets: $0)
}
}
}
}
I am trying to do inline to icon and text in tab bar but it is not allowing me to do it in compact, but it showing me in regular mode , but in regular mode tab bar going at top in portrait mode , But my requirement is tab bar required in bottom with icon and text in inline it showed by horizontally but it showing to me stacked vertically, will you guide me on this so that I can push the build to live users.
Seeing this magical sand table, the unfolding and folding effects are similar to spreading out cards, which is very interesting. But I don't know how to achieve it. I want to see if there are any ways to achieve this effect and give some ideas. May I ask if this effect can be achieved under the existing API
Facing issue of NSUserDefaults data got cleared on update new version from app store. so all data of user got cleared and user have to login again.
I was having app in store with version 1.1.3 and then we have uploaded new version to store with version 1.1.4
but when user download app from store their data was cleared from UserDefaults.so this is big issue in update. need to help. is that apple updated any process on update.
Question
How Apple change version build in device when we update app from app store.
is it uninstall old build and install new build ?
Or it is install new version on old version ?
Should UserDefaults.standard will delete on update ?
Updating Provisioning profile from manual to automatically cause issue on UserDefaults.standard Like UserDefaults got cleared and uuid will change ?
Do we have anythings that we can identify specific user as uniq user ?
What is better solution to store login data into SQLite store or in UserDefaults as model ?
Will appreciate for your help. this is very big issue and login again on update will make app user more effect
Hello There,
I was trying to do a Button with title left aligned. With the old UIButton, I would have used the title-/contentEdgeInsets to achieve this, but with the new button these values are deprecated and do not work anymore. As far as I understood, with the new button only the spacing between the elements (sub-, title and image) is controllable. I also tried just setting the buttons width to the same width as the label, what would be possible in my case since it should be kind of a "hyperlink-button" which has no background or border. This works so far, but once the user interacts with the button, the title label gets multiline, which is on the one hand not wanted and on the other hand of course does not look left aligned anymore. (Besides the buttons height is fix in my case which leads to clipping of the title)
So here again in short: Is there any way to make the title of the new UIButton left aligned inside of the button?
Thank you very much in advance.
the bug look like this video:
https://www.youtube.com/shorts/qeUbhJAS0Jo
The app provides a simple drawing functionality on a canvas without using a storyboard. After creating drawings in portrait mode, rotating the simulator or the iPad-Device to landscape mode does not update or rescale the existing drawings to fit the newly expanded canvas area. The app can also be launched directly in landscape mode, allowing drawings to be created before rotating the device back to portrait mode. However, the issue persists, with the drawings not adjusting to the new canvas dimensions.
The goal is to achieve the same behavior as in the Apple Notes app: when the iPad is rotated, the drawings should adjust to the newly expanded or reduced canvas area. I would appreciate any suggestions or solutions.
Sample Projekt
[https://github.com/GG88IOS/Test_Drawing_App)
All of a sudden, after iOS 18.4 was released, I am having tons of navigation problems in my app in production. Buttons navigating to empty pages, views seeming to 'freeze', top navigation bar mismatched with the content of the page. It seems that iOS 18.4 broke a critical piece of UIKit + SwiftUI bridging functionality that my project relies on.
** Originally posted in 'Core OS' topic but realized 'UI Frameworks > General' made more sense. My bad. **
My application is written with both UIKit and SwiftUI components. Here is a breakdown of my setup:
UIApplicationDelegate >
UIWindow >
rootViewController of window is a UITabBarController >
each tab is a UINavigationController
rootViewController of nav controller is a UIHostingController >
rootView of the hosting controller is a SwiftUI View
In my SwiftUI views, I have been using NavigationLink for horizontal 'push' style navigation in my SwiftUI views. I do not use NavigationView, I only rely on the bridging capabilities of UINavigationController to action on my NavigationLinks. This has never been an issue, until iOS 18.4 was released. Now, when running iOS 18.4, I am having all sorts of unexpected behavior in the UI. I will break down 2 of these use cases here:
Use case A:
In one of my SwiftUI views, I have a ForEach for which each element's view is a NavigationLink. This is using the NavigationLink(_ destination:,label:) initializer. Navigating forward from here works/looks normal.
However, once I try to navigate backward from that destination (tap the 'Back' button in top left), the view goes blank and the navigation bar at the top of the page (which is maintained by the UINavigationController instance) does not change. If I call popToRootViewController on that nav controller, the navigation bar at the top of the page returns to its normal state, but the view is still blank.
It is not until after I have called popToRootViewController, and then navigate to a different tab of the UITabBarController and return to the initial tab, does the SwiftuI content view (the one with the ForEach) finally redraw and the view hierarchy is restored.
Here is a warning that is logged in the console when I tap the 'Back ' button:
Top view controller's view unexpectedly not in window for navigation transition. Skipping layout. nav = <UINavigationController: 0x1110bbe00>, topVC = <TtGC7SwiftUI19UIHostingControllerV5MyApp10MyPage: 0x106814e00>
EDIT: If I replace the NavigationLink with a call to UINavigationController.pushViewController, I am still seeing the exact same behavior. Pressing back button makes the view empty > need to pop to root view controller and switch tabs in order to restore the view.
Use case B
Another instance of this issue happens whenever I try to use a NavigationLink inside of a view that itself was the destination of a NavigationLink in its parent view (i.e.: Root view > detail view > sub-detail view). For example, take the detail view destination in use case A. I have tapped a NavigationLink from the ForEach and landed on the detail view. Again, so far things work/look normal. Now, if I tap on another NavigationLink from that detail view, the view does not transition to the new page. The top navigation bar does transition, and shows the title and actions associated with this second destination. However, the view of this second destination is not displayed.
It is worth noting that the same warning I mentioned above is also logged when I tap the NavigationLink to navigate to this second destination.
Top view controller's view unexpectedly not in window for navigation transition. Skipping layout. nav = <UINavigationController: 0x109859400>, topVC = <TtGC7SwiftUI19UIHostingControllerVVS_19BridgedPresentation8RootView: 0x300ab8000>
Strangely, if I switch to a different tab of the UITabBarController and back to the initial tab, this second destination's view is successfully rendered. It seems that switching tabs in this UITabBarController is calling something in either SwiftUI or UIKit that is redrawing my views.
Conclusion
This is a serious issue with UIKit + SwiftUI bridging support. I have never had problems like this until devices started running iOS 18.4, and there is nothing in the iOS 18.4 changelog that suggests this was an intentional change. All of a sudden, after updating to the latest iOS version, my app is totally broken.
I want to be clear that I'm not using deprecated NavigationLink methods in these instances. My app's minimum deployment target is iOS 16.
I know that there are more modern navigation APIs like navigation stack, etc. I am looking for answers about my use case: whether it is officially unsupported as of iOS 18.4, whether this setup should be supported and this is indeed some sort of bug in iOS, or anything in-between. I'm happy to provide formatted code if needed for discussion purposes. This is about my entire app's view hierarchy so there are a lot of disparate lines of code that make up this problem.
iPhone16ProMax
通过[UIScreen mainScreen].bounds.size获取屏幕宽高
使用XCode15获取屏幕宽高为430 * 930
使用XCode16获取屏幕宽高为440 * 956
这是为什么?
Device: iPhone 16 Pro Max
System Version: 18.3.1
Screen width and height obtained using [UIScreen mainScreen].bounds.size are as follows
Why are the two results different?
I have an iOS app that relies on dynamic text size such that all fonts in the app respect the user's setting of Text Size in the iOS Settings app.
This app also runs on macOS via Mac Catalyst. But until macOS 14 Sonoma, there was no Text Size setting in the macOS Settings app. But even as of Sonoma, the Text Size setting isn't usable by 3rd party apps. And Sequoia doesn't seem to change that.
As a work around, my Mac Catalyst app provides its own Text Size setting. I was able to make it work by providing my own UIApplication subclass and overriding preferredContentSizeCategory. Under macOS 12 to macOS 14, this workaround works just fine and all fonts in the app created with code such as UIFont.preferredFont(forTextStyle:) gives appropriately sized fonts based on the overridden content size category.
However, this workaround stopped working with macOS 15 Sequoia. I've also tried code such as:
self.window.traitOverrides.preferredContentSizeCategory = myCustomSizeCategoryValue
and
self.window.maximumContentSizeCategory = myCustomSizeCategoryValue
self.window.minimumContentSizeCategory = myCustomSizeCategoryValue
in the scene delegate but that made no difference.
Is there any way to get code such as UIFont.preferredFont(forTextStyle:) to return an appropriately sized font based on some app provided content size category in a Mac Catalyst app running under macOS 15?
It sure would be nice if Mac Catalyst apps automatically responded to the macOS Text Size setting under Settings -> Accessibility -> Display -> Text Size just like a native iOS app.
I'm trying to switch to UIKit's document lifecycle due to serious bugs with SwiftUI's version.
However I'm noticing the template project from Xcode isn't compatible with Swift 6 (I already migrated my app to Swift 6.). To reproduce:
File -> New -> Project
Select "Document App" under iOS
Set "Interface: UIKit"
In Build Settings, change Swift Language Version to Swift 6
Run app
Tap "Create Document"
Observe: crash in _dispatch_assert_queue_fail
Does anyone know of a work around other than downgrading to Swift 5?
Hi Everybody,
I am actually developing dynamic shortcuts for my app. I have a problem with the class UIApplicationShortcutIcon. When I pass a personalized icon in the parameter icon as a UIApplicationShortcutIcon(templateImageName: "nameOfTheAsset" I always visualize a black dot instead of my Icon.
The icon is imported as .SVG file and rendered as a template. Sincerely I do not know what to do to solve this problem since the documentation is little. Hoping somebody can give some tips to solve the problem
Hello,
I have a custom 3D object viewer on iOS that lets users spin the model using the touchscreen or a trackpad and supports coasting (momentum spinning). I need to stop the coasting animation as soon as the user touches down, but I can only immediately detect touches on the screen itself - on the trackpad I can't get an immediate notification of the touches.
So far I’ve tried:
State.began on my UIPanGestureRecognizer. It only fires after a small movement on both touchscreen and trackpad.
.possible on the pan gesture; this state never occurs during the gesture cycle.
UIApplicationSupportsIndirectInputEvents = YES in Info.plist; it didn’t make touchesBegan fire for indirectPointer touches.
Since UITableView (and other UIScrollView subclasses) clearly detect trackpad “touch-down” to cancel scrolling, there must be a way to receive that event. Does anyone know how to catch the initial trackpad contact—before any movement—on an indirect input device?
Below is a minimal code snippet demonstrating the issue. On the touchscreen you'll see a message the moment you touch the view, but the trackpad doesn't trigger any messages until your fingers move. Any advice would be greatly appreciated.
Thanks in advance,
John
import UIKit
class ViewController: UIViewController {
private let debugView = DebugView()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
// Fill the screen with our debug view
debugView.frame = view.bounds
debugView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
debugView.backgroundColor = UIColor(white: 0.95, alpha: 1)
view.addSubview(debugView)
// Attach a pan recognizer that logs its state
let panGR = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
panGR.allowedScrollTypesMask = .all
debugView.addGestureRecognizer(panGR)
}
@objc private func handlePan(_ gr: UIPanGestureRecognizer) {
switch gr.state {
case .possible:
print("Pan state: possible")
case .began:
print("Pan state: began")
case .changed:
print("Pan state: changed – translation = \(gr.translation(in: debugView))")
case .ended:
print("Pan state: ended – velocity = \(gr.velocity(in: debugView))")
case .cancelled:
print("Pan state: cancelled")
case .failed:
print("Pan state: failed")
@unknown default:
print("Pan state: unknown")
}
}
}
class DebugView: UIView {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesBegan(touches, with: event)
for t in touches {
let typeDesc: String
switch t.type {
case .direct: typeDesc = "direct (finger)"
case .indirectPointer: typeDesc = "indirectPointer (trackpad/mouse)"
case .indirect: typeDesc = "indirect (Apple TV remote)"
case .pencil: typeDesc = "pencil (Apple Pencil)"
@unknown default: typeDesc = "unknown"
}
print("touchesBegan on DebugView – touch type: \(typeDesc), location: \(t.location(in: self))")
}
}
}
Hello 👋🏽
I am a new iOS developer and I am having a hard time understanding the behavior of the new UIPasteControl to avoid showing the system prompt.
Does anyone has any example code I could look at to understand the behavior. Idk how to set the target of the button to the general pasteboard.
also I am using objective-c .
thanks
cristian
I've read in this post that in order to make the configuration of UIButton adjust my custom font's size automatically I need to add implementation to recalculate the font's size inside configurationUpdateHandler. But how would this look like?
I also read something about matching the font's text style. But at this point I'm just guessing. Here's the code:
let loginButton = UIButton(configuration: config, primaryAction: nil)
loginButton.configurationUpdateHandler = { button in
guard var config = button.configuration else { return }
let traits = button.traitCollection
let baseTitleFont = UIFont.customFont(ofSize: 18, weight: .semibold)
let baseSubtitleFont = UIFont.customFont(ofSize: 18, weight: .regular)
let scaledTitleFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseTitleFont, compatibleWith: traits)
let scaledSubtitleFont = UIFontMetrics(forTextStyle: .body).scaledFont(for: baseSubtitleFont, compatibleWith: traits)
config.titleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
var outgoing = incoming
outgoing.font = scaledTitleFont
return outgoing
}
config.subtitleTextAttributesTransformer = UIConfigurationTextAttributesTransformer { incoming in
var outgoing = incoming
outgoing.font = baseSubtitleFont
return outgoing
}
button.configuration = config
}
Thanks in advance!