SwiftUI - Get size of child?

前端 未结 4 1153
死守一世寂寞
死守一世寂寞 2020-12-15 08:32

Is there any way to get the size of a child view in SwiftUI?

I\'m basically looking to do the UIKit equivalent of:



        
4条回答
  •  猫巷女王i
    2020-12-15 09:24

    Updated and generalized @arsenius code. Now you can easily bind a parent view's state variable.

    struct ChildSizeReader: View {
        @Binding var size: CGSize
        let content: () -> Content
        var body: some View {
            ZStack {
                content()
                    .background(
                        GeometryReader { proxy in
                            Color.clear
                                .preference(key: SizePreferenceKey.self, value: proxy.size)
                        }
                    )
            }
            .onPreferenceChange(SizePreferenceKey.self) { preferences in
                self.size = preferences
            }
        }
    }
    
    struct SizePreferenceKey: PreferenceKey {
        typealias Value = CGSize
        static var defaultValue: Value = .zero
    
        static func reduce(value _: inout Value, nextValue: () -> Value) {
            _ = nextValue()
        }
    }
    

    Usage:

    struct ChildSizeReaderExample: View {
        @State var textSize: CGSize = .zero
        var body: some View {
            VStack {
                ChildSizeReader(size: $textSize) {
                    Text("Hello I am some arbitrary text.")
                }
                Text("My size is \(textSize.debugDescription)!")
            }
        }
    }
    

提交回复
热议问题