Fix sheet getting set to previous height on rapid content changes

The KVO callback was calling updateLayout(), which has two problems for
content-driven updates:

1. The prevLayoutDetentIdentifier guard can block updates. When
   updateDetents triggers animateChanges, the delegate callback
   sheetPresentationControllerDidChangeSelectedDetentIdentifier fires
   and updates selectedDetentIdentifier to the system-assigned custom
   detent identifier. On the next KVO callback, prevLayoutDetentIdentifier
   (.medium) no longer matches selectedDetentIdentifier, so the update
   is silently dropped.

2. Re-reading frame.size.height from the view hierarchy instead of using
   the observed bounds can return a stale value during rapid layout passes.

Fix: have the KVO callback call updateDetents directly with the observed
height, bypassing both the guard and the frame re-read. The guard in
updateLayout() is preserved for the manual/fallback code path.

https://claude.ai/code/session_01Rp7ef1h3fKh6fhStcjqLJ5
This commit is contained in:
Claude
2026-03-01 07:26:52 +00:00
committed by Samuel Newman
parent eab139d51f
commit 421c4abd02
+6 -1
View File
@@ -162,6 +162,9 @@ class SheetView: ExpoView, UISheetPresentationControllerDelegate {
// Observe the content view's bounds via KVO so that height changes are detected
// purely on the native side, without a JS bridge round-trip through onLayout.
// Calls updateDetents directly with the observed height rather than going through
// updateLayout(), which has a prevLayoutDetentIdentifier guard that can block
// legitimate content-driven updates when detent identifiers drift during animations.
private func startObservingContentHeight() {
self.contentHeightObservation?.invalidate()
@@ -177,7 +180,9 @@ class SheetView: ExpoView, UISheetPresentationControllerDelegate {
let newBounds = change.newValue,
oldBounds.height != newBounds.height,
newBounds.height > 0 else { return }
self.updateLayout()
let clampedHeight = self.clampHeight(newBounds.height)
self.sheetVc?.updateDetents(contentHeight: clampedHeight, preventExpansion: self.preventExpansion)
self.selectedDetentIdentifier = self.sheetVc?.getCurrentDetentIdentifier()
}
}