The NSTextViewportLayoutControllerDelegate.textViewportLayoutControllerDidLayout(_:) documentation states that
Layout information on textViewportLayoutController is up-to-date at the point of this call.
however it is easy to put the NSTextViewportLayoutController in a state where after calling textViewportLayoutControllerDidLayout, the value of viewportRange is nil (unexpected) and value of the property viewportBounds is .zero
The TextKit2 sample application found at https://developer.apple.com/documentation/uikit/using-textkit-2-to-interact-with-text makes that assumption as well, and in few places force unwrap the value of viewportRange, that leads to runtime crashes.
This behavior is also discussed in Developer Forum thread about TextKit2 viewport relocation: https://developer.apple.com/forums/thread/761364?answerId=800516022#800516022
How to reproduce:
Run Mac target of LayoutWithTextKit2 sample project found at https://developer.apple.com/documentation/uikit/using-textkit-2-to-interact-with-text
locate menu.rtf file and duplicate its content several times - the goal is to increase the length of the layout text
quickly resize application window - that results in viewport layouts - that result in out-of-bound viewport - that results ina crash
OR quickly scroll down/up to the end of the document using scroller bar on the right side of the window
Reproducible 100%
The situation occurs when the document is not fully laid out, the estimated size (height) of the content exceeds the final (correct) height, and the layoutViewport() function is executed quickly. Resulting in partial viewport layout, and once the viewport moves outside of the document's total height, the viewportLayoutController starts to report viewportRange = nil.
FB19698121
Why does it happen? Is it expected? How to recover from that state? And most importantly, how to make the NSTextLayoutManager display the portion of the document that is currently scrolled to. and how to do it without for ce layout the full document on each viewportLayout()
General
RSS for tagExplore the various UI frameworks available for building app interfaces. Discuss the use cases for different frameworks, share best practices, and get help with specific framework-related questions.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
When I go to update my iPad Pro 4th gen to iPadOS 26 beta3 and click the update now button, the screen to enter my passcode comes up but is blacken there is NO keypad. reboots do not fix this and waiting sure hasn't. Is anyone else having this issue and is there a fix?
My PreviewCode app provides QuickLook previews and Finder icon thumbnails for source code files written in many popular programming languages.
The only one it doesn't work will with is TypeScript, which typically uses the ts file extension. This is because Apple's CoreTypes bundle maps the ts file extension to its own MPEG-4 Transport Stream UTI. Right now I have two UTIs mapped to the ts extension: the above one and another, com.microsoft.typescript.
The question is, how can I tell macOS' Launch Services to favour the latter over the former so that PreviewCode's previewer app extension is called whenever then user QuickLooks a TypeScript file and not (as currently happens) macOS' MPEG-4 previewer?
I'd like to code this into PreviewCode or at the very least provide the technique in the response to the many tech support requests I get about this ts mix-up specifically.
Trying to get my iPad app to display a different view on connected external display.
Info.plist is setup as follows:
<dict>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<true/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleExternalDisplayNonInteractive</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>External Display</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
</dict>
</array>
</dict>
</dict>
</dict>
I have my SceneDelegate setup as the follows:
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
if session.role == .windowExternalDisplayNonInteractive {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ExternalDisplayView())
self.window = window
window.makeKeyAndVisible()
}
}
}
Topic:
UI Frameworks
SubTopic:
General
Intro
I am reporting multiple persistent UI animation issues observed in tvOS 26 (Beta 6). These issues have been reproducible across multiple tvOS releases. They are subtle but noticeable, and they affect the overall polish and perceived quality of the system.
I am happy to provide high-quality video captures for each of the issues described below.
⸻
Bug #1: App launch animation stutter/jump
Summary: The zoom-in animation from a Springboard icon to full-screen app stutters or jumps at the moment the app becomes full screen.
Steps to reproduce:
1. On Springboard, select any app icon.
2. Observe the zoom-in animation.
Expected result: Smooth, continuous zoom without frame drops or jumps.
Actual result: Animation visibly stutters/jumps at the full-screen transition.
Possible cause: Timing issue in Core Animation interpolation or abrupt view hierarchy switch.
⸻
Bug #2: Text rendering weight change (“jump”) during transitions
Summary: Text inside apps changes visual weight mid-transition from scaled preview to full screen.
Steps to reproduce:
1. From Springboard or App Switcher, launch an app with visible text.
2. Observe text during the zoom animation — initially slightly bolder, then thinner once full screen.
Also occurs in:
• Top Shelf banners in the Dock
• App Switcher → full-screen transitions
Expected result: Consistent text rendering throughout the transition.
Actual result: Visible “pop” in text weight/anti-aliasing during transition.
Possible cause: Different rasterization/anti-aliasing mode between preview snapshot (CALayer.contents) and live CoreText/UIKit rendering.
⸻
Bug #3: Focus shadow jumps instead of interpolating smoothly
Summary: Shadows around focused UI elements (icons, buttons) change abruptly during focus transitions.
Steps to reproduce:
1. Navigate between focusable UI elements on Springboard or in apps.
2. Observe the shadow effects.
Expected result: Shadows interpolate smoothly (offset, opacity, radius) during focus transitions.
Actual result: Shadows “jump” abruptly, breaking animation smoothness.
Possible cause: UIFocusEngine not interpolating shadow parameters consistently.
⸻
Bug #4: Abrupt jumps when swiping horizontally between content items
Summary: In horizontally scrollable poster/content rows, focus snaps abruptly instead of scrolling smoothly.
Steps to reproduce:
1. In the TV app or any app with horizontal poster rows, swipe left/right.
2. Observe the transition between focused items.
Expected result: Smooth horizontal navigation with continuous motion.
Actual result: Occasional abrupt snapping/jumping between items.
⸻
Impact
While none of these bugs block core functionality, they degrade the premium feel and visual polish of tvOS. They are persistent across releases and occur in core system UI, so they are visible to all users.
Note
I can provide video recordings for each bug to assist engineering in reproducing and analyzing the issues.
Hey,
After installing iOS 26 public beta, when using carplay on an aftermarket head unit resolution looks too small. I know it has to with smart zoom setting and disabling it fixes.
The problem is that it comes enabled by default with the beta but i can’t disable it. Not because of the small screen but the iPhone can’t handle the high resolution rendering when going on settings and crashes.
Does anyone know how to fix this issue? It would be nice if carplay options could be modified from the iPhone directly.
Thank you
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
Hello Apple Developer Team,
I kindly ask if you could allow developers to access the same Arabic keyboard used in iOS — with the exact layout, design, and smooth performance as the default iPhone keyboard.
Currently, building a custom Arabic keyboard that replicates Apple’s layout results in severe lag and a frustrating user experience. Despite many attempts, it’s nearly impossible to match the original keyboard’s speed, size, and feel — especially for Arabic.
I fully understand your security concerns. To ensure safety, Apple could prevent typing in password fields and clearly mark the keyboard as customized (e.g., a red Send button). That would be completely acceptable.
I am not planning to publish anything on the App Store. This is purely for personal use only — to play and experiment with friends on platforms like Discord, by adding simple tools like repeating each word twice or splitting typed words into separate letters.
Honestly, I am mentally exhausted from trying to rebuild something that already exists. Every attempt leads to slow performance and disappointment. I just want the real keyboard — the same one we already use — and the ability to build basic features on top of it.
Thank you very much for your time and understanding.
Best regards,
Abdullah Abdulrahman Aljurayyad
I am trying to add a pinned(always visible and not moving) toolbar to the bottom of UISheetPresentationController or presentationDetent.
This is achievable when the user is dragging to change the size of the sheet.
But when changing the detent by code, it does not work. For example, when changing from medium to large, the ViewController's size is changed to large then moved up to the position.
From the user's POV, anything at the bottom to disappear for a few frames then reappears.
From my testing, when using UISheetPresentationController, ViewController only knows the medium and large state's frame and bounds, so manually setting it up won't work.
Is there a way to keep views at the bottom always visible in this case?
The sample code below is in SwiftUI for easy recreation, and the responses can be in UIKit.
Sample Code:
struct ContentView: View {
@State var showSheet: Bool = true
@State var detent: PresentationDetent = .medium
var body: some View {
EmptyView()
.sheet(isPresented: $showSheet) {
ScrollView {
}
.safeAreaInset(edge: .bottom) {
Button {
detent = (detent == .medium) ? .large : .medium
} label: {
Text("Change Size")
}
.buttonStyle(.borderedProminent)
.presentationDetents([.medium, .large], selection: $detent)
.presentationBackgroundInteraction(.enabled)
}
}
}
}
Multitasking & Gestures >> Seeing the app icon instead of contact info when drag-and-dropping contacts into my Calendar view in iOS 26.0 Beta? In Settings Multitasking & Gestures >> Select Full-screen Apps then worked fine. But when Multitasking & Gestures >> select Windowed Apps then any suggestion how to handle on app development for one or two screen?
Topic:
UI Frameworks
SubTopic:
General
We're seeing a sharp uptick in BaseBoard/FrontBoardServices crashes since we migrated from UIApplicationDelegate to UIWindowSceneDelegate. Having exhausted everything on my end short of reverse engineering BaseBoard or making changes without being able to know if they work, I need help. I think all I need to get unstuck is an answer to these questions, if possible:
What does -[BSSettings initWithSettings:] enumerate over? If I know what's being enumerated, I'll know what to look for in our app.
What triggers FrontBoardServices to do this update? If I can reproduce the crash--or at least better understand when it may happen--I will be better able to fix it
Here's two similar stack traces:
App_(iOS)-crashreport-07-30-2025_1040-0600-redacted.crash
App_(iOS)-crashreport-07-30-2025_1045-0600-redacted.crash
Since these are private trameworks, there is no documentation or information on their behavior that I can find.
There are other forum posts regarding this crash, on here and on other sites. However, I did not find any that shed any insight on the cause or conditions of the crash. Additionally, this is on iPhone, not macOS, and not iPad. This post is different, because I'm asking specific questions that can be answered by someone with familiarity on how these internal frameworks work. I'm not asking for help debugging my application, though I'd gladly take any suggestions/tips!
Here's the long version, in case anyone finds it useful:
In our application, we have seen a sharp rise in crashes in BaseBoard and FrontBoardServices, which are internal iOS frameworks, since we migrated our app to use UIWindowSceneDelegate. We were using exclusively UIApplicationDelegate before. The stack traces haven't proven very useful yet, because we haven't been able to reproduce the crashes ourselves.
Upon searching online, we have learned that Baseboard/Frontsoardservices are probably copying scene settings upon something in the scene changing. Based on our crash reports, we know that most of our users are on an iPhone, not an iPad or macOS, so we can rule out split screen or window resizing. Our app is locked to portrait as well, so we can also rule out orientation changes. And considering the stack trace is in the middle of an objc_retain_x2 call, which is itself inside of a collection enumeration, we are assuming that whatever is being enumerated probably was changed or deallocated during enumeration. Sometimes it's objc_retain_x2, and sometimes it's a release call. And sometimes it's a completely different stack trace, but still within BaseBoard/FrontBoardServices. I suspect these all share the same cause.
Because it's thread 0 that crashed, we know that BaseBoard/FrontBoardServices were running on the main thread, which means that for this crash to occur, something might be changing on a background thread. This is what leads me to suspect a race condition.
There are many places in our app where we accidentally update the UI from a background thread. We've fixed many of them, but I'm sure there are more. Our app is large. Because of this, I think background UI are the most likely cause. However, since I can't reproduce the crash, and because none of our stack traces clearly show UI updates happening on another thread at the same time, I am not certain.
And here's the stack trace inline, in case the attachments expire or search engines can't read them:
Thread 0 name:
Thread 0 Crashed:
objc_retain_x2 (libobjc.A.dylib)
BSIntegerMapEnumerateWithBlock (BaseBoard)
-[BSSettings initWithSettings:] (BaseBoard)
-[BSKeyedSettings initWithSettings:] (BaseBoard)
-[FBSSettings _settings:] (FrontBoardServices)
-[FBSSettings _settings] (FrontBoardServices)
-[FBSSettingsDiff applyToMutableSettings:] (FrontBoardServices)
-[FBSSettingsDiff settingsByApplyingToMutableCopyOfSettings:] (FrontBoardServices)
-[FBSSceneSettingsDiff settingsByApplyingToMutableCopyOfSettings:] (FrontBoardServices)
-[FBSScene updater:didUpdateSettings:withDiff:transitionContext:completion:] (FrontBoardServices)
__94-[FBSWorkspaceScenesClient _queue_updateScene:withSettings:diff:transitionContext:completion:]_block_invoke_2 (FrontBoardServices)
-[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:] (FrontBoardServices)
__94-[FBSWorkspaceScenesClient _queue_updateScene:withSettings:diff:transitionContext:completion:]_block_invoke.cold.1 (FrontBoardServices)
__94-[FBSWorkspaceScenesClient _queue_updateScene:withSettings:diff:transitionContext:completion:]_block_invoke (FrontBoardServices)
_dispatch_client_callout (libdispatch.dylib)
_dispatch_block_invoke_direct (libdispatch.dylib)
__FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ (FrontBoardServices)
-[FBSMainRunLoopSerialQueue _targetQueue_performNextIfPossible] (FrontBoardServices)
-[FBSMainRunLoopSerialQueue _performNextFromRunLoopSource] (FrontBoardServices)
__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ (CoreFoundation)
__CFRunLoopDoSource0 (CoreFoundation)
__CFRunLoopDoSources0 (CoreFoundation)
__CFRunLoopRun (CoreFoundation)
CFRunLoopRunSpecific (CoreFoundation)
GSEventRunModal (GraphicsServices)
-[UIApplication _run] (UIKitCore)
UIApplicationMain (UIKitCore)
(null) (UIKitCore)
main (AppDelegate.swift:0)
0x1ab8cbf08 + 0
For some controls it is desirable to not use the morphing transition when presenting a Menu. Instead, you might want to have the old behavior, where the menu is presented above or below the initiating view. This can be the case for any other control than toolbar items, but especially for bigger content cards, that should trigger a menu upon tapping it once. In those cases it looks weird and does not really help to keep context of what the action is doing.
Is there some way to do this right now?
In case it's not, I also filed a feedback.
FB18413055
So many issues with the new sheet design, I don't think I can ship these. And it's both in UIKit and SwiftUI. Honestly these net sheets seem like a failure from start to finish and I don't believe it will get better for the initial release.
Toolbar buttons in medium detent size have very low contrast and look bad with their opaque appearance
During the transition from medium to large detent the whole sheet flickers and turns transparent for a split moment, creating a very jarring transition (video here: https://mastodon.social/@nicoreese/114938826906689965).
In the large detent the background is always white in light mode making the cells bleed into the background making them indistinguishable from it. I should be able to set a background color for the large detent which smoothly transitions to it. Like: glass in medium and system grouped background in large.
Any interaction with the medium detent sheet makes it scale up. Why? It's okay for single interactions but not for when the user taps something in it rapidly. There needs to be a way to disable this behavior.
In the medium detent List/UICollectionView rows are white in light mode or gray in dark mode. Especially in dark mode it looks very bad against the glass background. Those rows should probably be translucent to better fit the glass.
This needs serious fixing and fast.
FB18919680
FB18919657
FB18919600
FB18919549
FB18919496
FB18919630
I want to use SandBox but I need to get rid of that popup menu :
""I can not load a .png"" so I do not know how to show the PopUp.
Desktop/PopUpScreenShot.png
We are building a Multi-Lingual Business Application -- where the user is able to enter values and data in multiple languages.
One of our main use cases is, if a user is editing or adding to a text value or data that is in a different language. For example, the data they are editing could be in Japanese, and the user's current input language is set to English, then when they enter the editing mode, the input language is automatically set to Japanese by us -- programmatically. They can go back to editing English items, and the input language is changed back to English, and similarly, when they come back to edit the Japanese data or some German data, then the input language is again automatically changed to the respective language by the application -- without causing the user to manually go to the settings and change it.
Is there any current way to have this behaviour in MacOS and iOS now?
Please suggest what can be done to achieve the same.
I’m developing an app that uses UWB for proximity detection between users. I have questions about iOS 18.4’s new Live Activity background UWB capabilities.
Live Activity Background UWB “Loophole”
Apple’s documentation states that apps can continue UWB ranging in background with “any supported device” if a Live Activity is started as the app backgrounds - without requiring Bluetooth LE pairing.
Key Questions:
1. Background initiation: Can new UWB sessions be initiated between devices while in background using Live Activities, or must sessions start in foreground first?
2. No pairing requirement: Does this iOS 18.4 Live Activity approach truly eliminate the need for Bluetooth LE pairing for background UWB ranging?
3. Session persistence: How long can UWB ranging continue in background with an active Live Activity?
4. Testing without entitlement: Can I test UWB functionality between multiple devices in Xcode without the Nearby Interaction entitlement approved yet?
Context
My app needs precise proximity detection between users in real-time. The Live Activity background capability would be essential since users need to put phones away while the ranging continues.
This iOS 18.4 feature seems like it could be a game-changer for apps requiring background UWB functionality without the complexity of Bluetooth pairing.
Has anyone successfully implemented this Live Activity + background UWB approach?
Hello,
I use CLGeocoder to get the CLLocationCoordinate2D and CLRegion for an address. Now that this is deprecated in OS 26, I don't see a replacement for that property on MKMapItem via MKMapItemRequest and PlaceDescriptor. I've filed FB19027378 on this issue.
Basically I have some addresses that have a street address, and others that just have a city. With CLGeocoder, when geocoding just the city, the CLRegion was set such that I could show my map zoomed out just right. I'm not sure how to do that now.
Thanks!
Hi everybody,
i search how can i change the height of section dynamically when i have some value in the section.
thanks for your help ❤️
Topic:
UI Frameworks
SubTopic:
General
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!
Hello,
As titled, my team is trying to find a way to add unity projects to our current developments. We have checked several posts and tutorials, but find they are all about porting to a brand new project.
Without modifying too much on our current swift codes, we wonder if we can add Unity part as a WindowGroup/ImmersiveSpace like the following? :)
struct TestVisionUnityApp: App {
var body: some Scene {
// from default template
WindowGroup {
ContentView()
....
}
// @TODO
WindowGroup {...}
}
}