이전 글에서도 그렇고,
뷰의 사이즈를 알고 싶을 때 GeometryReader를 사용하는데, GeometryReader 내부에 뷰를 그리고 싶지는 않을 때
아래와 같은 방식으로 background에 GeometryReader를 넣어 구현함.
struct FramePractice: View {
@State var size: CGSize = .zero
var body: some View {
Text("Size: \(size.debugDescription)")
.padding()
.background(Color.orange)
.background( // padding된 Text 뷰의 크기를 알기 위한 방법
GeometryReader { geometry in
Color.clear
.onAppear {
self.size = geometry.size
}
})
}
}
해당 코드를 sizeState라는 viewModifier로 작성.
extension View {
func sizeState(size: Binding<CGSize>) -> some View {
self.modifier(SizeState(size: size))
}
}
struct SizeState: ViewModifier {
@Binding var size: CGSize
func body(content: Content) -> some View {
return content
.background(
GeometryReader { geometry in
Color.clear
.onAppear {
size = geometry.size
}
}
)
}
}
이제 크기를 알고 싶은 뷰에 sizeState viewModifier로 @state로 CGSize를 넣어주면 알 수 있음.
struct FramePractice: View {
@State var size: CGSize = .zero
var body: some View {
Text("Size: \(size.debugDescription)")
.padding()
.background(Color.orange)
.sizeState(size: $size) // 사이즈를 알 수 있음.
}
}