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

Posts under UIKit tag

200 Posts
Sort by:

Post

Replies

Boosts

Views

Activity

New window scenes on iPad always take the size of the activating window
I'm using multiple scenes in my iPad app. When I open a new scene from my main window, that new window is always the same size as the previous window. When I make the main window very small and then create a new scene, that new window is also tiny. When I make the main window very big, you guessed it. UIWindowScene.sizeRestrictions does not seem to help here. How can I give new windows a default size (it's okay if they're resizable after presenting)? This is such a weird behavior. Video of the problem in action: https://mastodon.social/@nicoreese/115033539035249909
Topic: UI Frameworks SubTopic: UIKit Tags:
1
0
116
3w
App lifecycle on iPadOS 26
It appears from my testing that the following is true: If you close all windows of an app, the app terminates entirely. Minimizing the last window sends it into multitasking. This is different from previous behavior and might have implications on your app's logic. If you close the last window and quickly tap the app icon again, that same window will come back. Waiting a second before tapping the app icon will bring up the main window (likely because by that point the app was terminated and relaunched). Is this expected behavior? I did not see any announcement of this. I find this a bit counterintuitive and would presume that closing the last window would just send the app to multitasking, just like previously. Quitting the app should be reserved by swiping up on it in the multitasking UI or with a new context menu command.
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
56
3w
Best practices to use low-latency feature in UIUpdateLink?
Hi everyone, I'm not an experienced developer. I'm interested in the low-latency related APIs in UIUpdateLink, but I failed to write even a minimal demo that works. UIUpdateInfo.isImmediatePresentationExpected is always false here. My understanding must be wrong. I've totally no idea so I'm asking for help here. I appreciate anyone who gives suggestions of any kind. Here's my (failed) demo about tracking touch inputs (of the 1st finger) and draw some shape at that place: import UIKit class ContentUIView: UIView { // MARK: - About UIUpdateLink and drawing required init?(coder: NSCoder) { super.init(coder: coder) initializeUpdateLink() } override init(frame: CGRect) { super.init(frame: frame) initializeUpdateLink() } private func initializeUpdateLink() { self.updateLink = UIUpdateLink(view: self) self.updateLink.addAction(to: .beforeCADisplayLinkDispatch, target: self, selector: #selector(update)) self.updateLink.wantsImmediatePresentation = true self.updateLink.isEnabled = true } @objc func update(updateLink: UIUpdateLink, updateInfo: UIUpdateInfo) { print(updateInfo.isImmediatePresentationExpected) // FIXME: Why always false? CATransaction.begin() defer { CATransaction.commit() } layer.setNeedsDisplay() layer.displayIfNeeded() } override func draw(_ rect: CGRect) { // FIXME: Any way to support opacity? guard let context = UIGraphicsGetCurrentContext() else { return } context.clear(rect) guard let lastTouch = self.lastTouch else { return } let location = lastTouch.location(in: self) let circleBounds = CGRect(x: location.x - 16, y: location.y - 16, width: 32, height: 32) context.setFillColor(.init(red: 1/2, green: 1/2, blue: 1/2, alpha: 1)) context.addLines(between: []) context.fillEllipse(in: circleBounds) } // MARK: - Touch input override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) guard lastTouch == nil else { return } lastTouch = touches.first } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesEnded(touches, with: event) guard let lastTouch, touches.contains(lastTouch) else { return } self.lastTouch = nil } override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { self.touchesEnded(touches, with: event) } private var lastTouch: UITouch? private var updateLink: UIUpdateLink! } #Preview { ContentUIView() } Anyway, I'm not meant to find alternative APIs and I'd be willing to know what it can't do.
0
0
69
3w
UITabBar in iOS 26 is Too Big for Touch ID Devices
I do the majority of my test development on an iPhone 16 Pro in the iOS Simulator. As part of my UI rework to maintain compatibility with iOS 26 I decided to run on an older device with a small screen size for testing. The smallest device that supports iOS 26 is the iPhone SE 2nd Gen and 3rd Gen. Take a look at the image below: On the left is the iPhone SE 2nd Gen. On the right iPhone 16 Pro. It looks like the UITabBar which is from a UITabBarController is sized too tall. The actual Tab Bar itself is 62px while the container that houses it is 83px. Yes there should be some top/bottom space to allow for the Liquid Glass Effect to overlap as it often spills outside it's bounds but this feels like far too much. Looking at them side by side, the iPhone SE Tab Bar actually takes up more space which is not ideal for users who are working on a smaller screen to begin with and have less real estate. It looks like the bottom space is allowable room for the 'swipe to dismiss line' however these devices use Touch ID and that line is never present. Feels like the 83px for the Tab Bar should be reduced on these devices to allow for more useable screen real estate. Is this a design oversight as iOS 26 seems to be built predominantly for Face ID Devices? Just wondering if any Apple Design Engineers can chime in to see if this will be addressed in a future beta? The only way to change it at this stage is with a CGAffineTransform however this does not impact the '_UITabBarContainerWrapperView' that sits behind it. Also, on that note. The '_UITabBarContainerWrapperView' sometimes seems to be clear and other times displays a solid system background color. Is there anyway to control this? Many of my views both SwiftUI and UIKit have differing behaviour. My understanding is the idea of iOS 26 is for your app's content to be visible behind the Tab Bar, however the content is obscured by '_UITabBarContainerWrapperView' in many of my views and I can not figure out how to change that. Thanks!
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
105
3w
Detents Size Differently on Touch ID Devices in iOS 26
When working with modal sheet views in iOS 26 I animate changes to detent size like this: if let sheet = self.sheetPresentationController { let newDetent = 400 sheet.animateChanges { sheet.invalidateDetents() sheet.detents = [.custom(resolver: { context in newDetent })] } } What I have found is that when using a Touch ID Device the input detent will be smaller when the system presents it. If I set the detent size to be 400, on an iPhone 16 Pro it will be 400px but on an iPhone SE 2nd Gen it will be 366. It seems to be consistently 34px shorter on devices with a Touch ID Square Shaped Screen. This 34px corresponds to the bottom safe area. This feels like a bug to me. I would expect the detent size to match what I assign on all devices. I will monitor if this is fixed in a future beta but it is present as of iOS 26 Beta 5. In the meantime I have built this helper function which will then correctly size it on all devices: static func getDetent(basedOn inputValue: Double) -> CGFloat { if let window = UIApplication.shared.windows.first { if window.safeAreaInsets.bottom > 0 { // Face ID Device, Bottom Inset of 34 return inputValue } else { // Touch ID Device, Bottom Inset of 0 return inputValue + 34 } } else { // Fallback, Return Input Value return inputValue } } This impacts when animating detents as per above but also when presenting a Sheet View for the first time and assigning a custom detent. Thanks!
Topic: UI Frameworks SubTopic: UIKit Tags:
1
0
62
3w
iOS 26 applying blur to UIView in navigationBar
Using a storyboard, I created a UIView containing an UIImageView and a UILabel, that I dragged into the navigation bar of one of my viewControllers. In my viewDidLoad I transform the view to move it down past the bounds of the navigation bar so its hidden initially navBarMiddleView.transform = .init(translationX: 0, y: 50) Then as the screen scrolls, I slowly move it up so it slides back into the middle of the navigationBar func scrollViewDidScroll(_ scrollView: UIScrollView) { let padding: CGFloat = 70 let adjustedOffset = (scrollView.contentOffset.y - padding) navBarMiddleView.transform = .init(translationX: 0, y: max(0, (50 - adjustedOffset))) } (The content is displayed in a collectionView cell as large content initially, and I want it to remain visible as the user scrolls down. So a mini view of the same data is moved up into the navigationBar) With iOS 26 the navigationBar is applying a blur effect to this view, even when its outside the bounds of the navigationBar, meaning the content its hovering on top of is slightly obscured. I don't know why this blur is being added, how do I remove it? I've tried the following based on recommendations from chatGPT but none have worked self.navigationController?.navigationBar.clipsToBounds = true self.navBarMiddleView.layer.allowsGroupOpacity = false self.navBarMiddleView.backgroundColor = .clear self.navBarMiddleView.isOpaque = true self.navBarMiddleView.layer.isOpaque = true I have my navigation bar setup with this appearence already: let navigationBarAppearance = UINavigationBarAppearance() navigationBarAppearance.configureWithOpaqueBackground() navigationBarAppearance.backgroundEffect = nil navigationBarAppearance.backgroundColor = UIColor.clear navigationBarAppearance.shadowColor = .clear navigationBarAppearance.titleTextAttributes = [ NSAttributedString.Key.foregroundColor: UIColor.colorNamed("Txt2"), NSAttributedString.Key.font: UIFont.custom(ofType: .bold, andSize: 20) ] UINavigationBar.appearance().standardAppearance = navigationBarAppearance UINavigationBar.appearance().compactAppearance = navigationBarAppearance UINavigationBar.appearance().scrollEdgeAppearance = navigationBarAppearance
1
0
74
3w
[iOS18]The transition animation stops and cannot be interacted with
The app becomes unresponsive when pushing a new page. The screen is covered by the _UIParallaxOverlayView class, blocking all gestures. Are there any scenarios where the transition animation might suddenly stop mid-process? Or could you provide more information to help me troubleshoot this issue? I noticed: When the issue occurs, the FromViewController is displayed on the screen. The ToViewController also exists in the view tree, but it's not visible on the screen. _UIParallaxOverlayView only appears on iOS 18 and above. The animation appears to be controlled by +[UIView _fluidParallaxTransitionsEnabledWithTraitCollection:], which is _os_feature_enabled_impl("UIKit", "fluid_parallax_transitions"). Reference
0
0
42
3w
UISearchController scope buttons disappear forever after dismissing search when embedded in a search tab
When a UISearchController is placed inside a search tab, the scope buttons disappear when dismissing the search bar once. They never return. When using in any regular view controller container, like even another default tab, everything works fine. Is there something I can do to prevent this? Video: https://mastodon.social/@nicoreese/115017696077771370 FB19587916 let homeTab = UITab( title: "Home", image: UIImage(systemName: "house"), identifier: "Home" ) { _ in UINavigationController(rootViewController: ViewController()) } let searchTab = UISearchTab { _ in UINavigationController(rootViewController: SearchViewController()) } let tabBarController = UITabBarController(tabs: [ homeTab, searchTab ]) tabBarController.mode = .tabSidebar class SearchViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .systemBackground self.title = "Home" let searchController = UISearchController(searchResultsController: nil) searchController.searchBar.scopeButtonTitles = [ "Scope 1", "Scope 2" ] searchController.searchBar.showsScopeBar = true self.navigationItem.searchController = searchController } }
Topic: UI Frameworks SubTopic: UIKit Tags:
1
1
74
3w
UISearchController cannot become first responder when switching to a search tab
I would like my users to be able to switch to the search tab (in the sidebar) on iPad and immediately start typing. This is not possible. Calling becomeFirstResponder in viewDidLoad and viewWillAppear does not work. Only in viewDidAppear it does, but that comes with a significant delay between switching to the tab and the search field becoming active. Is there something else I can do? FB19588765 let homeTab = UITab( title: "Home", image: UIImage(systemName: "house"), identifier: "Home" ) { _ in UINavigationController(rootViewController: ViewController()) } let searchTab = UISearchTab { _ in UINavigationController(rootViewController: SearchViewController()) } let tabBarController = UITabBarController(tabs: [ homeTab, searchTab ]) tabBarController.mode = .tabSidebar class SearchViewController: UIViewController { let searchController = UISearchController(searchResultsController: nil) override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .systemBackground self.title = "Search" self.navigationItem.searchController = searchController self.navigationItem.preferredSearchBarPlacement = .integratedCentered searchController.becomeFirstResponder() // Does not work. searchController.searchBar.becomeFirstResponder() // Does not work. } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) searchController.searchBar.becomeFirstResponder() // Does not work. } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) searchController.searchBar.becomeFirstResponder() // Works. But comes with a significant delay. } }
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
65
3w
Should setting a UIVisualEffectView's effect to nil remove its visual glass effect?
In the WWDC 2025 session "Build a UIKit app with the with the new design", at the 23:22 mark, the presenter says: And finally, when you no longer need the glass on screen animate it out by setting the effect to nil. The video shows a UIVisualEffectView whose effect is set to a UIGlassEffect animating away as its effect is set to nil. But when I do this in my app (or a sample app), setting effect to nil does not remove the glass appearance. Is this expected? Is the video out of date? Or is this a bug?
Topic: UI Frameworks SubTopic: UIKit Tags:
7
4
90
4d
Leading Swipe action in UIPageViewController is not working when it is pushed on UINavigationController.
When a UIPageViewController is pushed in a UINavigationController, the leading swipe action from middle of screen dismisses the PageViewController instead of going to previous page. When the Example code is opened from Xcode 16.4.0, ✅ Left Swipe action from left screen edge of screen dismisses the Page View Controller. ✅ Left Swipe action from middle of screen goes to previous Page in Page View Controller When the Example code is opened from Xcode 26.0 - Beta 6, ✅ Left Swipe action from left screen edge of screen dismisses the Page View Controller. ❌ Left Swipe action from middle of screen sometimes goes to previous page and sometimes dismisses the Page View Controller. Example code that the issue occurs: import Foundation import UIKit import PlaygroundSupport PlaygroundPage.current.setLiveView( UINavigationController(rootViewController: RootViewController()) ) class RootViewController: UIViewController { lazy var pageVCButton: UIButton = { let button = UIButton() button.setTitle("Open Page VC", for: .normal) button.setTitleColor(.label, for: .normal) button.addAction(UIAction(handler: { [weak self] _ in self?.didTapPageVCButton() }), for: .touchUpInside) return button }() lazy var pageContainerViewController = PageContainerViewController(startIndex: 3) func didTapPageVCButton() { print("didTapPageVCButton") navigationController?.pushViewController(pageContainerViewController, animated: true) } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground addOpenPageVCButton() } private func addOpenPageVCButton() { view.addSubview(pageVCButton) pageVCButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pageVCButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), pageVCButton.centerYAnchor.constraint(equalTo: view.centerYAnchor), ]) } } class PageContainerViewController: UIViewController { lazy var pageViewController: UIPageViewController = { let pageViewController = UIPageViewController( transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil ) pageViewController.dataSource = self pageViewController.delegate = self return pageViewController }() lazy var pages: [ColouredViewController] = [ ColouredViewController(backgroundColor: .red), ColouredViewController(backgroundColor: .blue), ColouredViewController(backgroundColor: .green), ColouredViewController(backgroundColor: .yellow), ColouredViewController(backgroundColor: .brown), ColouredViewController(backgroundColor: .link), ColouredViewController(backgroundColor: .cyan), ] var startIndex = 0 init(startIndex: Int) { super.init(nibName: nil, bundle: nil) self.startIndex = startIndex } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() navigationController?.title = "Page View Controller" print(pageViewController.gestureRecognizers) setupPageViewController() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } private func setupPageViewController() { addChild(pageViewController) view.addSubview(pageViewController.view) pageViewController.didMove(toParent: self) pageViewController.view.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ pageViewController.view.topAnchor.constraint(equalTo: view.topAnchor), pageViewController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), pageViewController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), pageViewController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), ]) pageViewController.setViewControllers([pages[startIndex]], direction: .forward, animated: true) } } extension PageContainerViewController: UIPageViewControllerDataSource { func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { print("Leading Swipe") guard let viewController = viewController as? ColouredViewController else { return nil } guard let currentPageIndex = pages.firstIndex(of: viewController) else { return nil } if currentPageIndex == 0 { return nil } return pages[currentPageIndex - 1] } func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { print("Trailing Swipe") guard let viewController = viewController as? ColouredViewController else { return nil } guard let currentPageIndex = pages.firstIndex(of: viewController) else { return nil } if currentPageIndex == pages.count - 1 { return nil } return pages[currentPageIndex + 1] } } extension PageContainerViewController: UIPageViewControllerDelegate {} class ColouredViewController: UIViewController { var backgroundColor: UIColor? init(backgroundColor: UIColor) { super.init(nibName: nil, bundle: nil) self.backgroundColor = backgroundColor } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = backgroundColor } }
1
0
49
3w
Xcode always crash.
OS version:15.6 (24G84). mac mini m 4 Xcode:16.4 stack: Translated Report (Full Report Below) Process: Xcode [5261] Path: /Applications/Xcode.app/Contents/MacOS/Xcode Identifier: com.apple.dt.Xcode Version: 16.4 (23792) Build Info: IDEApplication-23792000000000000~2 (16F6) App Item ID: 497799835 App External ID: 874973124 Code Type: ARM-64 (Native) Parent Process: launchd [1] User ID: 501 Date/Time: 2025-08-11 19:57:18.7642 +0800 OS Version: macOS 15.6 (24G84) Report Version: 12 Anonymous UUID: 314F3813-7BB3-0263-1826-79D64A62D963 Time Awake Since Boot: 700 seconds System Integrity Protection: enabled Crashed Thread: 0 Dispatch queue: com.apple.main-thread Exception Type: EXC_BREAKPOINT (SIGTRAP) Exception Codes: 0x0000000000000001, 0x00000001ab5dc1f8 Termination Reason: Namespace SIGNAL, Code 5 Trace/BPT trap: 5 Terminating Process: exc handler [5261] Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 libswiftCore.dylib 0x1ab5dc1f8 assertionFailure(:_:file:line:flags:) + 176 1 libswiftCore.dylib 0x1ab64a378 swift_unexpectedError + 656 2 IDEKit 0x108d2edc4 EditorGalleryView.exhibitIdentifiers(in:) + 972 3 IDEKit 0x108d2978c EditorGalleryView.commitState(to:) + 2640 4 IDEKit 0x108d29a64 @objc EditorGalleryView.commitState(to:) + 52 5 DVTFoundation 0x1046fe9d0 -[DVTStateToken _copyStatefulObjectState] + 84 6 DVTFoundation 0x1046feaa8 -[DVTStateToken pushStateToRepositoryAndReturnError:] + 52 7 DVTFoundation 0x10481ab48 -[DVTStateRepository _updateStateIfNeeded] + 232 8 DVTFoundation 0x1046fe9f0 -[DVTStateToken _copyStatefulObjectState] + 116 9 DVTFoundation 0x1046feaa8 -[DVTStateToken pushStateToRepositoryAndReturnError:] + 52 10 DVTFoundation 0x10481ab48 -[DVTStateRepository _updateStateIfNeeded] + 232 11 DVTFoundation 0x1046fe9f0 -[DVTStateToken _copyStatefulObjectState] + 116 12 DVTFoundation 0x1046feb04 -[DVTStateToken _stateDictionary] + 12 13 IDEKit 0x1089a2a38 -[IDEEditorContext _currentHistoryItemAllowingCoalescingAdjustment:] + 508 14 IDEKit 0x10899f11c -[IDEEditorContext willBeginTransactionScopeForNavigableItemCoordinator:] + 332 15 IDEKit 0x1087b3600 __35-[IDENavigableItemCoordinator init]_block_invoke + 148 16 DVTFoundation 0x1047a3ef0 -[DVTObservingBlockToken observeValueForKeyPath:ofObject:change:context:] + 440 17 Foundation 0x19b49c7b4 NSKeyValueNotifyObserver + 252 18 Foundation 0x19b549560 NSKeyValueDidChange + 388 19 Foundation 0x19b48f99c -[NSObject(NSKeyValueObservingPrivate) _changeValueForKeys:count:maybeOldValuesDict:maybeNewValuesDict:usingBlock:] + 760 20 Foundation 0x19b4b805c -[NSObject(NSKeyValueObservingPrivate) _changeValueForKey:key:key:usingBlock:] + 64 21 Foundation 0x19b577434 _NSSetBoolValueAndNotify + 404 22 DVTFoundation 0x104895f18 -[DVTModelGraphTransactionScope _beginTransactionDownward] + 48 23 DVTFoundation 0x104896160 -[DVTModelGraphTransactionScope performTransaction:] + 48 24 DVTFoundation 0x1047a0b30 -[DVTModelObjectGraph performBlockCoalescingModelChanges:] + 136 25 IDEFoundation 0x10d510c80 -[IDEFileReference _invalidateStartingWith:changeBlock:] + 172 26 IDEFoundation 0x10d511c00 -[IDEFileReference discoveredFileDataType] + 300 27 IDEKit 0x1088cda84 -[IDEFileReference(IDEKitFileReferencePropertyAdditions) navigableItem_contentDocumentLocation] + 32 28 IDEKit 0x1089030c0 -[IDEKeyDrivenNavigableItem contentDocumentLocation] + 68 29 IDEKit 0x108a4a644 +[IDENavigableItem _navigableItemForNavigationFromNavigableItem:workspace:] + 80
2
0
68
3w
[iOS 26 beta] UIScene migration with loadFileURL:allowingReadAccessToURL: has partial rendering for app BG launch
We're currently migrating from AppDelegate to UISceneDelegate due to console warnings . Our application's UI, which is built on a single webpage, functions correctly when launched in the foreground after this migration. However, we've encountered an issue with partial rendered UI components when launching the application from the background, such as upon receiving a VoIP call. During a background launch, the following delegate calls occur before the client attempts to load a local webpage: [08/07 16:25:49:037][ 0x101ea3910]<ALA_SIGNAL>: [OS-PLT] Exit -[AppDelegate application:didFinishLaunchingWithOptions:] [08/07 16:25:49:084][ 0x10c0c4140]<PushToTalk> [Pushnotif] [] <ALA_SIGNAL>: [OS-CCF] Enter -[PushNotificationManager pushRegistry:didReceiveIncomingPushWithPayload:forType:withCompletionHandler:] [08/07 16:25:49:098][ 0x101ea3910]Begin -[SceneDelegate scene:willConnectToSession:options:] [08/07 16:25:49:098][ 0x101ea3910]Exit -[SceneDelegate scene:willConnectToSession:options:] As part of client login process we load the index page in WebKit here: [08/07 16:25:50:977][ 0x101ea3910]<ALA_SIGNAL>: [PLT-OS] Enter -[SceneDelegate loadUI:] [UI Launch Reason = 1] Code: NSString *path = [[NSBundle mainBundle]pathForResource:@"index" ofType:@"html" inDirectory:@"www"]; NSURL *urlReq = [NSURL fileURLWithPath:path]; [webView loadFileURL:urlReq allowingReadAccessToURL:urlReq]; The problem we're observing is that the webpage is only partially rendering in this background launch scenario (Seen after brought to FG). Any insights or assistance you can provide would be greatly appreciated.
2
0
176
3w
Custom TabBar height in a production app – is this allowed?
Hi, I'm working on a large application, and the designers have proposed a new look for the tab bar. The app has been in development for 14 years, and while many views are now in SwiftUI, navigation between screens is still handled in UIKit, since most screens are still UIKit-based. Currently, we're using the native UIKit TabBar. I'm going to check if it's possible to customize the appearance of the native TabBar. However, I remember that over 10 years ago, when I changed the height of the TabBar, the app was rejected during review for not complying with Apple's Human Interface Guidelines. It looked something like this: An app rejection related to a tab bar's height update in Swift, likely due to not adhering to Apple's Human Interface Guidelines, can be addressed by ensuring the tab bar's height remains at the default 49 points and avoiding any modifications that don't align with the HIG, according to Apple's documentation. How does it look nowadays? Has anyone here submitted an app to the store with a heavily customized TabBar height and had it approved? In UIKit, I see it's possible to do something like this: https://stackoverflow.com/questions/23044218/change-uitabbar-height Would something like this pass app review without issues? Do you know of any apps that have a non-standard, significantly increased TabBar height?
0
0
70
3w
tabBarMinimizeBehavior no longer working after upgrading to Xcode 16 beta 5 / iOS 18 beta 5
Hello! The minimize behavior was working correctly while I was using Xcode 26 beta 4 with iOS 26 beta 4 simulator — when scrolling down, the Tab Bar would minimize as expected. However, after upgrading both Xcode and iOS simulator to beta 5, the tabBarMinimizeBehavior setting no longer has any visible effect — the Tab Bar stays fixed in place. Code snippet: if #available(iOS 26.0, *) { self.tabBarMinimizeBehavior = .onScrollDown } Steps to reproduce: 1. Create a UITabBarController with at least one tab containing a scrollable view (e.g., UITableView). 2. In viewDidLoad, set tabBarMinimizeBehavior to .onScrollDown. 3. Run on iOS 26 beta 5 simulator. Expected behavior (beta 4): Scrolling down hides/minimizes the Tab Bar with animation. Actual behavior (beta 5): Tab Bar remains fixed; no minimize animation is triggered. Environment: • Xcode 26 beta 5 (Build: 17A5295f) • iOS 26 beta 5 simulator (Build: 1055) – iPhone 16 Pro • Also tested on iPhone 13 mini – iOS 26 (Build: 23A5308g)
3
1
156
4d
What is the scroll edge effect supposed to look like now?
At WWDC the scroll edge effect was presented as a variable blur combined with a soft gradient. Since beta 4 the bottom scroll edge effect has no blur, the top bar sometimes has, but sometimes does not. Even in my own app I have two views with totally different results. This was not changed back in beta 5, so I assume this is not a bug but an intended change. It's hard to design for such a moving target. Especially the missing bottom blur looks bad in a lot of places in my app and I'm debating not shipping the new design if this does not get resolved. Is there any guidance how this effect is supposed to look now? At this point it just seems random and there's no way adjust the way it looks. Phone: Top blur, bottom no blur Settings: Top blur, bottom no blur Notes: No blur at all Music: No blur at all My own app: No top blur My own app: Top blur
4
1
114
1w