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

Posts under UIKit tag

200 Posts

Post

Replies

Boosts

Views

Activity

Passing string between Swift and C++
I want to understand what the recommended way is for string interoperability between swift and c++. Below are the 3 ways to achieve it. Approach 2 is not allowed at work due to restrictions with using std libraries. Approach 1: In C++: char arr[] = "C++ String"; void * cppstring = arr; std::cout<<"before:"<<(char*)cppstring<<std::endl;           // C++ String // calling swift function and passing the void buffer to it, so that swift can update the buffer content Module1::SwiftClass:: ReceiveString (cppstring, length);   std::cout<<"after:"<<(char*)cppstring<<std::endl;             // SwiftStr      In Swift: func ReceiveString (pBuffer : UnsafeMutableRawPointer , pSize : UInt ) -> Void { // to convert cpp-str to swift-str: let swiftStr = String (cString: pBuffer.assumingMemoryBound(to: Int8.self)); print("pBuffer content: \(bufferAsString)"); // to modify cpp-str without converting: let swiftstr:String = "SwiftStr"      _ =  swiftstr.withCString { (cString: UnsafePointer<Int8>) in pBuffer.initializeMemory(as: Int8.self, from: cString, count: swiftstr.count+1) } }  Approach 2:  The ‘String’ type returned from a swift function is received as ‘swift::String’ type in cpp. This is implicitly casted to std::string type. The std::string has the method available to convert it to char *. void TWCppClass::StringConversion () {     // GetSwiftString() is a swift call that returns swift::String which can be received in std::string type     std::string stdstr = Module1::SwiftClass::GetSwiftString ();     char * cstr = stdstr.data ();     const char * conststr= stdstr.c_str (); }    Approach 3: The swift::String type that is obtained from a swift function can be received in char * by directly casting the address of the swift::String. We cannot directly receive a swift::String into a char *. void TWCppClass::StringConversion () {    // GetSwiftString() is a swift call that returns swift::String    swift::String swiftstr = Module1::SwiftClass::GetSwiftString ();    // obtaining the address of swift string and casting it into char *    char * cstr = (char*)&swiftstr; }
3
1
540
Jul ’25
4 or 5 Finger Gestures on iPadOS 26
I disable 4 or 5 Finger Gestures on Settings.app > Multi-tasking and Gestures. But in the third-party apps, 4-5 finger touches are sometimes immediately cancelled. Especially, 4-5 finger swipe gesture. I filed this issue to FB19226717. I develop Piano instrument app. 4 or 5 finger touches are required for that kind of apps. Please fix this, Apple.
0
0
162
Jul ’25
OS 26 with CNContactViewController issue
when using CNContactViewController to present a contact detail info, the system CNContactViewController appear some UI issues. On iOS 26, the Poster avatar overlaps with the title "Edit device contact" On iPadOS26 with device(not simulator), when click 'Add photo', the CNContactViewController will auto dismiss, and the console output some error log: below are the sample code: AppDelegate.swift: import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { let window: UIWindow = UIWindow() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let vc = SplitViewController(primary: TabBarViewController(), secondary: ViewController()) window.rootViewController = vc window.makeKeyAndVisible() return true } } SplitViewController.swift: import UIKit class SplitViewController: UISplitViewController { init(primary: UIViewController, secondary: UIViewController) { super.init(nibName: nil, bundle: nil) preferredDisplayMode = .oneBesideSecondary presentsWithGesture = false delegate = self viewControllers = [primary, secondary] } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() } } extension SplitViewController: UISplitViewControllerDelegate { } TabBarViewController.swift: import UIKit class BaseViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } } class HomeViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .red navigationItem.title = "Home" tabBarItem = UITabBarItem(title: "Home", image: UIImage(systemName: "house"), tag: 0) } } class TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() let homeVC = HomeViewController() let homeNav = UINavigationController(rootViewController: homeVC) viewControllers = [homeNav] ContactManager.shared.getAllContactIdentifiers() } } ViewController.swift: import UIKit import Contacts import ContactsUI class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemPink let button = UIButton(frame: .zero) button.backgroundColor = .orange button.setTitle("show contact", for: .normal) button.addTarget(self, action: #selector(showContactInfo), for: .touchUpInside) button.translatesAutoresizingMaskIntoConstraints = false view.addSubview(button) button.widthAnchor.constraint(equalToConstant: 200).isActive = true button.heightAnchor.constraint(equalToConstant: 60).isActive = true button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true } @objc private func showContactInfo() { print("showContactInfo") let identifier = ContactManager.shared.identifiers[0] let currentContact = try? CNContactStore().unifiedContact(withIdentifier: identifier, keysToFetch: [CNContactViewController.descriptorForRequiredKeys()]) guard let contact: CNMutableContact = currentContact?.mutableCopy() as? CNMutableContact else { return } let vc = CNContactViewController(forNewContact: contact) vc.delegate = self vc.title = "Edit Device Contact" vc.allowsActions = false vc.contactStore = CNContactStore() let navigationVC: UINavigationController = UINavigationController(rootViewController: vc) let appDelegate = UIApplication.shared.delegate as? AppDelegate appDelegate?.window.rootViewController?.present(navigationVC, animated: true, completion: nil) } } extension ViewController: CNContactViewControllerDelegate { public func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) { viewController.dismiss(animated: true, completion: nil) } }
1
0
296
Jul ’25
UIAlertAction.isEnabled = false Has No Visual Effect on iOS 26 (Action Still Looks Enabled)
Hi all, I'm running into a UIKit issue specific to iOS 26 (Xcode 26 Beta 4) where UIAlertAction buttons that are disabled using .isEnabled = false do not appear visually disabled. The alert still shows the action with full opacity and default styling, making it look like the button is tappable — even though it isn't. ❗ Issue: On iOS 26, disabled actions in UIAlertController no longer appear dimmed or inactive. This is a visual regression compared to iOS 18 and earlier, where disabled actions would automatically appear grayed out and visually distinct.
Topic: UI Frameworks SubTopic: UIKit Tags:
2
0
133
Jul ’25
Xcode 26 Beta Crash on iOS 18 and below – UIToolbar in XIB/Storyboard Causes
Hey everyone, Just wanted to share a critical issue we’ve encountered while testing our app on iOS 18 simulators and devices using Xcode 26 Beta 3: Crash Details We're seeing the following fatal exception during launch: NSInvalidUnarchiveOperationException Could not instantiate class named _TtGC5UIKit17UICoreHostingViewVCS_21ToolbarVisualProvider8RootView_ because no class named _TtGC5UIKit17UICoreHostingViewVCS_21ToolbarVisualProvider8RootView_ was found... The crash originates from Storyboards/XIBs that include a UIToolbar. It appears UIKit is referencing an internal SwiftUI-related class (UICoreHostingView), which isn't present at runtime — leading to immediate crashes. Affected: Apps using UIToolbar in Storyboards or XIBs Running on iOS 18 (Simulators or Devices) and below Built using Xcode 26 Beta 3 CrashLog: Fatal Exception: NSInvalidUnarchiveOperationException 0 CoreFoundation 0x11a21c __exceptionPreprocess 1 libobjc.A.dylib 0x31abc objc_exception_throw 2 CoreFoundation 0x178ea0 -[NSException initWithCoder:] 3 UIFoundation 0x28774 UINibDecoderDecodeObjectForValue 4 UIFoundation 0x28a18 UINibDecoderDecodeObjectForValue 5 UIFoundation 0x28cac -[UINibDecoder decodeObjectForKey:] 6 UIKitCore 0x21e680 -[UIView initWithCoder:] 7 UIKitCore 0x9b4784 -[UIToolbar initWithCoder:] 8 UIFoundation 0x28890 UINibDecoderDecodeObjectForValue 9 UIFoundation 0x28cac -[UINibDecoder decodeObjectForKey:] 10 UIKitCore 0x1e3a80 -[UIRuntimeConnection initWithCoder:] 11 UIFoundation 0x28890 UINibDecoderDecodeObjectForValue 12 UIFoundation 0x28a18 UINibDecoderDecodeObjectForValue 13 UIFoundation 0x28cac -[UINibDecoder decodeObjectForKey:] 14 UIKitCore 0x1e87dc -[NSCoder(UIIBDependencyInjectionInternal) _decodeObjectsWithSourceSegueTemplate:creator:sender:forKey:] 15 UIKitCore 0x1e2ea4 -[UINib instantiateWithOwner:options:] 16 UIKitCore 0x9f96c -[UIViewController loadView] 17 UIKitCore 0x75da8 -[UIViewController loadViewIfRequired] 18 UIKitCore 0x14430 -[UIViewController view] 19 UIKitCore 0x4237bc -[UINavigationController _preferredContentSizeForcingLoad:] 20 UIKitCore 0x116b15c -[_UISheetPresentationMetrics formSheetSizeForViewController:windowSize:screenSize:] 21 UIKitCore 0xb5c60c -[UIViewController _formSheetSizeForWindowWithSize:screenSize:] 22 UIKitCore 0x546ebc -[_UISheetLayoutInfo _preferredSize] 23 UIKitCore 0x18da60 -[_UISheetLayoutInfo _isEdgeAttached] 24 UIKitCore 0x19d428 -[_UISheetLayoutInfo _margins] 25 UIKitCore 0x19ce88 -[_UISheetLayoutInfo _stackAlignmentFrame] 26 UIKitCore 0x211018 -[_UISheetLayoutInfo _fullHeightUntransformedFrame] 27 UIKitCore 0x18f39c -[_UISheetLayoutInfo _untransformedFrame] 28 UIKitCore 0x188350 -[UISheetPresentationController _containerViewLayoutSubviews] 29 UIKitCore 0x18f1fc -[UITransitionView layoutSubviews] 30 UIKitCore 0x26070 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 31 QuartzCore 0x14c14 CA::Layer::layout_if_needed(CA::Transaction*) 32 UIKitCore 0x16b78 -[UIView(Hierarchy) layoutBelowIfNeeded] 33 UIKitCore 0x186f4c -[UISheetPresentationController presentationTransitionWillBegin] 34 UIKitCore 0x3187b4 -[_UIFormSheetPresentationController presentationTransitionWillBegin] 35 UIKitCore 0x185dd0 __80-[UIPresentationController _initViewHierarchyForPresentationSuperview:inWindow:]_block_invoke 36 UIKitCore 0x1874f8 __77-[UIPresentationController runTransitionForCurrentStateAnimated:handoffData:]_block_invoke_3 37 UIKitCore 0x8584c -[_UIAfterCACommitBlock run] 38 UIKitCore 0x85784 -[_UIAfterCACommitQueue flush] 39 UIKitCore 0xa254 _runAfterCACommitDeferredBlocks 40 UIKitCore 0x9f74 _cleanUpAfterCAFlushAndRunDeferredBlocks 41 UIKitCore 0x9e84 _UIApplicationFlushCATransaction 42 UIKitCore 0x9e0c __setupUpdateSequence_block_invoke_2 43 UIKitCore 0x9404 _UIUpdateSequenceRun 44 UIKitCore 0x8ab4 schedulerStepScheduledMainSection 45 UIKitCore 0x41e4 runloopSourceCallback 46 CoreFoundation 0xfa8c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 47 CoreFoundation 0xf8a4 __CFRunLoopDoSource0 48 CoreFoundation 0xf700 __CFRunLoopDoSources0 49 CoreFoundation 0x10080 __CFRunLoopRun 50 CoreFoundation 0x11c3c CFRunLoopRunSpecific 51 GraphicsServices 0x1454 GSEventRunModal 52 UIKitCore 0x135274 -[UIApplication _run] 53 UIKitCore 0x100a28 UIApplicationMain 54 Saleslink DEV 0x1f9ea8 main + 17 (AppDelegate.swift:17) 55 ??? 0x1af61bf08 (Missing) Would love to know if anyone else has encountered this, or if there’s an official radar or feedback ID we can follow. Hoping this gets resolved before the GM release of Xcode 26. Thanks!
2
1
362
Jul ’25
How to access clear Liquid Glass Effect?
On WWDC25 session "Meet Liquid Glass", two Liquid Glass variants are mentioned: "regular" and "clear". "Regular" seems to be the default setting for UIGlassEffect, but I was not able to find an option for clear. Is there a native element that uses clear? Is it coming to later betas for iOS 26?
8
11
650
Jul ’25
Why my font size is not scaling dynamically
Hello everyone, I am having an issue where the attributed text that I have in my UITextView is not scaling dynamically with phone text size, whenever I remove the attributed text logic, it scales fine, however, with it, it stays at a set font size. struct AutoDetectedClickableDataView: UIViewRepresentable { let text: String @Binding var height: CGFloat func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.dataDetectorTypes = [.phoneNumber, .address, .link] textView.isEditable = false textView.isScrollEnabled = false textView.backgroundColor = .clear textView.font = UIFont.preferredFont(forTextStyle: .body) /*UIFontMetrics(forTextStyle: .body).scaledFont(for: UIFont.systemFont(ofSize: 16.0)) */ textView.adjustsFontForContentSizeCategory = true textView.textContainer.lineBreakMode = .byWordWrapping textView.textContainerInset = .zero textView.textContainer.lineFragmentPadding = 0 textView.translatesAutoresizingMaskIntoConstraints = false textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) textView.setContentHuggingPriority(.defaultHigh, for: .horizontal) return textView } func updateUIView(_ uiView: UITextView, context: Context) { let attributed = NSMutableAttributedString(string: text, attributes: [ .font: UIFont.preferredFont(forTextStyle: .body) ]) let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.address.rawValue | NSTextCheckingResult.CheckingType.link.rawValue | NSTextCheckingResult.CheckingType.phoneNumber.rawValue) detector?.enumerateMatches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count)) { match, _, _ in guard let match = match else { return } attributed.addAttributes([ .foregroundColor: UIColor.systemBlue, .underlineStyle: NSUnderlineStyle.single.rawValue, ], range: match.range) } uiView.attributedText = attributed // uiView.text = text DispatchQueue.main.async { uiView.layoutIfNeeded() let fittingSize = CGSize(width: uiView.bounds.width, height: .greatestFiniteMagnitude) let size = uiView.sizeThatFits(fittingSize) height = size.height } } }
1
0
428
Jul ’25
Section Header Overlaps with Cell Text in Plain List Style on iOS 26
Hi everyone, I've noticed that on iOS 26 beta 1 through beta 4, when using a List with the .plain style, the section header overlaps with the cell content below it, as there is no background for the header. This creates a poor visual experience. Additionally, when using NavigationSplitView on iPad, the second column's list always shows this issue. Is this an intentional design change, or just a temporary issue? I haven't found a good workaround so far. Thanks! FB19066489
0
1
605
Jul ’25
Navigation Bar shows top gap in landscape on iOS 26 beta when background color is set
Hi, I'm seeing an issue in iOS 26 beta related to UINavigationBar rendering in landscape. When a background color is set for the navigation bar and the device is rotated to landscape, an unexpected gap appears above the navigation bar. This also happens in the official sample project provided in Apple’s documentation: https://developer.apple.com/documentation/uikit/customizing-your-app-s-navigation-bar Is this a bug in the beta, or is there a workaround to avoid this behavior? Thanks in advance!
Topic: UI Frameworks SubTopic: UIKit Tags:
5
4
428
Jul ’25
Positioning an image
This may seem really basic, but I'm not using the screen designer, I'm doing this old school (programmatically). I think I'm using Swift 5 (not actually sure). This image may help. So I created my own UIImageView class called GenericImage class GenericImage: UIImageView, @unchecked Sendable { ... } I create the GenericImage class and add it to the View Controller. Then I load the image and set some positioning within my GenericImage class let imageView = GenericImage(frame: CGRect.zero) self.view.addSubview(imageView) imageView.processResponse(componentDictionary ) In the GenericImage class I load the image and set some constraints. self.imageFromURL(urlString: imageUrl) self.translatesAutoresizingMaskIntoConstraints = false self.contentMode = .scaleAspectFit self.widthAnchor.constraint(equalToConstant: 100.0).isActive = true self.heightAnchor.constraint(equalToConstant: 100.0).isActive = true self.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true self.topAnchor.constraint(equalTo: self.centerYAnchor).isActive = true The image is displayed at the top left of the screen. I'm guessing that the code I have written should center the image on the screen. However, while I would like to know how to center the image, I also want to be able to position it at a specific place on the screen, using points (or pixels). Any suggestions?
3
0
168
Jul ’25
Right bar button items in iOS 26 visual presentation
I have attached two images of two screens below. In one screen, bar button are enclosed within separate, distinct, rounded-rectangle 'liquid glass' capsules. In other screen, bar buttons are enclosed within separate, distinct, rounded-rectangle "liquid glass" capsules. They are not visually merged into one larger capsule. Both are having same code. But why it is not same ?
1
0
152
Jul ’25
Getting two searchBar in iOS 26.0
Hi team, while i am using below code, i am getting two searchBar at top & bottom. Kindly refer below code & attached image Code: override func viewDidLoad() { super.viewDidLoad() title = "Test Data" setupSearchData() DispatchQueue.main.asyncAfter(deadline: .now() + 2) { self.setupSearchData() } } func setupSearchData() { navigationController?.navigationBar.prefersLargeTitles = false let searchController = UISearchController(searchResultsController: nil) navigationItem.searchController = searchController } It is working fine for other iOS versions. In my real useCase, i will refresh screen after API completed, then this issue occurred in my app.
2
0
140
Jul ’25
iOS 26 Beta 3, UIGlassEffect corner radius
In beta 2 using layer.cornerRadius on a UIEffectView with the UIGlassEffect allowed you to change the corner radius of the view. In beta 3, this no longer works. WWDC videos indicate the right way to do this is to set the cornerConfiguration on the UIEffectView, but that API doesn't seem to be available yet. At this time it doesn't seem like theres a way to have a glass view that isn't pill shaped.
Topic: UI Frameworks SubTopic: UIKit Tags:
9
6
640
Jul ’25
Liquid glass: UIPageViewController inside UITabbarController adding blur effect always in iOS26
When using UIPageViewController inside a UITabBarController on iOS 26 with Liquid Glass adoption, visiting the PageViewController tab applies a blur effect to the navigation bar and tab bar even though the current child view controller of the pageView is not scrollable and does not reach behind these bars. Questions: Is this the expected behavior that the pageview's internal scroll view causes the bars to blur regardless of the page view's child content’s scrollability? If so, is there an official way to make the blur effect appear only when the pageview's current child view controller actually scrolls behind the navigation bar or tab bar, and not in static cases? Tried the same in SwiftUI using TabView and TabView with page style. Facing the same issue there as well. Sample screenshots for reference, Sample SwiftUI code, struct TabContentView: View { var body: some View { TabView { // First Tab: Paging View PagingView() .tabItem { Label("Pages", systemImage: "square.fill.on.square.fill") } // Second Tab: Normal View NavigationStack { ListView() } .tabItem { Label("Second", systemImage: "star.fill") } // Third Tab: Normal View PageView(color: .blue, text: "Page 3") .tabItem { Label("Third", systemImage: "gearshape.fill") } } .ignoresSafeArea() } } struct PagingView: View { var body: some View { TabView { PageView(color: .red, text: "Page 1") PageView(color: .green, text: "Page 2") PageView(color: .blue, text: "Page 3") } .tabViewStyle(.page) // Enables swipe paging .indexViewStyle(.page(backgroundDisplayMode: .always)) .ignoresSafeArea()// Dots indicator } }
1
0
252
Jul ’25
Best Option for Programmatically Scrolling Long Dynamic Text
Hello! I am trying to create an iOS app that is based around a very large, vertically scrolling text view. The text is broken up into many sections, and the user should be able to press buttons in the navigation, which programmatically scroll to those sections. The user can also change the font size in a settings menu. It should generally keep the user's spot when resizing fonts or rotating the screen (from portrait to landscape). The problem I've been having is that no method of lazy text loading allows accurate enough navigation, and the text is too long to calculate the whole UI all at once. Here's my process in trying to find a solution: My app is built in SwiftUI, so I started with a ScrollView and a LazyVStack, and I used .scrollPosition() and bound it to an Int?. It worked pretty well for most scroll locations both on screen and far off the screen, but when I programmatically scroll to a location that is off the screen but not very far off, it completely misses. So, I investigated UIKit, and found that UITextView was a much better fit for the way I wanted to present the long text. I could also programmatically navigate by storing the NSRange of each section. I tried to use scrollRangeToVisible(), but for long distance it would scroll so that the desired section was just below the viewport and thus off screen. Then I tried to use UITextView's textLayoutManager.textViewportLayoutController.relocateViewport() to send it to the correct NSTextRange, it would not jump all the way, but instead would do nothing until I tried to scroll again and it would jump slightly forward. I tried to use textViewportLayoutController.layoutViewport() after the jump, and that fixed the glitch when scrolling, but it still did not jump to the correct place, only slightly forward. Then, I looked into TextKit 2 and the way it worked to try to find a solution. From what I can tell, it seems that to affect the NSTextViewportLayoutController without having to rewrite it, I need an NSTextViewportLayoutControllerDelegate, but the delegate required me to manually lay out the views, and in all the examples I've seen that use a custom NSTextViewportLayoutControllerDelegate, they wrote their own custom text view instead of using the default UITextView. I started looking into writing a custom text view so I can get the programmatic scroll to work consistently. However, it felt like, from a maintainability standpoint, it would probably be best to stick with what Apple has already implemented. For now, I found a workaround that scrolls consistently. Here is the code: if let start = self.textView.position(from: self.textView.beginningOfDocument, offset: desiredLineRange.location) { let location = textView.caretRect(for: start) self.textView.setContentOffset(CGPoint(x: 0, y: location.origin.y), animated: false) } if let start = self.textView.position(from: self.textView.beginningOfDocument, offset: desiredLineRange.location) { let location = textView.caretRect(for: start) self.textView.setContentOffset(CGPoint(x: 0, y: location.origin.y), animated: false) } It does the job, because the first time it gets close enough, and the second time it gets to the precise location, but it just feels like a bit of a hack to run the same code twice. I was wondering if anyone knows what I could be doing wrong and if Apple provides any solutions for this? (Also, all my UIKit navigation attempts ran inside an @objc func, which I passed using button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside). Just so you know in case it may be a problem with the way Swift and UIKit handle concurrency/parallel tasks). Thank you!
0
0
255
Jul ’25
iOS 26 Floating Search Tab in UIKit
Does anyone have any documentation for how to achieve the floating search tab item in UIKit apps that use UITabBarController? The Liquid Glass UIKit video had code for minimizing the tab bar on scroll down, but I didn't see anything on keeping the search button locked to the bottom trailing edge (as in this screenshot below).
4
0
346
Jul ’25
iPadOS 26 TabBar text color can't be changed
Hello, I have been trying for some time to change the color of native UITabBar in UITabBarController through UITabBarAppearance, but nothing works and the text is still black in the Xcode Beta 3 on iPadOS 26 while it works correctly in the previous OS versions. Here is the code: let color = UIColor.white let stackedAppearance = UITabBarItemAppearance() stackedAppearance.normal.iconColor = color stackedAppearance.normal.titleTextAttributes = [ .foregroundColor: color ] stackedAppearance.selected.iconColor = color stackedAppearance.selected.titleTextAttributes = [ .foregroundColor: color ] let inlineAppearance = UITabBarItemAppearance() inlineAppearance.normal.iconColor = color inlineAppearance.normal.titleTextAttributes = [ .foregroundColor: color ] inlineAppearance.selected.iconColor = color inlineAppearance.selected.titleTextAttributes = [ .foregroundColor: color ] let tabAppearance = UITabBarAppearance() tabAppearance.compactInlineLayoutAppearance = inlineAppearance tabAppearance.inlineLayoutAppearance = inlineAppearance tabAppearance.stackedLayoutAppearance = stackedAppearance UITabBar.appearance().standardAppearance = tabAppearance UITabBar.appearance().scrollEdgeAppearance = tabAppearance
0
5
486
Jul ’25
Why does converting HEIC/HEIF to JPEG using UIImage.jpegData(compressionQuality: 1.0) significantly increase file size?
I'm working with images selected from the iOS Photos app using PHPickerViewController. Some images appear as HEIF in the Photos info panel — which I understand are stored in the HEIC format, i.e., HEIF containers with HEVC-compressed images, commonly used on iOS when "High Efficiency" is enabled. To convert these images to JPEG, I'm using the standard UIKit approach: if let image = UIImage(data: heicData) { let jpegData = image.jpegData(compressionQuality: 1.0) } However, I’ve noticed that this conversion often increases the image size significantly: Original HEIC/HEIF: ~3 MB Converted JPEG (quality: 1.0): ~8–12 MB There’s no resolution change or image editing — it’s just a direct conversion. I understand that HEIC is more efficient than JPEG, but the increase in file size feels disproportionate. Is this kind of jump expected, or are there any recommended workarounds to avoid it?
1
0
301
Jul ’25
Who vends the item identifier and the index path arguments to the cell provider closure of a diffable data source?
I was reading over the documentation of the CellProvider struct for the diffable data source initialiser, and the CellProvider is defined as a closure which takes three arguments, a table view, an index path, and an item identifier. My question is, who vends the index path and the item identifier to this closure? My thinking is that it is the data source who vends these items because it adopts the UITableViewDataSource protocol which acts as the source of data for this view.
Topic: UI Frameworks SubTopic: UIKit Tags:
0
0
266
Jul ’25
Passing string between Swift and C++
I want to understand what the recommended way is for string interoperability between swift and c++. Below are the 3 ways to achieve it. Approach 2 is not allowed at work due to restrictions with using std libraries. Approach 1: In C++: char arr[] = "C++ String"; void * cppstring = arr; std::cout<<"before:"<<(char*)cppstring<<std::endl;           // C++ String // calling swift function and passing the void buffer to it, so that swift can update the buffer content Module1::SwiftClass:: ReceiveString (cppstring, length);   std::cout<<"after:"<<(char*)cppstring<<std::endl;             // SwiftStr      In Swift: func ReceiveString (pBuffer : UnsafeMutableRawPointer , pSize : UInt ) -> Void { // to convert cpp-str to swift-str: let swiftStr = String (cString: pBuffer.assumingMemoryBound(to: Int8.self)); print("pBuffer content: \(bufferAsString)"); // to modify cpp-str without converting: let swiftstr:String = "SwiftStr"      _ =  swiftstr.withCString { (cString: UnsafePointer<Int8>) in pBuffer.initializeMemory(as: Int8.self, from: cString, count: swiftstr.count+1) } }  Approach 2:  The ‘String’ type returned from a swift function is received as ‘swift::String’ type in cpp. This is implicitly casted to std::string type. The std::string has the method available to convert it to char *. void TWCppClass::StringConversion () {     // GetSwiftString() is a swift call that returns swift::String which can be received in std::string type     std::string stdstr = Module1::SwiftClass::GetSwiftString ();     char * cstr = stdstr.data ();     const char * conststr= stdstr.c_str (); }    Approach 3: The swift::String type that is obtained from a swift function can be received in char * by directly casting the address of the swift::String. We cannot directly receive a swift::String into a char *. void TWCppClass::StringConversion () {    // GetSwiftString() is a swift call that returns swift::String    swift::String swiftstr = Module1::SwiftClass::GetSwiftString ();    // obtaining the address of swift string and casting it into char *    char * cstr = (char*)&swiftstr; }
Replies
3
Boosts
1
Views
540
Activity
Jul ’25
4 or 5 Finger Gestures on iPadOS 26
I disable 4 or 5 Finger Gestures on Settings.app > Multi-tasking and Gestures. But in the third-party apps, 4-5 finger touches are sometimes immediately cancelled. Especially, 4-5 finger swipe gesture. I filed this issue to FB19226717. I develop Piano instrument app. 4 or 5 finger touches are required for that kind of apps. Please fix this, Apple.
Replies
0
Boosts
0
Views
162
Activity
Jul ’25
OS 26 with CNContactViewController issue
when using CNContactViewController to present a contact detail info, the system CNContactViewController appear some UI issues. On iOS 26, the Poster avatar overlaps with the title "Edit device contact" On iPadOS26 with device(not simulator), when click 'Add photo', the CNContactViewController will auto dismiss, and the console output some error log: below are the sample code: AppDelegate.swift: import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { let window: UIWindow = UIWindow() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { let vc = SplitViewController(primary: TabBarViewController(), secondary: ViewController()) window.rootViewController = vc window.makeKeyAndVisible() return true } } SplitViewController.swift: import UIKit class SplitViewController: UISplitViewController { init(primary: UIViewController, secondary: UIViewController) { super.init(nibName: nil, bundle: nil) preferredDisplayMode = .oneBesideSecondary presentsWithGesture = false delegate = self viewControllers = [primary, secondary] } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() } } extension SplitViewController: UISplitViewControllerDelegate { } TabBarViewController.swift: import UIKit class BaseViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } } class HomeViewController: BaseViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .red navigationItem.title = "Home" tabBarItem = UITabBarItem(title: "Home", image: UIImage(systemName: "house"), tag: 0) } } class TabBarViewController: UITabBarController { override func viewDidLoad() { super.viewDidLoad() let homeVC = HomeViewController() let homeNav = UINavigationController(rootViewController: homeVC) viewControllers = [homeNav] ContactManager.shared.getAllContactIdentifiers() } } ViewController.swift: import UIKit import Contacts import ContactsUI class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemPink let button = UIButton(frame: .zero) button.backgroundColor = .orange button.setTitle("show contact", for: .normal) button.addTarget(self, action: #selector(showContactInfo), for: .touchUpInside) button.translatesAutoresizingMaskIntoConstraints = false view.addSubview(button) button.widthAnchor.constraint(equalToConstant: 200).isActive = true button.heightAnchor.constraint(equalToConstant: 60).isActive = true button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true } @objc private func showContactInfo() { print("showContactInfo") let identifier = ContactManager.shared.identifiers[0] let currentContact = try? CNContactStore().unifiedContact(withIdentifier: identifier, keysToFetch: [CNContactViewController.descriptorForRequiredKeys()]) guard let contact: CNMutableContact = currentContact?.mutableCopy() as? CNMutableContact else { return } let vc = CNContactViewController(forNewContact: contact) vc.delegate = self vc.title = "Edit Device Contact" vc.allowsActions = false vc.contactStore = CNContactStore() let navigationVC: UINavigationController = UINavigationController(rootViewController: vc) let appDelegate = UIApplication.shared.delegate as? AppDelegate appDelegate?.window.rootViewController?.present(navigationVC, animated: true, completion: nil) } } extension ViewController: CNContactViewControllerDelegate { public func contactViewController(_ viewController: CNContactViewController, didCompleteWith contact: CNContact?) { viewController.dismiss(animated: true, completion: nil) } }
Replies
1
Boosts
0
Views
296
Activity
Jul ’25
UIAlertAction.isEnabled = false Has No Visual Effect on iOS 26 (Action Still Looks Enabled)
Hi all, I'm running into a UIKit issue specific to iOS 26 (Xcode 26 Beta 4) where UIAlertAction buttons that are disabled using .isEnabled = false do not appear visually disabled. The alert still shows the action with full opacity and default styling, making it look like the button is tappable — even though it isn't. ❗ Issue: On iOS 26, disabled actions in UIAlertController no longer appear dimmed or inactive. This is a visual regression compared to iOS 18 and earlier, where disabled actions would automatically appear grayed out and visually distinct.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
2
Boosts
0
Views
133
Activity
Jul ’25
Xcode 26 Beta Crash on iOS 18 and below – UIToolbar in XIB/Storyboard Causes
Hey everyone, Just wanted to share a critical issue we’ve encountered while testing our app on iOS 18 simulators and devices using Xcode 26 Beta 3: Crash Details We're seeing the following fatal exception during launch: NSInvalidUnarchiveOperationException Could not instantiate class named _TtGC5UIKit17UICoreHostingViewVCS_21ToolbarVisualProvider8RootView_ because no class named _TtGC5UIKit17UICoreHostingViewVCS_21ToolbarVisualProvider8RootView_ was found... The crash originates from Storyboards/XIBs that include a UIToolbar. It appears UIKit is referencing an internal SwiftUI-related class (UICoreHostingView), which isn't present at runtime — leading to immediate crashes. Affected: Apps using UIToolbar in Storyboards or XIBs Running on iOS 18 (Simulators or Devices) and below Built using Xcode 26 Beta 3 CrashLog: Fatal Exception: NSInvalidUnarchiveOperationException 0 CoreFoundation 0x11a21c __exceptionPreprocess 1 libobjc.A.dylib 0x31abc objc_exception_throw 2 CoreFoundation 0x178ea0 -[NSException initWithCoder:] 3 UIFoundation 0x28774 UINibDecoderDecodeObjectForValue 4 UIFoundation 0x28a18 UINibDecoderDecodeObjectForValue 5 UIFoundation 0x28cac -[UINibDecoder decodeObjectForKey:] 6 UIKitCore 0x21e680 -[UIView initWithCoder:] 7 UIKitCore 0x9b4784 -[UIToolbar initWithCoder:] 8 UIFoundation 0x28890 UINibDecoderDecodeObjectForValue 9 UIFoundation 0x28cac -[UINibDecoder decodeObjectForKey:] 10 UIKitCore 0x1e3a80 -[UIRuntimeConnection initWithCoder:] 11 UIFoundation 0x28890 UINibDecoderDecodeObjectForValue 12 UIFoundation 0x28a18 UINibDecoderDecodeObjectForValue 13 UIFoundation 0x28cac -[UINibDecoder decodeObjectForKey:] 14 UIKitCore 0x1e87dc -[NSCoder(UIIBDependencyInjectionInternal) _decodeObjectsWithSourceSegueTemplate:creator:sender:forKey:] 15 UIKitCore 0x1e2ea4 -[UINib instantiateWithOwner:options:] 16 UIKitCore 0x9f96c -[UIViewController loadView] 17 UIKitCore 0x75da8 -[UIViewController loadViewIfRequired] 18 UIKitCore 0x14430 -[UIViewController view] 19 UIKitCore 0x4237bc -[UINavigationController _preferredContentSizeForcingLoad:] 20 UIKitCore 0x116b15c -[_UISheetPresentationMetrics formSheetSizeForViewController:windowSize:screenSize:] 21 UIKitCore 0xb5c60c -[UIViewController _formSheetSizeForWindowWithSize:screenSize:] 22 UIKitCore 0x546ebc -[_UISheetLayoutInfo _preferredSize] 23 UIKitCore 0x18da60 -[_UISheetLayoutInfo _isEdgeAttached] 24 UIKitCore 0x19d428 -[_UISheetLayoutInfo _margins] 25 UIKitCore 0x19ce88 -[_UISheetLayoutInfo _stackAlignmentFrame] 26 UIKitCore 0x211018 -[_UISheetLayoutInfo _fullHeightUntransformedFrame] 27 UIKitCore 0x18f39c -[_UISheetLayoutInfo _untransformedFrame] 28 UIKitCore 0x188350 -[UISheetPresentationController _containerViewLayoutSubviews] 29 UIKitCore 0x18f1fc -[UITransitionView layoutSubviews] 30 UIKitCore 0x26070 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 31 QuartzCore 0x14c14 CA::Layer::layout_if_needed(CA::Transaction*) 32 UIKitCore 0x16b78 -[UIView(Hierarchy) layoutBelowIfNeeded] 33 UIKitCore 0x186f4c -[UISheetPresentationController presentationTransitionWillBegin] 34 UIKitCore 0x3187b4 -[_UIFormSheetPresentationController presentationTransitionWillBegin] 35 UIKitCore 0x185dd0 __80-[UIPresentationController _initViewHierarchyForPresentationSuperview:inWindow:]_block_invoke 36 UIKitCore 0x1874f8 __77-[UIPresentationController runTransitionForCurrentStateAnimated:handoffData:]_block_invoke_3 37 UIKitCore 0x8584c -[_UIAfterCACommitBlock run] 38 UIKitCore 0x85784 -[_UIAfterCACommitQueue flush] 39 UIKitCore 0xa254 _runAfterCACommitDeferredBlocks 40 UIKitCore 0x9f74 _cleanUpAfterCAFlushAndRunDeferredBlocks 41 UIKitCore 0x9e84 _UIApplicationFlushCATransaction 42 UIKitCore 0x9e0c __setupUpdateSequence_block_invoke_2 43 UIKitCore 0x9404 _UIUpdateSequenceRun 44 UIKitCore 0x8ab4 schedulerStepScheduledMainSection 45 UIKitCore 0x41e4 runloopSourceCallback 46 CoreFoundation 0xfa8c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 47 CoreFoundation 0xf8a4 __CFRunLoopDoSource0 48 CoreFoundation 0xf700 __CFRunLoopDoSources0 49 CoreFoundation 0x10080 __CFRunLoopRun 50 CoreFoundation 0x11c3c CFRunLoopRunSpecific 51 GraphicsServices 0x1454 GSEventRunModal 52 UIKitCore 0x135274 -[UIApplication _run] 53 UIKitCore 0x100a28 UIApplicationMain 54 Saleslink DEV 0x1f9ea8 main + 17 (AppDelegate.swift:17) 55 ??? 0x1af61bf08 (Missing) Would love to know if anyone else has encountered this, or if there’s an official radar or feedback ID we can follow. Hoping this gets resolved before the GM release of Xcode 26. Thanks!
Replies
2
Boosts
1
Views
362
Activity
Jul ’25
How to access clear Liquid Glass Effect?
On WWDC25 session "Meet Liquid Glass", two Liquid Glass variants are mentioned: "regular" and "clear". "Regular" seems to be the default setting for UIGlassEffect, but I was not able to find an option for clear. Is there a native element that uses clear? Is it coming to later betas for iOS 26?
Replies
8
Boosts
11
Views
650
Activity
Jul ’25
Why my font size is not scaling dynamically
Hello everyone, I am having an issue where the attributed text that I have in my UITextView is not scaling dynamically with phone text size, whenever I remove the attributed text logic, it scales fine, however, with it, it stays at a set font size. struct AutoDetectedClickableDataView: UIViewRepresentable { let text: String @Binding var height: CGFloat func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.dataDetectorTypes = [.phoneNumber, .address, .link] textView.isEditable = false textView.isScrollEnabled = false textView.backgroundColor = .clear textView.font = UIFont.preferredFont(forTextStyle: .body) /*UIFontMetrics(forTextStyle: .body).scaledFont(for: UIFont.systemFont(ofSize: 16.0)) */ textView.adjustsFontForContentSizeCategory = true textView.textContainer.lineBreakMode = .byWordWrapping textView.textContainerInset = .zero textView.textContainer.lineFragmentPadding = 0 textView.translatesAutoresizingMaskIntoConstraints = false textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) textView.setContentHuggingPriority(.defaultHigh, for: .horizontal) return textView } func updateUIView(_ uiView: UITextView, context: Context) { let attributed = NSMutableAttributedString(string: text, attributes: [ .font: UIFont.preferredFont(forTextStyle: .body) ]) let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.address.rawValue | NSTextCheckingResult.CheckingType.link.rawValue | NSTextCheckingResult.CheckingType.phoneNumber.rawValue) detector?.enumerateMatches(in: text, options: [], range: NSRange(location: 0, length: text.utf16.count)) { match, _, _ in guard let match = match else { return } attributed.addAttributes([ .foregroundColor: UIColor.systemBlue, .underlineStyle: NSUnderlineStyle.single.rawValue, ], range: match.range) } uiView.attributedText = attributed // uiView.text = text DispatchQueue.main.async { uiView.layoutIfNeeded() let fittingSize = CGSize(width: uiView.bounds.width, height: .greatestFiniteMagnitude) let size = uiView.sizeThatFits(fittingSize) height = size.height } } }
Replies
1
Boosts
0
Views
428
Activity
Jul ’25
Section Header Overlaps with Cell Text in Plain List Style on iOS 26
Hi everyone, I've noticed that on iOS 26 beta 1 through beta 4, when using a List with the .plain style, the section header overlaps with the cell content below it, as there is no background for the header. This creates a poor visual experience. Additionally, when using NavigationSplitView on iPad, the second column's list always shows this issue. Is this an intentional design change, or just a temporary issue? I haven't found a good workaround so far. Thanks! FB19066489
Replies
0
Boosts
1
Views
605
Activity
Jul ’25
UIDatePicker unusable on iOS 26
Fellow iOS developers, can you tell me how to make UIDatePicker usable on iOS 26?
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
3
Boosts
2
Views
248
Activity
Jul ’25
Navigation Bar shows top gap in landscape on iOS 26 beta when background color is set
Hi, I'm seeing an issue in iOS 26 beta related to UINavigationBar rendering in landscape. When a background color is set for the navigation bar and the device is rotated to landscape, an unexpected gap appears above the navigation bar. This also happens in the official sample project provided in Apple’s documentation: https://developer.apple.com/documentation/uikit/customizing-your-app-s-navigation-bar Is this a bug in the beta, or is there a workaround to avoid this behavior? Thanks in advance!
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
5
Boosts
4
Views
428
Activity
Jul ’25
Positioning an image
This may seem really basic, but I'm not using the screen designer, I'm doing this old school (programmatically). I think I'm using Swift 5 (not actually sure). This image may help. So I created my own UIImageView class called GenericImage class GenericImage: UIImageView, @unchecked Sendable { ... } I create the GenericImage class and add it to the View Controller. Then I load the image and set some positioning within my GenericImage class let imageView = GenericImage(frame: CGRect.zero) self.view.addSubview(imageView) imageView.processResponse(componentDictionary ) In the GenericImage class I load the image and set some constraints. self.imageFromURL(urlString: imageUrl) self.translatesAutoresizingMaskIntoConstraints = false self.contentMode = .scaleAspectFit self.widthAnchor.constraint(equalToConstant: 100.0).isActive = true self.heightAnchor.constraint(equalToConstant: 100.0).isActive = true self.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true self.topAnchor.constraint(equalTo: self.centerYAnchor).isActive = true The image is displayed at the top left of the screen. I'm guessing that the code I have written should center the image on the screen. However, while I would like to know how to center the image, I also want to be able to position it at a specific place on the screen, using points (or pixels). Any suggestions?
Replies
3
Boosts
0
Views
168
Activity
Jul ’25
Right bar button items in iOS 26 visual presentation
I have attached two images of two screens below. In one screen, bar button are enclosed within separate, distinct, rounded-rectangle 'liquid glass' capsules. In other screen, bar buttons are enclosed within separate, distinct, rounded-rectangle "liquid glass" capsules. They are not visually merged into one larger capsule. Both are having same code. But why it is not same ?
Replies
1
Boosts
0
Views
152
Activity
Jul ’25
Getting two searchBar in iOS 26.0
Hi team, while i am using below code, i am getting two searchBar at top & bottom. Kindly refer below code & attached image Code: override func viewDidLoad() { super.viewDidLoad() title = "Test Data" setupSearchData() DispatchQueue.main.asyncAfter(deadline: .now() + 2) { self.setupSearchData() } } func setupSearchData() { navigationController?.navigationBar.prefersLargeTitles = false let searchController = UISearchController(searchResultsController: nil) navigationItem.searchController = searchController } It is working fine for other iOS versions. In my real useCase, i will refresh screen after API completed, then this issue occurred in my app.
Replies
2
Boosts
0
Views
140
Activity
Jul ’25
iOS 26 Beta 3, UIGlassEffect corner radius
In beta 2 using layer.cornerRadius on a UIEffectView with the UIGlassEffect allowed you to change the corner radius of the view. In beta 3, this no longer works. WWDC videos indicate the right way to do this is to set the cornerConfiguration on the UIEffectView, but that API doesn't seem to be available yet. At this time it doesn't seem like theres a way to have a glass view that isn't pill shaped.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
9
Boosts
6
Views
640
Activity
Jul ’25
Liquid glass: UIPageViewController inside UITabbarController adding blur effect always in iOS26
When using UIPageViewController inside a UITabBarController on iOS 26 with Liquid Glass adoption, visiting the PageViewController tab applies a blur effect to the navigation bar and tab bar even though the current child view controller of the pageView is not scrollable and does not reach behind these bars. Questions: Is this the expected behavior that the pageview's internal scroll view causes the bars to blur regardless of the page view's child content’s scrollability? If so, is there an official way to make the blur effect appear only when the pageview's current child view controller actually scrolls behind the navigation bar or tab bar, and not in static cases? Tried the same in SwiftUI using TabView and TabView with page style. Facing the same issue there as well. Sample screenshots for reference, Sample SwiftUI code, struct TabContentView: View { var body: some View { TabView { // First Tab: Paging View PagingView() .tabItem { Label("Pages", systemImage: "square.fill.on.square.fill") } // Second Tab: Normal View NavigationStack { ListView() } .tabItem { Label("Second", systemImage: "star.fill") } // Third Tab: Normal View PageView(color: .blue, text: "Page 3") .tabItem { Label("Third", systemImage: "gearshape.fill") } } .ignoresSafeArea() } } struct PagingView: View { var body: some View { TabView { PageView(color: .red, text: "Page 1") PageView(color: .green, text: "Page 2") PageView(color: .blue, text: "Page 3") } .tabViewStyle(.page) // Enables swipe paging .indexViewStyle(.page(backgroundDisplayMode: .always)) .ignoresSafeArea()// Dots indicator } }
Replies
1
Boosts
0
Views
252
Activity
Jul ’25
Best Option for Programmatically Scrolling Long Dynamic Text
Hello! I am trying to create an iOS app that is based around a very large, vertically scrolling text view. The text is broken up into many sections, and the user should be able to press buttons in the navigation, which programmatically scroll to those sections. The user can also change the font size in a settings menu. It should generally keep the user's spot when resizing fonts or rotating the screen (from portrait to landscape). The problem I've been having is that no method of lazy text loading allows accurate enough navigation, and the text is too long to calculate the whole UI all at once. Here's my process in trying to find a solution: My app is built in SwiftUI, so I started with a ScrollView and a LazyVStack, and I used .scrollPosition() and bound it to an Int?. It worked pretty well for most scroll locations both on screen and far off the screen, but when I programmatically scroll to a location that is off the screen but not very far off, it completely misses. So, I investigated UIKit, and found that UITextView was a much better fit for the way I wanted to present the long text. I could also programmatically navigate by storing the NSRange of each section. I tried to use scrollRangeToVisible(), but for long distance it would scroll so that the desired section was just below the viewport and thus off screen. Then I tried to use UITextView's textLayoutManager.textViewportLayoutController.relocateViewport() to send it to the correct NSTextRange, it would not jump all the way, but instead would do nothing until I tried to scroll again and it would jump slightly forward. I tried to use textViewportLayoutController.layoutViewport() after the jump, and that fixed the glitch when scrolling, but it still did not jump to the correct place, only slightly forward. Then, I looked into TextKit 2 and the way it worked to try to find a solution. From what I can tell, it seems that to affect the NSTextViewportLayoutController without having to rewrite it, I need an NSTextViewportLayoutControllerDelegate, but the delegate required me to manually lay out the views, and in all the examples I've seen that use a custom NSTextViewportLayoutControllerDelegate, they wrote their own custom text view instead of using the default UITextView. I started looking into writing a custom text view so I can get the programmatic scroll to work consistently. However, it felt like, from a maintainability standpoint, it would probably be best to stick with what Apple has already implemented. For now, I found a workaround that scrolls consistently. Here is the code: if let start = self.textView.position(from: self.textView.beginningOfDocument, offset: desiredLineRange.location) { let location = textView.caretRect(for: start) self.textView.setContentOffset(CGPoint(x: 0, y: location.origin.y), animated: false) } if let start = self.textView.position(from: self.textView.beginningOfDocument, offset: desiredLineRange.location) { let location = textView.caretRect(for: start) self.textView.setContentOffset(CGPoint(x: 0, y: location.origin.y), animated: false) } It does the job, because the first time it gets close enough, and the second time it gets to the precise location, but it just feels like a bit of a hack to run the same code twice. I was wondering if anyone knows what I could be doing wrong and if Apple provides any solutions for this? (Also, all my UIKit navigation attempts ran inside an @objc func, which I passed using button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside). Just so you know in case it may be a problem with the way Swift and UIKit handle concurrency/parallel tasks). Thank you!
Replies
0
Boosts
0
Views
255
Activity
Jul ’25
iOS 26 Floating Search Tab in UIKit
Does anyone have any documentation for how to achieve the floating search tab item in UIKit apps that use UITabBarController? The Liquid Glass UIKit video had code for minimizing the tab bar on scroll down, but I didn't see anything on keeping the search button locked to the bottom trailing edge (as in this screenshot below).
Replies
4
Boosts
0
Views
346
Activity
Jul ’25
iPadOS 26 TabBar text color can't be changed
Hello, I have been trying for some time to change the color of native UITabBar in UITabBarController through UITabBarAppearance, but nothing works and the text is still black in the Xcode Beta 3 on iPadOS 26 while it works correctly in the previous OS versions. Here is the code: let color = UIColor.white let stackedAppearance = UITabBarItemAppearance() stackedAppearance.normal.iconColor = color stackedAppearance.normal.titleTextAttributes = [ .foregroundColor: color ] stackedAppearance.selected.iconColor = color stackedAppearance.selected.titleTextAttributes = [ .foregroundColor: color ] let inlineAppearance = UITabBarItemAppearance() inlineAppearance.normal.iconColor = color inlineAppearance.normal.titleTextAttributes = [ .foregroundColor: color ] inlineAppearance.selected.iconColor = color inlineAppearance.selected.titleTextAttributes = [ .foregroundColor: color ] let tabAppearance = UITabBarAppearance() tabAppearance.compactInlineLayoutAppearance = inlineAppearance tabAppearance.inlineLayoutAppearance = inlineAppearance tabAppearance.stackedLayoutAppearance = stackedAppearance UITabBar.appearance().standardAppearance = tabAppearance UITabBar.appearance().scrollEdgeAppearance = tabAppearance
Replies
0
Boosts
5
Views
486
Activity
Jul ’25
Why does converting HEIC/HEIF to JPEG using UIImage.jpegData(compressionQuality: 1.0) significantly increase file size?
I'm working with images selected from the iOS Photos app using PHPickerViewController. Some images appear as HEIF in the Photos info panel — which I understand are stored in the HEIC format, i.e., HEIF containers with HEVC-compressed images, commonly used on iOS when "High Efficiency" is enabled. To convert these images to JPEG, I'm using the standard UIKit approach: if let image = UIImage(data: heicData) { let jpegData = image.jpegData(compressionQuality: 1.0) } However, I’ve noticed that this conversion often increases the image size significantly: Original HEIC/HEIF: ~3 MB Converted JPEG (quality: 1.0): ~8–12 MB There’s no resolution change or image editing — it’s just a direct conversion. I understand that HEIC is more efficient than JPEG, but the increase in file size feels disproportionate. Is this kind of jump expected, or are there any recommended workarounds to avoid it?
Replies
1
Boosts
0
Views
301
Activity
Jul ’25
Who vends the item identifier and the index path arguments to the cell provider closure of a diffable data source?
I was reading over the documentation of the CellProvider struct for the diffable data source initialiser, and the CellProvider is defined as a closure which takes three arguments, a table view, an index path, and an item identifier. My question is, who vends the index path and the item identifier to this closure? My thinking is that it is the data source who vends these items because it adopts the UITableViewDataSource protocol which acts as the source of data for this view.
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
0
Boosts
0
Views
266
Activity
Jul ’25