I'm developing Locked Camera Capture Extension.
I noticed UIViewController's view.frame size on extension is smaller than app's one. It seems extension's View.frame is same as safe-area's frame.
WWDC24 session Build a great Lock Screen camera capture experience doesn't mention this issue. It looks like bug for me or is it intended specification to avoid complexity for users ?
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
How to make the tab display at the bottom on an iOS 18 iPad? Currently, the bottom of the app is blank, as shown in the following picture
My app supports only iPhone mode, and when it runs on an iPad device, it normally displays compatible iPhone mode.
But my code as long as you use the AVPictureInPictureController, open the picture in picture, will lead to get [UIScreen mainScreen] bounds became the real width and height, so the UI disorder;
How should my application be compatible with this?
I've got a UIKit app and I want to add some buttons in a top-edge window ornament. I'm looking at the WWDC23 talk Meet UIKit for Spatial Computing, and it does exactly what I think I want to do:
extension EditorViewController {
func showEditingControlsOrnament() {
let ornament = UIHostingOrnament(sceneAlignment: .bottom, contentAlignment: .center) {
EditingControlsView(model: controlsViewModel)
.glassBackgroundEffect()
}
self.ornaments = [ornament]
editorView.style = .edgeToEdge
}
}
But the thing I really want to know is what is in EditingControlsView. Is it a toolbar? How do you make a toolbar in SwiftUI without something to attach the .toolbar modifier to?
I am trying to build a UICollectionView where the rows expand / collapse (for example, where the row only has a title initially, but when tapped expands to show a text view). I'm aware I can use UIContentConfiguration to swap a SwiftUI view for the cell's contentView, but I'm trying to do this in UIKit for configurability.
I have watched WWDC 22, 10068: What's new in UIKit, which made this sound easy...
I am using UICollectionLayoutListConfiguration for the UICollectionViewLayout.
When a cell is tapped, I update the subviews' constraints to the "expanded" state, but this just causes the subviews to expand beyond the cell height. All subviews are on cell.contentView. Calling layoutIfNeeded, invalidateIntrinsicContentSize, on cell doesn't change the cell height.
I assumed all I would need to do is set collectionView.selfSizingInvalidation = .enabledIncludingConstraints, but is overriding intrinsicContentSize of the cell the only way to accomplish this?
Topic:
UI Frameworks
SubTopic:
UIKit
I've got a UIKit app with a collapsible trailing-edge child view controller, implemented sort of like UISplitViewController but it's got a bunch of custom behavior - moving to the bottom edge in portrait orientation, etc. It exposes a couple of different app functions via a UITabBar on the bottom edge on iOS.
When I run the app on visionOS, that tab bar transforms to a leading-edge ornament. This would be great, but that means it tries to overlap the trailing-edge content of its parent view controller, which isn't ideal.
Is there a way to get the tab bar to lay out on the trailling edge of the child view controller? Or can I create a custom ornament that has the same auto-expand behavior as the tab bar, where it shows a vertical column of icons that expands to show titles when you're gazing at it?
My app supports only iPhone mode, and when it runs on an iPad device, it normally displays compatible iPhone mode;
But when compatibility mode is displayed normally, everything is fine in the UI.
But my code as long as you use the AVPictureInPictureController, open the picture in picture, can lead to code for [UIScreen mainScreen] bounds will change, become the real width and height of the equipment, so the UI disorder;
Problems arise when our code is laid out with [UIScreen mainScreen] bounds.
Like this:
This was normal in iOS16 and iOS17, but suddenly it happened in iOS18
How should my application be compatible with this?
I am creating an application using PKCanvasview.
One function of that app is the ability to trace and retrieve a UITextView that has been addSubviewed to a PKCanvasView.
We have confirmed that this functionality works correctly in the simulator and on the actual device on IOS 17.4.
This feature did not work correctly on the IOS18 simulator and the actual device.
Is this a bug?
And if it is normal behavior, is there an alternative?
There was a crash during the creation of picture-in-picture in iOS 18. No problems were found after reviewing the code.
Please take a look at the possible reasons for the code crash here and how the business code should be protected
21 libsystem_kernel.dylib 0x1dac4ec20 abort_with_payload_wrapper_internal + 104
22 libsystem_kernel.dylib 0x1dac4ebb8 abort_with_reason + 32
23 libobjc.A.dylib 0x1880ffea0 _objc_fatalv(unsigned long long, unsigned long long, char const*, char*) + 116
24 libobjc.A.dylib 0x1880ffe2c _objc_fatal(char const*, ...) + 32
25 libobjc.A.dylib 0x1880ff040 weak_register_no_lock + 396
26 libobjc.A.dylib 0x1880fec50 objc_storeWeak + 472
27 AVKit 0x1b7a904e4 -[AVObservationController initWithOwner:] + 164
28 AVKit 0x1b7ab1d90 -[AVPictureInPictureController _commonInitWithSource:] + 104
29 AVKit 0x1b7b6cc14 -[AVPictureInPictureController initWithContentSource:] + 184
30 AVKit 0x1b7b6ccd8 -[AVPictureInPictureController initWithPlayerLayer:] + 84
Topic:
UI Frameworks
SubTopic:
UIKit
For a UIKit app based on scenes (UIScene), is it safe to reference UserDefaults in code that is executed from UIApplicationDelegate/application(_: didFinishLaunchingWithOptions:) ?
I've read that in iOS 15, there were undocumented scenarios involving app prewarming that would cause UserDefaults reads to fail within a window of time after device reboots, as described at https://christianselig.com/2024/10/beware-userdefaults/
The failure mode is that an app would be released, and months later, a small fraction of users would report failures consistent with UserDefaults reads unexpectedly returning nil, causing a loss of data. The user experience is bad, and debugging this behavior is then challenging because of how rarely it occurs.
Apple's https://developer.apple.com/documentation/uikit/app_and_environment/responding_to_the_launch_of_your_app/about_the_app_launch_sequence#3894431 seems to suggest that prewarming only executes an app "up until, but not including when main() calls UIApplicationMain(_:_:_:_:), but https://stackoverflow.com/questions/71025205/ios-15-prewarming-causing-appwilllaunch-method-when-prewarm-is-done documents that UIApplicationDelegate/application(_: didFinishLaunchingWithOptions:) has in fact been observed executing during app prewarming in scene-based apps.
So, my question: In an app based on scenes, if I'd like to reference UserDefaults within UIApplicationDelegate/application(_: didFinishLaunchingWithOptions:), when is it safe to do this?
I'm guessing the answer is one of these:
Never.
Only in apps that don't support scenes.
Only in iOS 16 or later.
Only in IOS 17 or later.
Is it guaranteed safe to reference UserDefaults in UIWindowSceneDelegate/scene(_:willConnectTo:options:) or later?
Is there documentation from Apple regarding this issue?
Thank you.
I'm getting a crash wherever I've used the Collection view in my app with this exception:
Unhandled managed exception: Objective-C exception thrown. Name: NSInternalInconsistencyException Reason: Expected dequeued view to be returned to the collection view in preparation for display. When the collection view's data source is asked to provide a view for a given index path, ensure that a single view is dequeued and returned to the collection view. Avoid dequeuing views without a request from the collection view. For retrieving an existing view in the collection view, use -[UICollectionView cellForItemAtIndexPath:] or -[UICollectionView supplementaryViewForElementKind:atIndexPath:]. Dequeued view:
It not built with native Swift or Xcode, instead it's a .Net MAUI app for iOS and it's crashing only on iOS 18+ and working absolutely fine on all other versions below iOS 18. I've not used any dequeuing of cells or any such code as it is not a native code, it's C# code and I'm just using template selector for designing different cells of collection view, so I'm not getting any fix for this exception as how to fix this dequeuing problem when I don't even have any such native code. Has anyone fixed this issue or find a solution for it yet?
Topic:
UI Frameworks
SubTopic:
UIKit
APP有一個UI是輸入數字的TextField,每輸入一個數字會自動跳至下一個TextField,總共有6個Textfield,但是用戶輸入時,畫面顯示的數字會自動縮小,並取不到Textfield的值,非常奇怪!!
Hello, Dear Developers
Problem Description
My team is working on functionality test in iOS18.
Basically, application functionality works as expected without any modification.
However, We found a small issue in settings application.
iOS 17
In iOS17, 3rd party OSS license string in settings application would been displayed if the license button is been clicked.
Model: iPhone SE 3
OS Version: 17.6.1
iOS 18
However, in iOS18, nothing but a blank page.
Model: iPhone SE 3
OS Version: 18.0.1
Settings.bundle
Below are files in settings.bundle.
What I've searched
Using XCode 16 makes no change
Nothing about settings.bundle in iOS 18 release note
A similar post: https://forums.developer.apple.com/forums/thread/764519
The solution in the post doesn't solve my problem.
If you know the solution, please let me know.
Best wishes.
Crashed: com.apple.main-thread
0 CardSuiteExperience 0x4e2f0 objectdestroyTm + 376
1 CardSuiteExperience 0x322424 block_destroy_helper + 33784
2 CardSuiteExperience 0x321e24 block_destroy_helper + 32248
3 UIKitCore 0x2b4904 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:isCellMultiSelect:deselectPrevious:performCustomSelectionAction:] + 1232
4 UIKitCore 0x1073af4 -[UITableView _userSelectRowAtPendingSelectionIndexPath:animatedSelection:] + 268
5 UIKitCore 0x1073bf4 -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 216
6 UIKitCore 0xba5d8 -[_UIAfterCACommitBlock run] + 72
7 UIKitCore 0xba49c -[_UIAfterCACommitQueue flush] + 164
8 UIKitCore 0xba3b4 _runAfterCACommitDeferredBlocks + 496
9 UIKitCore 0xb9fec _cleanUpAfterCAFlushAndRunDeferredBlocks + 80
10 UIKitCore 0xb9efc _UIApplicationFlushCATransaction + 72
11 UIKitCore 0xb7660 _UIUpdateSequenceRun + 84
12 UIKitCore 0xb72a4 schedulerStepScheduledMainSection + 172
13 UIKitCore 0xb8148 runloopSourceCallback + 92
14 CoreFoundation 0x56834 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 28
15 CoreFoundation 0x567c8 __CFRunLoopDoSource0 + 176
16 CoreFoundation 0x54298 __CFRunLoopDoSources0 + 244
17 CoreFoundation 0x53484 __CFRunLoopRun + 828
18 CoreFoundation 0x52cd8 CFRunLoopRunSpecific + 608
19 GraphicsServices 0x11a8 GSEventRunModal + 164
20 UIKitCore 0x40aae8 -[UIApplication _run] + 888
21 UIKitCore 0x4bed98 UIApplicationMain + 340
22 UIKitCore 0x638504 keypath_get_selector_hoverStyle + 11024
23 Card Suite Lite 0x17e6fc main + 4332857084 (AppDelegate.swift:4332857084)
24 ??? 0x1bbfe3154 (Missing)
Topic:
UI Frameworks
SubTopic:
UIKit
After updating to tvOS 18 I've noticed the following change in focus behavior:
When a UICollectionView is located next to any other view (even one with user interaction disabled), attempting to move focus within the collection view in that view's direction to a next collection view item, which is currently outside of the visible area, doesn't have any effect.
Like if the focus engine preferred to move focus to that other view (despite it being not focusable) over a currently hidden collection view cell.
This didn't happen in tvOS 17 and earlier.
A minimal reproducible project can be found here.
Steps to reproduce:
Launch the app on a tvOS 18 device.
Swipe right and observe that focus moves without issues.
Swipe left and observe that in most cases focus doesn't move to items beyond the visible area due to an empty grey view located to the left from the collection view.
Compare to the same app running on tvOS 17 and observe that focus moves both sides without issues.
The issue is reproducible on Xcode versions 16.0 (16A242d) and 15.4 (15F31d).
Did anyone face the same issue and/or has suggestions on a possible fix?
The Maps app on macOS always zooms the same way (two fingers up to zoom in, two fingers down to zoom out) when the shift key is held down, regardless of whether natural scrolling is turned off. I'd like to replicate this same behavior using UIPanGestureRecognizer, but the translation is always inverted whenever I disable natural scrolling. How can I detect if natural scrolling is enabled or disabled when the pan gesture is detected?
Hi, My methodA is synchronous and be called in main thread. methodA gets input strings from methodB via poping a UIAlertController with UITextField.
I have two versions of codes as below. On some iphones with iOS versions, both two versions codes works, such as iPhone SE2 with iOS 17.7. But on some iphones with iOS versions, the two versions of codes can't work, such as iPhone XR with iOS 18.0.1 or iPhone 14 plus with iOS 13.6.
How can I get the input string from UIAlertController in the synchronous method on all iPhones and iOS versions.
/*
//version 1.
-(NSString *)methodA
{
// Prepare a local variable to capture the input
__block NSString *inputString = nil;
// Call methodB to display the UIAlertController modally
[self methodBWithCompletion:^(NSString *result) {
inputString = result;
// Stop the run loop when input is received
CFRunLoopStop(CFRunLoopGetCurrent());
}];
// Run the run loop manually to block execution until CFRunLoopStop() is called
CFRunLoopRun();
// Once the run loop stops, return the user input
return inputString;
}
-(void)methodBWithCompletion:(void (^)(NSString *))completion
{
// Create the UIAlertController for user input
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Enter PIN"
message:nil
preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"PIN";
textField.secureTextEntry = YES;
}];
UIAlertAction *submitAction = [UIAlertAction actionWithTitle:@"Submit"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
// Get the text from the UITextField
UITextField *textField = alertController.textFields.firstObject;
NSString *input = textField.text;
// Pass the input back via the completion handler
if (completion) {
completion(input);
}
}];
[alertController addAction:submitAction];
// Present the alert modally on the main window's rootViewController
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
*/
/*
//version 2.
-(NSString *)methodA {
// Prepare a variable to hold user input
__block NSString *inputString = nil;
NSLog(@"methodA:....");
// Call methodB to display the UIAlertController asynchronously
[self methodBWithCompletion:^(NSString *result) {
inputString = result;
}];
// Run the main run loop until the inputString is not nil (user input provided)
while (inputString == nil) {
// Run the loop for a short time interval, allowing the UI to remain responsive
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
}
// Return the input string once the user has submitted the input
return inputString;
}
-(void)methodBWithCompletion:(void (^)(NSString *))completion {
// Create and configure the UIAlertController
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Enter PIN"
message:nil
preferredStyle:UIAlertControllerStyleAlert];
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"PIN";
textField.secureTextEntry = YES;
}];
UIAlertAction *submitAction = [UIAlertAction actionWithTitle:@"Submit"
style:UIAlertActionStyleDefault
handler:^(UIAlertAction * _Nonnull action) {
UITextField *textField = alertController.textFields.firstObject;
NSString *input = textField.text;
// Return the input via the completion handler
if (completion) {
completion(input);
}
}];
[alertController addAction:submitAction];
// Present the alert on the main thread
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
*/
Topic:
UI Frameworks
SubTopic:
UIKit
let activityViewController = UIActivityViewController(activityItems: items,
applicationActivities: [])
activityViewController.popoverPresentationController?.barButtonItem = navigationController.topViewController?.navigationItem.rightBarButtonItem
navigationController.present(activityViewController, animated: true, completion: nil)
Crash logs
=====================================================
*** Assertion failure in -[_UIActivityContentCollectionView _dequeueReusableViewOfKind:withIdentifier:forIndexPath:viewCategory:], UICollectionView.m:7588
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Attempted to dequeue a cell for a different registration or reuse identifier than the existing cell when reconfiguring an item, which is not allowed. You must dequeue a cell using the same registration or reuse identifier that was used to dequeue the cell originally to obtain the existing cell. Dequeued reuse identifier: UIActivityContentActionCellIdentifier; Original reuse identifier: UIActivityActionGroupCell; Existing cell: <UIActivityActionGroupCell: 0x10f19f220; baseClass = _UICollectionViewListCell; frame = (16 354; 358 30); clipsToBounds = YES; layer = <CALayer: 0x600000781740>>'
I belong to an EC shop application developers' team, and we got a crame from a small part of our customers about our application.
"Search Bar does not work on iOS 18."
This bug doesn't appear on most of our devices updated to iOS 18.0.
In some cases, it disappeared by turning [Settings > Accessibility > Touch > Reachability] off.
But it is not the same for all customers found the bug.
I'm looking for how to fix this bug, and why it happens.
I'm not sure but I doubt that this may be a bug of iOS18, UIKit, RxCocoa, RxSwift, or something else.
Any information would be welcome.
import UIKit
import RxSwift
import RxCocoa
@IBDesignable
public final class SearchBar: UISearchBar {
var textField: UITextField {
if #available(iOS 13.0, *) {
return searchTextField
} else {
return value(forKey: "_searchField") as! UITextField
}
}
private let disposeBag = DisposeBag()
private func bind() {
textField.rx.isFirstResponder
.bind(to: Binder(self) { me, isFirstResponder in
// This doesn't work in some iOS 18 devices.
me.textField.attributedPlaceholder = placeholderAttributedString(isFirstResponder: isFirstResponder)
me.textField.backgroundColor = isFirstResponder ? Asset.Colors.whiteTwo.color : .white
if me.useCancelButton {
me.showsCancelButton = isFirstResponder
}
if me.useBookmarkButton {
me.showsBookmarkButton = !isFirstResponder
}
})
.disposed(by: disposeBag)
}
public override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
public override func awakeFromNib() {
super.awakeFromNib()
commonInit()
}
public override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
commonInit()
}
private func commonInit() {
bind()
}
}
extension Reactive where Base: SearchBar {}
import UIKit
import RxSwift
import RxCocoa
@IBDesignable
public final class SearchHeaderView: UIView {
@IBOutlet private weak var searchBar: SearchBar!
@IBOutlet private weak var cartContainerView: UIView!
private let disposeBag = DisposeBag()
public override init(frame: CGRect) {
super.init(frame: frame)
loadFromNib()
commonInit()
}
public required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
public override func awakeFromNib() {
super.awakeFromNib()
loadFromNib()
commonInit()
}
public override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
loadFromNib()
commonInit()
}
private func commonInit() {
bind()
}
private func bind() {
// ↓ This doesn't work in some iOS 18 devices.
searchBar.textField.rx.isFirstResponder
.bind(to: cartContainerView.rx.isHidden)
.disposed(by: disposeBag)
}
}
extension SearchAndCartHeaderView: NibOwnerLoadable {}
My code as long as you use the AVPictureInPictureController, open the PIP model, and then back to the desktop, my widget will refresh is invalid, I closed the PIP code mode, functions are normal refresh.
I don't know what the reason is, is the system made a refresh limit?