Core Animation

RSS for tag

Render, compose, and animate visual elements using Core Animation.

Posts under Core Animation tag

30 Posts

Post

Replies

Boosts

Views

Activity

Animations for streaming
We have a macOS app (not yet released, but in use by ourselves), that provides scoreboards for streaming sport events. Today it is expected, that there are nice animations for goals, etc. We are streaming using NDI, which requires a CVPixelBuffer for each frame. We currently create these animations using CABasicAnimation, CAAnimation and CAKeyframeAnimation. In addition we use ScreenCaptureKit to generate the frames. This works fine with 25/30 fps, as long as the window where our animations are performed in is visible. But this is not what it should be. We have a smaller window as main app window and control display performing the animations in reduced size, while the streaming animations need to be in HD format and later maybe in 4K. When using an offscreen window, the animations are not calculated. We get 1 frame per second or so. So we actually have to connect an external display to the MacBook and open the large windows there. Ugly solution. Do we use a completely wrong approach? Or is there a way to tell the macOS to perform the animations although it is an offscreen window? If it cannot work that way, what is an alternative?
0
0
150
May ’25
iOS 26 not showing new screenshot animation
Hi everyone, I’m currently testing iOS 26 on my iPhone as part of the developer program. According to Apple’s documentation and demo materials, a new screenshot animation was introduced in this version. However, when I take a screenshot on my device, the animation remains the same as in previous iOS versions. I’ve double-checked that I’m running the correct build of iOS 26, and I haven’t found any settings that might enable or disable this feature. Is anyone else experiencing the same issue? Could this new animation be device-specific, region-limited, or require additional configuration? Any insight would be appreciated! Thanks in advance, Alonso Rivera
0
0
271
Jun ’25
`UIGraphicsImageRenderer` + `drawHierarchy` gives very flat colors
My setup: a UILabel with text in it and then let aBugRenderer = UIGraphicsImageRenderer(size: aBugLabel.bounds.size) let aBugImage = aBugRenderer.image { context in aBugLabel.drawHierarchy(in: aBugLabel.bounds, afterScreenUpdates: true) } The layout and everything is correct, the image is correct, but I used my colors in the displayP3 color space to configure the source UILabel.textColor And unfortunately, the resulted image ends up being sRGB IEC61966-2.1 color space and the color appears way bleaker than when it's drawn natively. Question: how can I set up the renderer so that it draws the same color.
0
0
180
Jun ’25
[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
237
Aug ’25
Weird glitches during restore from minimalization of any app
From what I’ve seen, this issue has been around since macOS 13 and can be reproduced reliably. It happens with some apps like Music, Notes, and Google Chrome. Here’s how to see it: 1.Make sure “Minimize windows into application” is enabled in System Settings, or just open a minimized app later directly from its application icon. 2.Open one of the apps mentioned above. 3.Minimize it. 4.Click the minimized app in the Dock to restore it. You’ll notice the GUI flashes for a moment and the minimize animation plays again. Some additional info here: https://forums.macrumors.com/threads/weird-glitches-during-restore-from-minimalization-of-any-app.2370260/ A video clipped from another GitHub issue: https://private-user-images.githubusercontent.com/13177224/445474477-36d8c784-9588-4186-8b6a-875c4077ce1c.mp4?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTgyMTQ0ODEsIm5iZiI6MTc1ODIxNDE4MSwicGF0aCI6Ii8xMzE3NzIyNC80NDU0NzQ0NzctMzZkOGM3ODQtOTU4OC00MTg2LThiNmEtODc1YzQwNzdjZTFjLm1wND9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA5MTglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwOTE4VDE2NDk0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwOWYwZWVmMDBjZWRiNzA2MDg1NDFiMTIxNmU3ZmFiZWIwOThjYzRmYmE1OWJiZWNlZjFlNjRlYjA4NTVkYjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.xbAxdTgxadCVCZPsnZkhx9HnVbjP-D5w1GfPTBatIWQ
0
0
129
Sep ’25
CALayerInvalidGeometry in AVMobileGlassVolumeControlsView
Good day! Have anyone experienced sudden crashes increase cause by CALayerInvalidGeometry · CALayer position contains NaN: [nan 5] that gets set via -[AVMobileGlassVolumeControlsView layoutSubviews]? 94% of crashes belong to iOS 26.0.1, while rest to 26.0. What's weird, though, is that it is caused by some AVKit internal logic and cant' understand how to track it down, neither how to reproduce. Stack trace looks as follows: 0 CoreFoundation +0xc98c4 ___exceptionPreprocess 1 libobjc.A.dylib +0x317c0 _objc_exception_throw 2 CoreFoundation +0x1548d0 +[NSException raise:format:] 3 QuartzCore +0x909b4 CA::Layer::set_position(CA::Vec2<double> const&, bool) 4 QuartzCore +0x2af294 -[CALayer setPosition:] 5 UIKitCore +0xe9fc18 -[UIView _backing_setPosition:] 6 UIKitCore +0x18f6158 -[UIView setCenter:] 7 UIKitCore +0x1eb704 0x188b5e704 (0x188b5e5f4 + 272) 8 UIKitCore +0x1eb56c 0x188b5e56c (0x188b5e4f0 + 124) 9 UIKitCore +0x18fd318 -[UIView(Geometry) _resizeWithOldSuperviewSize:] 10 CoreFoundation +0x1514c ___NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ 11 CoreFoundation +0xdd18c -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] 12 UIKitCore +0x18fc6dc -[UIView(Geometry) resizeSubviewsWithOldSize:] 13 UIKitCore +0x18fabd0 -[UIView(Geometry) setFrame:] 14 AVKit +0x1b5a88 -[AVMobileGlassVolumeControlsView layoutSubviews] 15 UIKitCore +0x27074 0x18899a074 (0x188999d3c + 824) 16 UIKitCore +0x27b34 0x18899ab34 (0x18899ab14 + 32) 17 UIKitCore +0x190df64 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 18 QuartzCore +0xac9a4 CA::Layer::perform_update_(CA::Layer*, CALayer*, unsigned int, CA::Transaction*) 19 QuartzCore +0x8f2f8 CA::Layer::update_if_needed(CA::Transaction*, unsigned int, unsigned int) 20 UIKitCore +0x57b0 -[UIView(Hierarchy) layoutBelowIfNeeded] 21 AVKit +0x1b6634 ___74-[AVMobileGlassVolumeControlsView _updateVolumeFluidSliderEmphasizedScale]_block_invoke 22 UIKitCore +0x1b3e58 -[UIViewPropertyAnimator _runAnimations] 23 UIKitCore +0x19025f0 +[UIView(Animation) _performWithState:trackingIdentifier:duration:delay:animations:] 24 UIKitCore +0x83a650 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke_4 25 UIKitCore +0x83a460 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke 26 UIKitCore +0x83a210 -[UIViewPropertyAnimator startAnimationAsPaused:] 27 AVKit +0x1b6574 -[AVMobileGlassVolumeControlsView setEmphasized:] 28 AVKit +0x127510 ___64-[AVMobileGlassControlsViewController _animateVolumeEmphasisTo:]_block_invoke 29 UIKitCore +0x1b3e58 -[UIViewPropertyAnimator _runAnimations] 30 UIKitCore +0x83a590 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke_3 31 UIKitCore +0x83a460 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke 32 UIKitCore +0x83a514 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke_2 33 UIKitCore +0x839e60 -[UIViewPropertyAnimator _setupAnimationTracking:] 34 UIKitCore +0x83a260 -[UIViewPropertyAnimator startAnimationAsPaused:] 35 AVKit +0x127480 -[AVMobileGlassControlsViewController _animateVolumeEmphasisTo:] 36 AVKit +0x12ea2c ___56-[AVMobileGlassControlsViewController _observationSetup]_block_invoke_5 37 AVKit +0xcbcd0 ___106-[AVObservationController startObservingNotificationForName:object:notificationCenter:observationHandler:]_block_invoke 38 CoreFoundation +0x519ec ___CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 39 CoreFoundation +0x51ab0 ____CFXRegistrationPost_block_invoke 40 CoreFoundation +0x5190c __CFXRegistrationPost 41 CoreFoundation +0x520ac __CFXNotificationPost 42 Foundation +0x94fc2c -[NSNotificationCenter postNotificationName:object:userInfo:] 43 AVKit +0x1b9bd8 -[AVSystemVolumeController _postNotificationForNameIfFullyInitialized:userInfo:] 44 AVKit +0x1b9dc0 -[AVSystemVolumeController setVolume:shouldShowHUD:] 45 AVKit +0x1b965c ___69-[AVSystemVolumeController _handleSystemVolumeDidChangeNotification:]_block_invoke 46 AVKit +0x1b8da4 -[AVSystemVolumeController _performOnMainThread:] 47 AVKit +0x1b95c0 -[AVSystemVolumeController _handleSystemVolumeDidChangeNotification:] 48 CoreFoundation +0x51a00 ___CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 49 CoreFoundation +0x51ab0 ____CFXRegistrationPost_block_invoke 50 CoreFoundation +0x5190c __CFXRegistrationPost 51 CoreFoundation +0x520ac __CFXNotificationPost 52 Foundation +0x94fc2c -[NSNotificationCenter postNotificationName:object:userInfo:] 53 MediaExperience +0x1039b0 ___76+[AVSystemControllerCommon postNotificationOnMainQueue:notification:object:]_block_invoke 54 MediaExperience +0x6b64 ___MXDispatchAsync_block_invoke 55 libdispatch.dylib +0x1ad8 __dispatch_call_block_and_release 56 libdispatch.dylib +0x1b7e8 __dispatch_client_callout 57 libdispatch.dylib +0x38b20 __dispatch_main_queue_drain.cold.5 58 libdispatch.dylib +0x10ec4 __dispatch_main_queue_drain 59 libdispatch.dylib +0x10e00 __dispatch_main_queue_callback_4CF 60 CoreFoundation +0x6b51c ___CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ 61 CoreFoundation +0x1dd10 ___CFRunLoopRun 62 CoreFoundation +0x1cc40 __CFRunLoopRunSpecificWithOptions 63 GraphicsServices +0x1494 _GSEventRunModal 64 UIKitCore +0xa9dd8 -[UIApplication _run] 65 UIKitCore +0x4eb08 _UIApplicationMain 66 TuneIn Radio +0x1b318 main (main.m:28:22) 67 dyld +0x4e24 start
0
1
250
Oct ’25
Navigation Bar animation upon Tab change
Hi. Since Xcode 16 and/or iOS 18.0 (I upgraded at the same time), I have an strange effect in the lower (let's say) 20% section of the Navigation Bar when changing to another tab, and this independently if large titles are used or not. Mentioned section is brighter or darker than the rest of the Navigation Bar background, depending on which background tint is used. This effect lasts about 0.3 seconds, but is clearly visible, quite disturbing and new as of Xcode 16 and/or iOS 18.0. I use the code below in AppDelegate to get a gradient coloured Navigation Bar background. let appearance = UINavigationBarAppearance() UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().compactAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance UINavigationBar.appearance().compactScrollEdgeAppearance = appearance If I don't use above code., the background color is filled and without gradient. Subject effect doesn't show in this case. The effect basically looks like when changing tab, the new Navigation Bar background doesn't clear right away, and keeps the background from the previous Navigation Bar for 0.3 seconds before new one Navigation Bar background is rendered. I spent quite some time on changing every possible setting, in code as well as storyboard ... no success so far. Any ideas how to disable this undesired animation?
1
0
789
Oct ’25
UI freeze during layouting
One of our users reported a very strange bug where our app freezes and eventually crashes on some screen transitions. From different crash logs we could determine that the app freezes up when we call view.layoutIfNeeded() for animating constraint changes. It then gets killed by the watchdog 10 seconds later: Exception Type: EXC_CRASH (SIGKILL) Exception Codes: 0x0000000000000000, 0x0000000000000000 Termination Reason: FRONTBOARD 2343432205 <RBSTerminateContext| domain:10 code:0x8BADF00D explanation:scene-update watchdog transgression: app<bundleID(2A01F261-3554-44C0-B5A9-EBEB446484AD)>:6921 exhausted real (wall clock) time allowance of 10.00 seconds ProcessVisibility: Background ProcessState: Running WatchdogEvent: scene-update WatchdogVisibility: Background WatchdogCPUStatistics: ( "Elapsed total CPU time (seconds): 24.320 (user 18.860, system 5.460), 29% CPU", "Elapsed application CPU time (seconds): 10.630, 12% CPU" ) reportType:CrashLog maxTerminationResistance:Interactive> The crash stack trace looks slightly different, depending on the UI transition that is happening. Here are the two we observed so far. Both are triggered by the layoutIfNeeded() call. Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 CoreAutoLayout 0x1b09f90e4 -[NSISEngine valueForEngineVar:] + 8 1 UIKitCore 0x18f919478 -[_UIViewLayoutEngineRelativeAlignmentRectOriginCache origin] + 372 2 UIKitCore 0x18f918f18 -[UIView _nsis_center:bounds:inEngine:forLayoutGuide:] + 1372 3 UIKitCore 0x18f908e9c -[UIView(Geometry) _applyISEngineLayoutValuesToBoundsOnly:] + 248 4 UIKitCore 0x18f9089e0 -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 148 5 CoreFoundation 0x18d0cd6a4 __NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ + 24 6 CoreFoundation 0x18d0cd584 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 432 7 UIKitCore 0x18f8e62b0 -[UIView(Geometry) resizeSubviewsWithOldSize:] + 128 8 UIKitCore 0x18f977194 -[UIView(AdditionalLayoutSupport) _is_layout] + 124 9 UIKitCore 0x18f976c2c -[UIView _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 800 10 UIKitCore 0x18f903944 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2728 11 QuartzCore 0x18ec15498 CA::Layer::layout_if_needed(CA::Transaction*) + 496 12 UIKitCore 0x18f940c10 -[UIView(Hierarchy) layoutBelowIfNeeded] + 312 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 QuartzCore 0x18ec2cfe0 -[CALayer animationForKey:] + 176 1 UIKitCore 0x18fa5b258 UniqueAnimationKeyForLayer + 192 2 UIKitCore 0x18fa5ab7c __67-[_UIViewAdditiveAnimationAction runActionForKey:object:arguments:]_block_invoke_2 + 468 3 UIKitCore 0x18fa5ba5c -[_UIViewAdditiveAnimationAction runActionForKey:object:arguments:] + 1968 4 QuartzCore 0x18eb9e938 CA::Layer::set_bounds(CA::Rect const&, bool) + 428 5 QuartzCore 0x18eb9e760 -[CALayer setBounds:] + 132 6 UIKitCore 0x18f941770 -[UIView _backing_setBounds:] + 64 7 UIKitCore 0x18f940404 -[UIView(Geometry) setBounds:] + 340 8 UIKitCore 0x18f908f84 -[UIView(Geometry) _applyISEngineLayoutValuesToBoundsOnly:] + 480 9 UIKitCore 0x18f9089e0 -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 148 10 CoreFoundation 0x18d0cd6a4 __NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ + 24 11 CoreFoundation 0x18d132488 -[__NSSingleObjectArrayI enumerateObjectsWithOptions:usingBlock:] + 92 12 UIKitCore 0x18f8e62b0 -[UIView(Geometry) resizeSubviewsWithOldSize:] + 128 13 UIKitCore 0x18f977194 -[UIView(AdditionalLayoutSupport) _is_layout] + 124 14 UIKitCore 0x18f976c2c -[UIView _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 800 15 UIKitCore 0x18f916258 -[UIView(Hierarchy) layoutSubviews] + 204 16 UIKitCore 0x18f903814 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2424 17 QuartzCore 0x18ec15498 CA::Layer::layout_if_needed(CA::Transaction*) + 496 18 UIKitCore 0x18f940c10 -[UIView(Hierarchy) layoutBelowIfNeeded] + 312 So far, we only know of one iPad Air M1 where this is happening. But we don't know how many users experience this issue without reporting it. Does anyone know what could cause Auto Layout or Core Animation to block in those calls? We have no clue so far...
1
0
208
Apr ’25
How to obtain frame rate for iOS proMotion devices
Due to the release of ProMotion devices, the system may switch frame rates in certain scenarios, resulting in the loss of reference value for data collected through CADisplayLink callbacks at a fixed 60Hz frame rate. We cannot distinguish whether the slow callback of CADisplayLink is due to a stutter or a system switch in frame rate. I know Hitch Time Ratio, but I can't use this scheme for some reasons. How can I distinguish between stuck and frame rate gear shift in CADisplaylink callback? In iOS 15, CADisplayLink.preferredFrameRateRange.preferred always returns 0, while minimum and maximum do change. Can I use these minimum and maximum range values as criteria to distinguish between frame rate switching and stuttering?
1
0
162
May ’25
STextField becomes blurry after layer transform on macOS 26 (Tahoe)
Hi everyone, After upgrading to macOS 26 (Tahoe) I’ve run into an issue: NSTextField becomes noticeably blurry when its parent layer is transformed (CATransform3D or CGAffineTransform). On macOS 15 (Sequoia) the exact same code worked fine — text stayed sharp. Interestingly, an NSImage backed by a PDF representation transforms without any problem and remains perfectly crisp, but labels do not. What I’ve tried so far Checked the contentsScale of the layers Setting magnificationFilter = .nearest Toggled shouldRasterize on/off and adjusted rasterizationScale Have there been any Core Animation or AppKit changes in macOS 26 that affect text rendering when transforming layers? What’s the recommended way now to keep NSTextField text sharp (similar to how vector PDF images behave) when scaling its parent layer? Any insights, best practices, or workarounds would be greatly appreciated. Thanks in advance!
1
0
216
Sep ’25
Unable to Display NSProgressIndicator on macOS Unlock (First Lock) Screen
I'm Trying to add an NSProgressIndicator on the unlock (first lock screen ) in macOS ( the screen with the lock icon ) I already added a label and it works fine and after entering the password on the second (authentication) page I can able to add ProgressIndicator but not on first screen. But Whenever I try to add a Progress indicator, the entire screen turns Black and nothing is displayed Is NSProgressIndicator supported on the first unlock Screen ? Or does macOS block animated UI on this screen Any Guidance would be helpful Thanks
1
0
145
Nov ’25
Race conditions when changing CAMetalLayer.drawableSize?
Is the pseudocode below thread-safe? Imagine that the Main thread sets the CAMetalLayer's drawableSize to a new size meanwhile the rendering thread is in the middle of rendering into an existing MTLDrawable which does still have the old size. Is the change of metalLayer.drawableSize thread-safe in the sense that I can present an old MTLDrawable which has a different resolution than the current value of metalLayer.drawableSize? I assume that setting the drawableSize property informs Metal that the next MTLDrawable offered by the CAMetalLayer should have the new size, right? Is it valid to assume that "metalLayer.drawableSize = newSize" and "metalLayer.nextDrawable()" are internally synchronized, so it cannot happen that metalLayer.nextDrawable() would produce e.g. a MTLDrawable with the old width but with the new height (or a completely invalid resolution due to potential race conditions)? func onWindowResized(newSize: CGSize) { // Called on the Main thread metalLayer.drawableSize = newSize } func onVsync(drawable: MTLDrawable) { // Called on a background rendering thread renderer.renderInto(drawable: drawable) }
1
1
532
Dec ’25
Smooth appearance switching
Hello every developers. I need your help. Do you know how to attach animation to appearance, like a smooth transition from dark to light and vise versa. My code here: @main struct The_Library_of_BabelonApp: App { @AppStorage("selectedAppearance") private var selectedAppearance = 0 @StateObject private var router = AppRouter() var scheme: ColorScheme? { if selectedAppearance == 1 { return .light } if selectedAppearance == 2 { return .dark } return nil } var body: some Scene { WindowGroup { RootView() .preferredColorScheme(scheme) .environmentObject(router) // this is doesn't work correctly .animation(.smooth(duration: 2), value: selectedAppearance) } } } And my appearance switching looks: struct SettingsView: View { @AppStorage("selectedAppearance") private var selectedAppearance = 0 var body: some View { List { Section(header: Text("Appearance")) { HStack(spacing: 20) { ThemePreview(title: "Light", imageName: "lightTheme", tag: 1, selection: $selectedAppearance) ThemePreview(title: "Dark", imageName: "darkTheme", tag: 2, selection: $selectedAppearance) ThemePreview(title: "System", imageName: "systemMode", tag: 0, selection: $selectedAppearance) } .padding(.vertical, 10) .frame(maxWidth: .infinity) } } } } struct ThemePreview: View { let title: String let imageName: String let tag: Int @Binding var selection: Int var body: some View { Button { selection = tag } label: { VStack { Image(imageName) .resizable() .aspectRatio(contentMode: .fill) .frame(width: 120, height: 80) .clipShape(RoundedRectangle(cornerRadius: 12)) .overlay( RoundedRectangle(cornerRadius: 12) .stroke(selection == tag ? Color.blue : Color.clear, lineWidth: 3) ) Text(title) .font(.caption) .foregroundColor(selection == tag ? .blue : .primary) } } .buttonStyle(.plain) } } I guess my code works but animation working another way, its turn my Section, I don't know.... Thank you in advance
1
0
78
Feb ’26
Converting a Stop Motion Animation to usdz
Hello everyone, I've been trying for a few weeks now to convert a sequential series of meshes into a stop-motion animation in USDZ format. In Unreal Engine, I’ve already figured out how to transform the sequential series of individual meshes into a smooth animation using the node system and arrays. Unfortunately, the node system cannot be exported as a usdz animation logic in either Unreal or Blender. Because of this, I have tried several other methods to incorporate the animation logic. Here’s what I’ve tried so far: I attempted to create the animation in Blender with Render-/Viewports and mapping it to keyframes. However, in my experience, Viewports are not supported in the conversion. I tried aligning the vertices of individual objects and merging the frames using the Shrinkwrap modifier in Blender, then setting up a morph animation with keyframes. However, because the individual meshes are too different, this results in artifacts, and manually editing each mesh is too difficult for me to handle. I placed all individual meshes at the same position and animated them sequentially by scaling them from 0 to 100 in keyframes (Frame 1 is visible for 10 frames, then scales down at frame 11, while Frame 2 becomes visible at frame 11, and so on). I also adjusted the keyframes so that the scaling happens in a "constant" manner rather than the default Bezier or linear interpolation. I then converted this animation to .abc, and the result initially looked good. However, some information is lost when converting it with OpenUSD. The animation does not maintain its intended jump-like behavior in USDZ format, and instead, the scaling of individual files is visible in the animation. I tried using a Blender add-on (StepMotion), which allows the animation to be exported as .abc, but it can only be read in Blender or Unreal. Even in the preview, the animation is not displayed correctly, so converting the animation logic does not work either. 
Unfortunately, I have no alternative way to create the animation, as the individual frames have been provided to me as meshes. So far, I haven’t found a way to implement this successfully. I would be very grateful for any tips or ideas, as I am running out of options on how to make this work. Thanks in advance!
2
0
275
Apr ’25
SwiftUI Transaction completion handler is being called unexpectedly
Unexpected SwiftUI Transaction Behavior This minimal example demonstrates an unexpected behavior in SwiftUI's Transaction API: var transaction = Transaction(animation: .none) transaction.addAnimationCompletion { print("This should not be called!") } The Issue The completion handler is called immediately after creation, even though the transaction was never used in any SwiftUI animation context (like withTransaction or other animation-related APIs). Expected vs Actual Behavior Expected: The completion handler should only be called after the transaction is actually used in a SwiftUI animation. Actual: The completion handler is called right after creation, regardless of whether the transaction is used or not. Current Workaround To avoid this, I'm forced to implement defensive programming: only creating transactions with completion handlers at the exact moment they're going to be used. This adds unnecessary complexity and goes against the intuitive usage of the Transactions API.
2
0
138
Jun ’25
Animation Ghosting with animation-timeline on 120HZ ProMotion Devices
On iOS Devices with ProMotion (120HZ) if you animate Elements on your Page with animation-timeline you get Ghosting Effects. You can not see the Ghosting with a Simulator or on Screenshots, only on real Devices. To Reproduce I made a Minimal Example: https://codesandbox.io/p/sandbox/120hztest-xrwgtc When you scroll quickly on the Page with an iOS 120HZ Device (https://en.wikipedia.org/wiki/List_of_smartphones_with_a_high_refresh_rate_display) you will see ghosting on the Top of the right Element (animation-timeline) and no ghosting on the other animated Element. (I edited the Screenshot, to Illustrate how the Effect looks like, since it is only visible on the real Display)
2
0
248
Jan ’26
Animation Help
Hello, I am trying to use matchedGeometryEffect to animate between an item in a list view and the item's detail view. Right now, I am getting an unwanted cross-fade animation as the view transitions. So the list item moves into place as it should with the modifier, but it fades out as its detail version fades in, which I do not want. I do not want any fading at all, just the movement from one component to the other. How do I stop this? Thanks.
2
0
81
Jan ’26
CATiledLayer flashes and re-draws entirely when re-drawing a single tile
I have filed a bug report for this (FB17734946), but I'm posting it here verbatim in case others have the same issue and in hopes of getting attention from an Apple engineer sooner. When calling setNeedsDisplayInRect on a CATiledLayer - or a UIView whose backing layer is CATiledLayer - one would expect to re-draw only a region identified by the rect passed to the method. This is even written in the documentation for the class: "Regions of the layer may be invalidated using the setNeedsDisplayInRect: method however the update will be asynchronous. While the next display update will most likely not contain the updated content, a future update will." However, upon calling this method, CATiledLayer redraws whole contents instead of just the tile at the specified rect, and it flashes when doing so. It behaves exactly the same as if one had called setNeedsDisplay without passing any rect; all contents are cleared and re-drawn again. I'm 100% sure I've passed in the correct rect of the exact tile that I need to redraw. I have even tried passing much smaller rects, but still the same. (And yes, the rect I've passed accounts for the current level of detail.) I have found this GitHub repo https://github.com/frankus/NetPhotoScroller, which based on discussion from here https://forums.macrumors.com/threads/catiledlayer-blanks-out-tiles-when-redrawing.1333948/ aims at solving these issues by using two private methods on CATiledLayer class: (void)setNeedsDisplayInRect:(CGRect)r levelOfDetail:(int)level; (BOOL)canDrawRect:(CGRect)rect levelOfDetail:(int)level; I have explored the repo in detail, however I wasn't able to test exactly this code from the GitHub repo. I have tried using those two private methods myself (through an Objective-C class that defines the methods in the header file and then a swift class which inherits it), but I couldn't solve the issue; the flashing and the full re-draw is still there. After doing a lot of research, the conclusion seems to be that one cannot use CATiledLayer with contents that are downloaded remotely, on demand, as tiles are being requested. I have, however, found one interesting thing which seems to work so far: before calling setNeedsDisplayInRect (or just setNeedsDisplay, as they behave the same for CATiledLayer in my testing), cache the current layer's contents, and after calling setNeedsDisplay (or setNeedsDisplayInRect), restore the contents back to the layer. This prevents flashing and preserves any tiles that were drawn at the time of the re-draw. let c = tiledLayer.contents tiledLayer.setNeedsDisplay(tileRect) tiledLayer.contents = c However! Docs clearly state the warning: Do not attempt to directly modify the contents property of a CATiledLayer object. Doing so disables the ability of a tiled layer to asynchronously provide tiled content, effectively turning the layer into a regular CALayer object. I believe this message implies modifying the contents property with some raw content, like image data, and that it may be safe to re-apply the existing contents (which are in my testing of type CAImageProvider) -- but I can't rely on an implementation detail in my production app. I have tested this and confirmed that the bug appears on: iPhone 14 Pro, iOS 18.5 iPhone 13 Pro, iOS 17.5.1 iPhone 5s, iOS 15.8.3 iPad Pro 1st gen, iPadOS 18.4.1 a couple simulator versions I can also confirm that the fix (to re-apply contents property) is also working properly on all these versions. Is this expected behavior, that tiled layer redraws itself entirely instead of redrawing specific tiles? Is it safe to modify contents of a CATiledLayer by re-applying the existing contents? If not, is there an alternative to avoid flashing?
3
0
200
May ’25
Why does CADisplayLink of an external UIScreen drift in time?
I am using Apple's original Lightning Digital AV-adapter (Lightning-to-HDMI dongle) to connect my iPhone to an external display via a HDMI cable. I need to synchronize rendering with the external display's refresh rate, so I create a new CADisplayLink tied to the external display's UIScreen: UIScreen.screens[externalDisplayIdx].displayLink(withTarget:, selector:). The callback is being called regularly, but with increasing delay relative to the CADisplayLink.timestamp, so the next time the callback is called, I have less and less time to draw the next frame (see the snippet below). Assuming 60 FPS, the value of secondsTillDeadline starts at an arbitrary value in the range of approx -0.0001 to 0.0166667, and then it slowly decreases towards zero (and for a brief period it goes into small negative numbers). Once it reaches zero, it flips back to 0.0166667 and continues to decrease again. This cycle repeats indefinitely. Changing the external display's resolution (UIScreen's mode) or the CADisplayLink's preferredFrameRateRange to a lower FPS does not seem to have any effect on the temporal drifting (even the rate of change seem to be the same). When I create a new CADisplayLink for the iPhone's main screen, the value of secondsTillDeadline is stable, it does not drift and it is very close to 0.0166667, as expected. Is this drift caused by the external monitor or by Apple's Lightning-to-HDMI dongle ...or is the problem somewhere else? Can the drifting be stopped? func onDisplayLinkUpdate(displayLink: CADisplayLink) { // Gradually decreases from 0.01667 to -0.0001, then flips back to 0.01667 and continues to decrease let secondsTillDeadline = displayLink.targetTimestamp - CACurrentMediaTime() }
3
0
470
Aug ’25
Animations for streaming
We have a macOS app (not yet released, but in use by ourselves), that provides scoreboards for streaming sport events. Today it is expected, that there are nice animations for goals, etc. We are streaming using NDI, which requires a CVPixelBuffer for each frame. We currently create these animations using CABasicAnimation, CAAnimation and CAKeyframeAnimation. In addition we use ScreenCaptureKit to generate the frames. This works fine with 25/30 fps, as long as the window where our animations are performed in is visible. But this is not what it should be. We have a smaller window as main app window and control display performing the animations in reduced size, while the streaming animations need to be in HD format and later maybe in 4K. When using an offscreen window, the animations are not calculated. We get 1 frame per second or so. So we actually have to connect an external display to the MacBook and open the large windows there. Ugly solution. Do we use a completely wrong approach? Or is there a way to tell the macOS to perform the animations although it is an offscreen window? If it cannot work that way, what is an alternative?
Replies
0
Boosts
0
Views
150
Activity
May ’25
iOS 26 not showing new screenshot animation
Hi everyone, I’m currently testing iOS 26 on my iPhone as part of the developer program. According to Apple’s documentation and demo materials, a new screenshot animation was introduced in this version. However, when I take a screenshot on my device, the animation remains the same as in previous iOS versions. I’ve double-checked that I’m running the correct build of iOS 26, and I haven’t found any settings that might enable or disable this feature. Is anyone else experiencing the same issue? Could this new animation be device-specific, region-limited, or require additional configuration? Any insight would be appreciated! Thanks in advance, Alonso Rivera
Replies
0
Boosts
0
Views
271
Activity
Jun ’25
`UIGraphicsImageRenderer` + `drawHierarchy` gives very flat colors
My setup: a UILabel with text in it and then let aBugRenderer = UIGraphicsImageRenderer(size: aBugLabel.bounds.size) let aBugImage = aBugRenderer.image { context in aBugLabel.drawHierarchy(in: aBugLabel.bounds, afterScreenUpdates: true) } The layout and everything is correct, the image is correct, but I used my colors in the displayP3 color space to configure the source UILabel.textColor And unfortunately, the resulted image ends up being sRGB IEC61966-2.1 color space and the color appears way bleaker than when it's drawn natively. Question: how can I set up the renderer so that it draws the same color.
Replies
0
Boosts
0
Views
180
Activity
Jun ’25
[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
Replies
0
Boosts
0
Views
237
Activity
Aug ’25
Weird glitches during restore from minimalization of any app
From what I’ve seen, this issue has been around since macOS 13 and can be reproduced reliably. It happens with some apps like Music, Notes, and Google Chrome. Here’s how to see it: 1.Make sure “Minimize windows into application” is enabled in System Settings, or just open a minimized app later directly from its application icon. 2.Open one of the apps mentioned above. 3.Minimize it. 4.Click the minimized app in the Dock to restore it. You’ll notice the GUI flashes for a moment and the minimize animation plays again. Some additional info here: https://forums.macrumors.com/threads/weird-glitches-during-restore-from-minimalization-of-any-app.2370260/ A video clipped from another GitHub issue: https://private-user-images.githubusercontent.com/13177224/445474477-36d8c784-9588-4186-8b6a-875c4077ce1c.mp4?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTgyMTQ0ODEsIm5iZiI6MTc1ODIxNDE4MSwicGF0aCI6Ii8xMzE3NzIyNC80NDU0NzQ0NzctMzZkOGM3ODQtOTU4OC00MTg2LThiNmEtODc1YzQwNzdjZTFjLm1wND9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA5MTglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwOTE4VDE2NDk0MVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTMwOWYwZWVmMDBjZWRiNzA2MDg1NDFiMTIxNmU3ZmFiZWIwOThjYzRmYmE1OWJiZWNlZjFlNjRlYjA4NTVkYjgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.xbAxdTgxadCVCZPsnZkhx9HnVbjP-D5w1GfPTBatIWQ
Replies
0
Boosts
0
Views
129
Activity
Sep ’25
CALayerInvalidGeometry in AVMobileGlassVolumeControlsView
Good day! Have anyone experienced sudden crashes increase cause by CALayerInvalidGeometry · CALayer position contains NaN: [nan 5] that gets set via -[AVMobileGlassVolumeControlsView layoutSubviews]? 94% of crashes belong to iOS 26.0.1, while rest to 26.0. What's weird, though, is that it is caused by some AVKit internal logic and cant' understand how to track it down, neither how to reproduce. Stack trace looks as follows: 0 CoreFoundation +0xc98c4 ___exceptionPreprocess 1 libobjc.A.dylib +0x317c0 _objc_exception_throw 2 CoreFoundation +0x1548d0 +[NSException raise:format:] 3 QuartzCore +0x909b4 CA::Layer::set_position(CA::Vec2<double> const&, bool) 4 QuartzCore +0x2af294 -[CALayer setPosition:] 5 UIKitCore +0xe9fc18 -[UIView _backing_setPosition:] 6 UIKitCore +0x18f6158 -[UIView setCenter:] 7 UIKitCore +0x1eb704 0x188b5e704 (0x188b5e5f4 + 272) 8 UIKitCore +0x1eb56c 0x188b5e56c (0x188b5e4f0 + 124) 9 UIKitCore +0x18fd318 -[UIView(Geometry) _resizeWithOldSuperviewSize:] 10 CoreFoundation +0x1514c ___NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ 11 CoreFoundation +0xdd18c -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] 12 UIKitCore +0x18fc6dc -[UIView(Geometry) resizeSubviewsWithOldSize:] 13 UIKitCore +0x18fabd0 -[UIView(Geometry) setFrame:] 14 AVKit +0x1b5a88 -[AVMobileGlassVolumeControlsView layoutSubviews] 15 UIKitCore +0x27074 0x18899a074 (0x188999d3c + 824) 16 UIKitCore +0x27b34 0x18899ab34 (0x18899ab14 + 32) 17 UIKitCore +0x190df64 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 18 QuartzCore +0xac9a4 CA::Layer::perform_update_(CA::Layer*, CALayer*, unsigned int, CA::Transaction*) 19 QuartzCore +0x8f2f8 CA::Layer::update_if_needed(CA::Transaction*, unsigned int, unsigned int) 20 UIKitCore +0x57b0 -[UIView(Hierarchy) layoutBelowIfNeeded] 21 AVKit +0x1b6634 ___74-[AVMobileGlassVolumeControlsView _updateVolumeFluidSliderEmphasizedScale]_block_invoke 22 UIKitCore +0x1b3e58 -[UIViewPropertyAnimator _runAnimations] 23 UIKitCore +0x19025f0 +[UIView(Animation) _performWithState:trackingIdentifier:duration:delay:animations:] 24 UIKitCore +0x83a650 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke_4 25 UIKitCore +0x83a460 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke 26 UIKitCore +0x83a210 -[UIViewPropertyAnimator startAnimationAsPaused:] 27 AVKit +0x1b6574 -[AVMobileGlassVolumeControlsView setEmphasized:] 28 AVKit +0x127510 ___64-[AVMobileGlassControlsViewController _animateVolumeEmphasisTo:]_block_invoke 29 UIKitCore +0x1b3e58 -[UIViewPropertyAnimator _runAnimations] 30 UIKitCore +0x83a590 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke_3 31 UIKitCore +0x83a460 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke 32 UIKitCore +0x83a514 ___49-[UIViewPropertyAnimator startAnimationAsPaused:]_block_invoke_2 33 UIKitCore +0x839e60 -[UIViewPropertyAnimator _setupAnimationTracking:] 34 UIKitCore +0x83a260 -[UIViewPropertyAnimator startAnimationAsPaused:] 35 AVKit +0x127480 -[AVMobileGlassControlsViewController _animateVolumeEmphasisTo:] 36 AVKit +0x12ea2c ___56-[AVMobileGlassControlsViewController _observationSetup]_block_invoke_5 37 AVKit +0xcbcd0 ___106-[AVObservationController startObservingNotificationForName:object:notificationCenter:observationHandler:]_block_invoke 38 CoreFoundation +0x519ec ___CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 39 CoreFoundation +0x51ab0 ____CFXRegistrationPost_block_invoke 40 CoreFoundation +0x5190c __CFXRegistrationPost 41 CoreFoundation +0x520ac __CFXNotificationPost 42 Foundation +0x94fc2c -[NSNotificationCenter postNotificationName:object:userInfo:] 43 AVKit +0x1b9bd8 -[AVSystemVolumeController _postNotificationForNameIfFullyInitialized:userInfo:] 44 AVKit +0x1b9dc0 -[AVSystemVolumeController setVolume:shouldShowHUD:] 45 AVKit +0x1b965c ___69-[AVSystemVolumeController _handleSystemVolumeDidChangeNotification:]_block_invoke 46 AVKit +0x1b8da4 -[AVSystemVolumeController _performOnMainThread:] 47 AVKit +0x1b95c0 -[AVSystemVolumeController _handleSystemVolumeDidChangeNotification:] 48 CoreFoundation +0x51a00 ___CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 49 CoreFoundation +0x51ab0 ____CFXRegistrationPost_block_invoke 50 CoreFoundation +0x5190c __CFXRegistrationPost 51 CoreFoundation +0x520ac __CFXNotificationPost 52 Foundation +0x94fc2c -[NSNotificationCenter postNotificationName:object:userInfo:] 53 MediaExperience +0x1039b0 ___76+[AVSystemControllerCommon postNotificationOnMainQueue:notification:object:]_block_invoke 54 MediaExperience +0x6b64 ___MXDispatchAsync_block_invoke 55 libdispatch.dylib +0x1ad8 __dispatch_call_block_and_release 56 libdispatch.dylib +0x1b7e8 __dispatch_client_callout 57 libdispatch.dylib +0x38b20 __dispatch_main_queue_drain.cold.5 58 libdispatch.dylib +0x10ec4 __dispatch_main_queue_drain 59 libdispatch.dylib +0x10e00 __dispatch_main_queue_callback_4CF 60 CoreFoundation +0x6b51c ___CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ 61 CoreFoundation +0x1dd10 ___CFRunLoopRun 62 CoreFoundation +0x1cc40 __CFRunLoopRunSpecificWithOptions 63 GraphicsServices +0x1494 _GSEventRunModal 64 UIKitCore +0xa9dd8 -[UIApplication _run] 65 UIKitCore +0x4eb08 _UIApplicationMain 66 TuneIn Radio +0x1b318 main (main.m:28:22) 67 dyld +0x4e24 start
Replies
0
Boosts
1
Views
250
Activity
Oct ’25
Navigation Bar animation upon Tab change
Hi. Since Xcode 16 and/or iOS 18.0 (I upgraded at the same time), I have an strange effect in the lower (let's say) 20% section of the Navigation Bar when changing to another tab, and this independently if large titles are used or not. Mentioned section is brighter or darker than the rest of the Navigation Bar background, depending on which background tint is used. This effect lasts about 0.3 seconds, but is clearly visible, quite disturbing and new as of Xcode 16 and/or iOS 18.0. I use the code below in AppDelegate to get a gradient coloured Navigation Bar background. let appearance = UINavigationBarAppearance() UINavigationBar.appearance().standardAppearance = appearance UINavigationBar.appearance().compactAppearance = appearance UINavigationBar.appearance().scrollEdgeAppearance = appearance UINavigationBar.appearance().compactScrollEdgeAppearance = appearance If I don't use above code., the background color is filled and without gradient. Subject effect doesn't show in this case. The effect basically looks like when changing tab, the new Navigation Bar background doesn't clear right away, and keeps the background from the previous Navigation Bar for 0.3 seconds before new one Navigation Bar background is rendered. I spent quite some time on changing every possible setting, in code as well as storyboard ... no success so far. Any ideas how to disable this undesired animation?
Replies
1
Boosts
0
Views
789
Activity
Oct ’25
UI freeze during layouting
One of our users reported a very strange bug where our app freezes and eventually crashes on some screen transitions. From different crash logs we could determine that the app freezes up when we call view.layoutIfNeeded() for animating constraint changes. It then gets killed by the watchdog 10 seconds later: Exception Type: EXC_CRASH (SIGKILL) Exception Codes: 0x0000000000000000, 0x0000000000000000 Termination Reason: FRONTBOARD 2343432205 <RBSTerminateContext| domain:10 code:0x8BADF00D explanation:scene-update watchdog transgression: app<bundleID(2A01F261-3554-44C0-B5A9-EBEB446484AD)>:6921 exhausted real (wall clock) time allowance of 10.00 seconds ProcessVisibility: Background ProcessState: Running WatchdogEvent: scene-update WatchdogVisibility: Background WatchdogCPUStatistics: ( "Elapsed total CPU time (seconds): 24.320 (user 18.860, system 5.460), 29% CPU", "Elapsed application CPU time (seconds): 10.630, 12% CPU" ) reportType:CrashLog maxTerminationResistance:Interactive> The crash stack trace looks slightly different, depending on the UI transition that is happening. Here are the two we observed so far. Both are triggered by the layoutIfNeeded() call. Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 CoreAutoLayout 0x1b09f90e4 -[NSISEngine valueForEngineVar:] + 8 1 UIKitCore 0x18f919478 -[_UIViewLayoutEngineRelativeAlignmentRectOriginCache origin] + 372 2 UIKitCore 0x18f918f18 -[UIView _nsis_center:bounds:inEngine:forLayoutGuide:] + 1372 3 UIKitCore 0x18f908e9c -[UIView(Geometry) _applyISEngineLayoutValuesToBoundsOnly:] + 248 4 UIKitCore 0x18f9089e0 -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 148 5 CoreFoundation 0x18d0cd6a4 __NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ + 24 6 CoreFoundation 0x18d0cd584 -[__NSArrayM enumerateObjectsWithOptions:usingBlock:] + 432 7 UIKitCore 0x18f8e62b0 -[UIView(Geometry) resizeSubviewsWithOldSize:] + 128 8 UIKitCore 0x18f977194 -[UIView(AdditionalLayoutSupport) _is_layout] + 124 9 UIKitCore 0x18f976c2c -[UIView _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 800 10 UIKitCore 0x18f903944 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2728 11 QuartzCore 0x18ec15498 CA::Layer::layout_if_needed(CA::Transaction*) + 496 12 UIKitCore 0x18f940c10 -[UIView(Hierarchy) layoutBelowIfNeeded] + 312 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 QuartzCore 0x18ec2cfe0 -[CALayer animationForKey:] + 176 1 UIKitCore 0x18fa5b258 UniqueAnimationKeyForLayer + 192 2 UIKitCore 0x18fa5ab7c __67-[_UIViewAdditiveAnimationAction runActionForKey:object:arguments:]_block_invoke_2 + 468 3 UIKitCore 0x18fa5ba5c -[_UIViewAdditiveAnimationAction runActionForKey:object:arguments:] + 1968 4 QuartzCore 0x18eb9e938 CA::Layer::set_bounds(CA::Rect const&, bool) + 428 5 QuartzCore 0x18eb9e760 -[CALayer setBounds:] + 132 6 UIKitCore 0x18f941770 -[UIView _backing_setBounds:] + 64 7 UIKitCore 0x18f940404 -[UIView(Geometry) setBounds:] + 340 8 UIKitCore 0x18f908f84 -[UIView(Geometry) _applyISEngineLayoutValuesToBoundsOnly:] + 480 9 UIKitCore 0x18f9089e0 -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 148 10 CoreFoundation 0x18d0cd6a4 __NSARRAY_IS_CALLING_OUT_TO_A_BLOCK__ + 24 11 CoreFoundation 0x18d132488 -[__NSSingleObjectArrayI enumerateObjectsWithOptions:usingBlock:] + 92 12 UIKitCore 0x18f8e62b0 -[UIView(Geometry) resizeSubviewsWithOldSize:] + 128 13 UIKitCore 0x18f977194 -[UIView(AdditionalLayoutSupport) _is_layout] + 124 14 UIKitCore 0x18f976c2c -[UIView _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 800 15 UIKitCore 0x18f916258 -[UIView(Hierarchy) layoutSubviews] + 204 16 UIKitCore 0x18f903814 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2424 17 QuartzCore 0x18ec15498 CA::Layer::layout_if_needed(CA::Transaction*) + 496 18 UIKitCore 0x18f940c10 -[UIView(Hierarchy) layoutBelowIfNeeded] + 312 So far, we only know of one iPad Air M1 where this is happening. But we don't know how many users experience this issue without reporting it. Does anyone know what could cause Auto Layout or Core Animation to block in those calls? We have no clue so far...
Replies
1
Boosts
0
Views
208
Activity
Apr ’25
How to obtain frame rate for iOS proMotion devices
Due to the release of ProMotion devices, the system may switch frame rates in certain scenarios, resulting in the loss of reference value for data collected through CADisplayLink callbacks at a fixed 60Hz frame rate. We cannot distinguish whether the slow callback of CADisplayLink is due to a stutter or a system switch in frame rate. I know Hitch Time Ratio, but I can't use this scheme for some reasons. How can I distinguish between stuck and frame rate gear shift in CADisplaylink callback? In iOS 15, CADisplayLink.preferredFrameRateRange.preferred always returns 0, while minimum and maximum do change. Can I use these minimum and maximum range values as criteria to distinguish between frame rate switching and stuttering?
Replies
1
Boosts
0
Views
162
Activity
May ’25
How to calculate smoothness to replicate CALayerCornerCurve.continuous?
iOS 26 added smoothness to CIRoundedRectangleGenerator, for use with CIFilter.roundedRectangleGenerator. What should the smoothness value be to achieve the same corner curve as CALayerCornerCurve.continuous? Does it need to be calculated based on the extent size, if so, how?
Replies
1
Boosts
0
Views
246
Activity
Jun ’25
STextField becomes blurry after layer transform on macOS 26 (Tahoe)
Hi everyone, After upgrading to macOS 26 (Tahoe) I’ve run into an issue: NSTextField becomes noticeably blurry when its parent layer is transformed (CATransform3D or CGAffineTransform). On macOS 15 (Sequoia) the exact same code worked fine — text stayed sharp. Interestingly, an NSImage backed by a PDF representation transforms without any problem and remains perfectly crisp, but labels do not. What I’ve tried so far Checked the contentsScale of the layers Setting magnificationFilter = .nearest Toggled shouldRasterize on/off and adjusted rasterizationScale Have there been any Core Animation or AppKit changes in macOS 26 that affect text rendering when transforming layers? What’s the recommended way now to keep NSTextField text sharp (similar to how vector PDF images behave) when scaling its parent layer? Any insights, best practices, or workarounds would be greatly appreciated. Thanks in advance!
Replies
1
Boosts
0
Views
216
Activity
Sep ’25
Unable to Display NSProgressIndicator on macOS Unlock (First Lock) Screen
I'm Trying to add an NSProgressIndicator on the unlock (first lock screen ) in macOS ( the screen with the lock icon ) I already added a label and it works fine and after entering the password on the second (authentication) page I can able to add ProgressIndicator but not on first screen. But Whenever I try to add a Progress indicator, the entire screen turns Black and nothing is displayed Is NSProgressIndicator supported on the first unlock Screen ? Or does macOS block animated UI on this screen Any Guidance would be helpful Thanks
Replies
1
Boosts
0
Views
145
Activity
Nov ’25
Race conditions when changing CAMetalLayer.drawableSize?
Is the pseudocode below thread-safe? Imagine that the Main thread sets the CAMetalLayer's drawableSize to a new size meanwhile the rendering thread is in the middle of rendering into an existing MTLDrawable which does still have the old size. Is the change of metalLayer.drawableSize thread-safe in the sense that I can present an old MTLDrawable which has a different resolution than the current value of metalLayer.drawableSize? I assume that setting the drawableSize property informs Metal that the next MTLDrawable offered by the CAMetalLayer should have the new size, right? Is it valid to assume that "metalLayer.drawableSize = newSize" and "metalLayer.nextDrawable()" are internally synchronized, so it cannot happen that metalLayer.nextDrawable() would produce e.g. a MTLDrawable with the old width but with the new height (or a completely invalid resolution due to potential race conditions)? func onWindowResized(newSize: CGSize) { // Called on the Main thread metalLayer.drawableSize = newSize } func onVsync(drawable: MTLDrawable) { // Called on a background rendering thread renderer.renderInto(drawable: drawable) }
Replies
1
Boosts
1
Views
532
Activity
Dec ’25
Smooth appearance switching
Hello every developers. I need your help. Do you know how to attach animation to appearance, like a smooth transition from dark to light and vise versa. My code here: @main struct The_Library_of_BabelonApp: App { @AppStorage("selectedAppearance") private var selectedAppearance = 0 @StateObject private var router = AppRouter() var scheme: ColorScheme? { if selectedAppearance == 1 { return .light } if selectedAppearance == 2 { return .dark } return nil } var body: some Scene { WindowGroup { RootView() .preferredColorScheme(scheme) .environmentObject(router) // this is doesn't work correctly .animation(.smooth(duration: 2), value: selectedAppearance) } } } And my appearance switching looks: struct SettingsView: View { @AppStorage("selectedAppearance") private var selectedAppearance = 0 var body: some View { List { Section(header: Text("Appearance")) { HStack(spacing: 20) { ThemePreview(title: "Light", imageName: "lightTheme", tag: 1, selection: $selectedAppearance) ThemePreview(title: "Dark", imageName: "darkTheme", tag: 2, selection: $selectedAppearance) ThemePreview(title: "System", imageName: "systemMode", tag: 0, selection: $selectedAppearance) } .padding(.vertical, 10) .frame(maxWidth: .infinity) } } } } struct ThemePreview: View { let title: String let imageName: String let tag: Int @Binding var selection: Int var body: some View { Button { selection = tag } label: { VStack { Image(imageName) .resizable() .aspectRatio(contentMode: .fill) .frame(width: 120, height: 80) .clipShape(RoundedRectangle(cornerRadius: 12)) .overlay( RoundedRectangle(cornerRadius: 12) .stroke(selection == tag ? Color.blue : Color.clear, lineWidth: 3) ) Text(title) .font(.caption) .foregroundColor(selection == tag ? .blue : .primary) } } .buttonStyle(.plain) } } I guess my code works but animation working another way, its turn my Section, I don't know.... Thank you in advance
Replies
1
Boosts
0
Views
78
Activity
Feb ’26
Converting a Stop Motion Animation to usdz
Hello everyone, I've been trying for a few weeks now to convert a sequential series of meshes into a stop-motion animation in USDZ format. In Unreal Engine, I’ve already figured out how to transform the sequential series of individual meshes into a smooth animation using the node system and arrays. Unfortunately, the node system cannot be exported as a usdz animation logic in either Unreal or Blender. Because of this, I have tried several other methods to incorporate the animation logic. Here’s what I’ve tried so far: I attempted to create the animation in Blender with Render-/Viewports and mapping it to keyframes. However, in my experience, Viewports are not supported in the conversion. I tried aligning the vertices of individual objects and merging the frames using the Shrinkwrap modifier in Blender, then setting up a morph animation with keyframes. However, because the individual meshes are too different, this results in artifacts, and manually editing each mesh is too difficult for me to handle. I placed all individual meshes at the same position and animated them sequentially by scaling them from 0 to 100 in keyframes (Frame 1 is visible for 10 frames, then scales down at frame 11, while Frame 2 becomes visible at frame 11, and so on). I also adjusted the keyframes so that the scaling happens in a "constant" manner rather than the default Bezier or linear interpolation. I then converted this animation to .abc, and the result initially looked good. However, some information is lost when converting it with OpenUSD. The animation does not maintain its intended jump-like behavior in USDZ format, and instead, the scaling of individual files is visible in the animation. I tried using a Blender add-on (StepMotion), which allows the animation to be exported as .abc, but it can only be read in Blender or Unreal. Even in the preview, the animation is not displayed correctly, so converting the animation logic does not work either. 
Unfortunately, I have no alternative way to create the animation, as the individual frames have been provided to me as meshes. So far, I haven’t found a way to implement this successfully. I would be very grateful for any tips or ideas, as I am running out of options on how to make this work. Thanks in advance!
Replies
2
Boosts
0
Views
275
Activity
Apr ’25
SwiftUI Transaction completion handler is being called unexpectedly
Unexpected SwiftUI Transaction Behavior This minimal example demonstrates an unexpected behavior in SwiftUI's Transaction API: var transaction = Transaction(animation: .none) transaction.addAnimationCompletion { print("This should not be called!") } The Issue The completion handler is called immediately after creation, even though the transaction was never used in any SwiftUI animation context (like withTransaction or other animation-related APIs). Expected vs Actual Behavior Expected: The completion handler should only be called after the transaction is actually used in a SwiftUI animation. Actual: The completion handler is called right after creation, regardless of whether the transaction is used or not. Current Workaround To avoid this, I'm forced to implement defensive programming: only creating transactions with completion handlers at the exact moment they're going to be used. This adds unnecessary complexity and goes against the intuitive usage of the Transactions API.
Replies
2
Boosts
0
Views
138
Activity
Jun ’25
Animation Ghosting with animation-timeline on 120HZ ProMotion Devices
On iOS Devices with ProMotion (120HZ) if you animate Elements on your Page with animation-timeline you get Ghosting Effects. You can not see the Ghosting with a Simulator or on Screenshots, only on real Devices. To Reproduce I made a Minimal Example: https://codesandbox.io/p/sandbox/120hztest-xrwgtc When you scroll quickly on the Page with an iOS 120HZ Device (https://en.wikipedia.org/wiki/List_of_smartphones_with_a_high_refresh_rate_display) you will see ghosting on the Top of the right Element (animation-timeline) and no ghosting on the other animated Element. (I edited the Screenshot, to Illustrate how the Effect looks like, since it is only visible on the real Display)
Replies
2
Boosts
0
Views
248
Activity
Jan ’26
Animation Help
Hello, I am trying to use matchedGeometryEffect to animate between an item in a list view and the item's detail view. Right now, I am getting an unwanted cross-fade animation as the view transitions. So the list item moves into place as it should with the modifier, but it fades out as its detail version fades in, which I do not want. I do not want any fading at all, just the movement from one component to the other. How do I stop this? Thanks.
Replies
2
Boosts
0
Views
81
Activity
Jan ’26
CATiledLayer flashes and re-draws entirely when re-drawing a single tile
I have filed a bug report for this (FB17734946), but I'm posting it here verbatim in case others have the same issue and in hopes of getting attention from an Apple engineer sooner. When calling setNeedsDisplayInRect on a CATiledLayer - or a UIView whose backing layer is CATiledLayer - one would expect to re-draw only a region identified by the rect passed to the method. This is even written in the documentation for the class: "Regions of the layer may be invalidated using the setNeedsDisplayInRect: method however the update will be asynchronous. While the next display update will most likely not contain the updated content, a future update will." However, upon calling this method, CATiledLayer redraws whole contents instead of just the tile at the specified rect, and it flashes when doing so. It behaves exactly the same as if one had called setNeedsDisplay without passing any rect; all contents are cleared and re-drawn again. I'm 100% sure I've passed in the correct rect of the exact tile that I need to redraw. I have even tried passing much smaller rects, but still the same. (And yes, the rect I've passed accounts for the current level of detail.) I have found this GitHub repo https://github.com/frankus/NetPhotoScroller, which based on discussion from here https://forums.macrumors.com/threads/catiledlayer-blanks-out-tiles-when-redrawing.1333948/ aims at solving these issues by using two private methods on CATiledLayer class: (void)setNeedsDisplayInRect:(CGRect)r levelOfDetail:(int)level; (BOOL)canDrawRect:(CGRect)rect levelOfDetail:(int)level; I have explored the repo in detail, however I wasn't able to test exactly this code from the GitHub repo. I have tried using those two private methods myself (through an Objective-C class that defines the methods in the header file and then a swift class which inherits it), but I couldn't solve the issue; the flashing and the full re-draw is still there. After doing a lot of research, the conclusion seems to be that one cannot use CATiledLayer with contents that are downloaded remotely, on demand, as tiles are being requested. I have, however, found one interesting thing which seems to work so far: before calling setNeedsDisplayInRect (or just setNeedsDisplay, as they behave the same for CATiledLayer in my testing), cache the current layer's contents, and after calling setNeedsDisplay (or setNeedsDisplayInRect), restore the contents back to the layer. This prevents flashing and preserves any tiles that were drawn at the time of the re-draw. let c = tiledLayer.contents tiledLayer.setNeedsDisplay(tileRect) tiledLayer.contents = c However! Docs clearly state the warning: Do not attempt to directly modify the contents property of a CATiledLayer object. Doing so disables the ability of a tiled layer to asynchronously provide tiled content, effectively turning the layer into a regular CALayer object. I believe this message implies modifying the contents property with some raw content, like image data, and that it may be safe to re-apply the existing contents (which are in my testing of type CAImageProvider) -- but I can't rely on an implementation detail in my production app. I have tested this and confirmed that the bug appears on: iPhone 14 Pro, iOS 18.5 iPhone 13 Pro, iOS 17.5.1 iPhone 5s, iOS 15.8.3 iPad Pro 1st gen, iPadOS 18.4.1 a couple simulator versions I can also confirm that the fix (to re-apply contents property) is also working properly on all these versions. Is this expected behavior, that tiled layer redraws itself entirely instead of redrawing specific tiles? Is it safe to modify contents of a CATiledLayer by re-applying the existing contents? If not, is there an alternative to avoid flashing?
Replies
3
Boosts
0
Views
200
Activity
May ’25
Why does CADisplayLink of an external UIScreen drift in time?
I am using Apple's original Lightning Digital AV-adapter (Lightning-to-HDMI dongle) to connect my iPhone to an external display via a HDMI cable. I need to synchronize rendering with the external display's refresh rate, so I create a new CADisplayLink tied to the external display's UIScreen: UIScreen.screens[externalDisplayIdx].displayLink(withTarget:, selector:). The callback is being called regularly, but with increasing delay relative to the CADisplayLink.timestamp, so the next time the callback is called, I have less and less time to draw the next frame (see the snippet below). Assuming 60 FPS, the value of secondsTillDeadline starts at an arbitrary value in the range of approx -0.0001 to 0.0166667, and then it slowly decreases towards zero (and for a brief period it goes into small negative numbers). Once it reaches zero, it flips back to 0.0166667 and continues to decrease again. This cycle repeats indefinitely. Changing the external display's resolution (UIScreen's mode) or the CADisplayLink's preferredFrameRateRange to a lower FPS does not seem to have any effect on the temporal drifting (even the rate of change seem to be the same). When I create a new CADisplayLink for the iPhone's main screen, the value of secondsTillDeadline is stable, it does not drift and it is very close to 0.0166667, as expected. Is this drift caused by the external monitor or by Apple's Lightning-to-HDMI dongle ...or is the problem somewhere else? Can the drifting be stopped? func onDisplayLinkUpdate(displayLink: CADisplayLink) { // Gradually decreases from 0.01667 to -0.0001, then flips back to 0.01667 and continues to decrease let secondsTillDeadline = displayLink.targetTimestamp - CACurrentMediaTime() }
Replies
3
Boosts
0
Views
470
Activity
Aug ’25