From 396c66bc1d97406767a40ffd476fa35e181047b0 Mon Sep 17 00:00:00 2001 From: Dark-detsixE Date: Tue, 27 Jan 2026 00:02:33 +0800 Subject: [PATCH 1/2] Fix InsetViewLayout.childGeometry --- .../Modifier/InsetViewModifierUITests.swift | 23 +++++++++++++++++++ .../Layout/Modifier/InsetViewModifier.swift | 13 ++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/Example/OpenSwiftUIUITests/Layout/Modifier/InsetViewModifierUITests.swift b/Example/OpenSwiftUIUITests/Layout/Modifier/InsetViewModifierUITests.swift index 19a86958b..403e6bc0f 100644 --- a/Example/OpenSwiftUIUITests/Layout/Modifier/InsetViewModifierUITests.swift +++ b/Example/OpenSwiftUIUITests/Layout/Modifier/InsetViewModifierUITests.swift @@ -7,6 +7,7 @@ import Testing @MainActor @Suite(.snapshots(record: .never, diffTool: diffTool)) struct InsetViewModifierUITests { + @Test(.bug("https://github.com/OpenSwiftUIProject/OpenSwiftUI/issues/511")) func safeAreaPaddingWithEdgeInsets() { struct ContentView: View { @@ -17,4 +18,26 @@ struct InsetViewModifierUITests { } openSwiftUIAssertSnapshot(of: ContentView()) } + + @Test + func safeAreaInset() { + struct ContentView: View { + var body: some View { + Color.red + .safeAreaInset(edge: .leading) { + Color.green.frame(width: 10) + } + .safeAreaInset(edge: .top) { + Color.blue.frame(height: 20) + } + .safeAreaInset(edge: .trailing) { + Color.gray.frame(width: 30) + } + .safeAreaInset(edge: .bottom) { + Color.yellow.frame(height: 40) + } + } + } + openSwiftUIAssertSnapshot(of: ContentView()) + } } diff --git a/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift b/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift index 3a17a241c..a4f85f693 100644 --- a/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift +++ b/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift @@ -541,18 +541,19 @@ private struct InsetViewLayout { id: alignmentKeyID, axis: secondaryAxis) ] - let position = (primaryPlacement.anchorPosition[secondaryAxis] + primaryAlignmentValue) - (secondaryAlignmentValue + .zero) + var primaryGeometry = ViewGeometry( + placement: primaryPlacement, + dimensions: primaryDimensions + ) + + let position = (primaryGeometry.origin[secondaryAxis] + primaryAlignmentValue) - (secondaryAlignmentValue + .zero) + let secondaryAnchor = UnitPoint(edge: props.edge) let secondaryPlacement = _Placement( proposedSize: secondaryProposal, aligning: secondaryAnchor, in: parentSize.value ) - - var primaryGeometry = ViewGeometry( - placement: primaryPlacement, - dimensions: primaryDimensions - ) var secondaryGeometry = ViewGeometry( placement: secondaryPlacement, dimensions: secondaryDimensions From 1ce5c7be5fcfa645000664dd0a8a4e3c69dd371b Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 1 Feb 2026 17:06:33 +0800 Subject: [PATCH 2/2] Add InsetViewModifierExample --- Example/SharedExample/ContentView.swift | 7 +---- .../Modifier/InsetViewModifierExample.swift | 27 +++++++++++++++++++ .../Layout/Modifier/InsetViewModifier.swift | 13 ++++----- 3 files changed, 33 insertions(+), 14 deletions(-) create mode 100644 Example/SharedExample/Layout/Modifier/InsetViewModifierExample.swift diff --git a/Example/SharedExample/ContentView.swift b/Example/SharedExample/ContentView.swift index 86bcd8c7d..e1923f85d 100644 --- a/Example/SharedExample/ContentView.swift +++ b/Example/SharedExample/ContentView.swift @@ -14,11 +14,6 @@ import Foundation struct ContentView: View { var body: some View { - Color.blue - .frame(width: 80, height: 60) - .scaleEffect(0.5) - .background { Color.red } - .frame(width: 10, height: 10) - .clipped() + InsetViewModifierExample() } } diff --git a/Example/SharedExample/Layout/Modifier/InsetViewModifierExample.swift b/Example/SharedExample/Layout/Modifier/InsetViewModifierExample.swift new file mode 100644 index 000000000..802516827 --- /dev/null +++ b/Example/SharedExample/Layout/Modifier/InsetViewModifierExample.swift @@ -0,0 +1,27 @@ +// +// InsetViewModifierExample.swift +// SharedExample + +#if OPENSWIFTUI +import OpenSwiftUI +#else +import SwiftUI +#endif + +struct InsetViewModifierExample: View { + var body: some View { + Color.red + .safeAreaInset(edge: .leading) { + Color.green.frame(width: 10) + } + .safeAreaInset(edge: .top) { + Color.blue.frame(height: 20) + } + .safeAreaInset(edge: .trailing) { + Color.gray.frame(width: 30) + } + .safeAreaInset(edge: .bottom) { + Color.yellow.frame(height: 40) + } + } +} diff --git a/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift b/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift index a4f85f693..5173de25a 100644 --- a/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift +++ b/Sources/OpenSwiftUICore/Layout/Modifier/InsetViewModifier.swift @@ -541,24 +541,21 @@ private struct InsetViewLayout { id: alignmentKeyID, axis: secondaryAxis) ] - var primaryGeometry = ViewGeometry( - placement: primaryPlacement, - dimensions: primaryDimensions - ) - - let position = (primaryGeometry.origin[secondaryAxis] + primaryAlignmentValue) - (secondaryAlignmentValue + .zero) - let secondaryAnchor = UnitPoint(edge: props.edge) let secondaryPlacement = _Placement( proposedSize: secondaryProposal, aligning: secondaryAnchor, in: parentSize.value ) + var primaryGeometry = ViewGeometry( + placement: primaryPlacement, + dimensions: primaryDimensions + ) var secondaryGeometry = ViewGeometry( placement: secondaryPlacement, dimensions: secondaryDimensions ) - secondaryGeometry.origin[secondaryAxis] = position + secondaryGeometry.origin[secondaryAxis] = primaryGeometry.origin[secondaryAxis] + (primaryAlignmentValue - secondaryAlignmentValue) primaryGeometry.finalizeLayoutDirection( layoutDirection,