From the code below, I can't figure out why Preference key is not read from the view put in background of HStack. Strangely, If I put that BGViewSetter to the Text Views inside ForEach loop, it works. Unless I have ommitted something too obvious, it looks like a bug. Anybody can confirm it? Thanks
xcode12.2
ios 14.2
Code Block struct BGViewSetter: View { var body: some View { GeometryReader { geometry in RoundedRectangle(cornerRadius: 25.0) .fill(Color.init(#colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1))) .preference(key: TestRectPreferenceKey.self, value: TestRectPreference(frame: geometry.frame(in: .global))) } } } struct FinalView : View { @State var offsetX : CGFloat = .zero @State var info = "" @State var size : CGFloat = .zero var body: some View { VStack { Text("FinalView : \(info)") HStack { ForEach( 1 ..< 10) { i in Text("\(i)") .frame(width: 100) .opacity(0.8) } } .background(BGViewSetter()) .animation(.easeOut) .gesture( DragGesture() .onChanged { gesture in self.offsetX = gesture.translation.width } .onEnded { _ in self.offsetX = .zero } ) .offset(x: self.offsetX) Text("Footer") Divider() Spacer() } .onPreferenceChange(TestRectPreferenceKey.self) { self.size = $0.frame.height self.info = "Pref Chng : \(self.size)" } } } struct PreferenceKeyTest_Previews: PreviewProvider { static var previews: some View { FinalView() } }