SwiftUI
SwiftUI view의 크기 (높이,넓이) 구해보자!!
코딩하는렝가
2020. 12. 26. 19:20
화면을 구성하거나 로직을 작성하다보면 동적으로 변하는 view의 크기를 구해야한 경우가 생긴다.
안드로이드나 스토리보드에서는 비교적 쉽게 해당 view의 크기를 구할수 있었지만
SwiftUI에서는 view의 크기를 구하는 방법이 잘 알려져 있지 않고 SwiftUI 특성상 별로 권장하지 않는다.
하지만 꼭 필요한 경우 view의 크기를 동적으로 가져올수 있는 방법이 있다.
그건 바로
sizePreferenceKey 를 이용한 방법인데
PreferenceKey란?
https://developer.apple.com/documentation/swiftui/preferencekey
Apple Developer Documentation
developer.apple.com
하지만 이해가 어렵다면 간단하게 view의 크기를 담을수 있는 변수? 정도라고만 생각하면된다.
그러면 바로 코딩으로 구현해보자
우선 위에서 말한 화면의 크기를 담을 변수를 하나 선언한다.
//View의 크기를 알기위해 사용하는 변수
struct sizePreferenceKey: PreferenceKey{
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {}
}
//사용하는 메인뷰의 높이를 구하기위해 사용하는 변수
@State var heigtVStackMain : CGFloat = 0
var body: some View {
//내가 구할려고하는 view를 감싸는 GeometryReader 를 선언을 해준다.
GeometryReader{ g in
VStack(spacing : 0){
Image("1")
.resizable()
.frame(width: UIScreen.main.bounds.width, height: 500)
Image("1")
.resizable()
.frame(width: UIScreen.main.bounds.width, height: 500)
Image("1")
.resizable()
.frame(width: UIScreen.main.bounds.width, height: 500)
}
.background(
//SwiftUI 에서는 각 뷰의 크기를 구하는것이 함수화 되어있지않다 그래서 살짝 꼼수를 사용해야하는데
//내가 상단으로 인지하고싶은 부분에 투명한 색상의 배경을 하나 선언을 해주고
//선언한 투명한 배경의 크기를 구한다.
//그때 필요한것이 바로 sizePreferenceKey
GeometryReader { proxy in
Color.clear
.preference(key: sizePreferenceKey.self, value: proxy.size)
}
)
//SizePreferenceKey.self 값이 변경될때마다 실행되는 트리거를 실행하고
//이렇게 구한 화면의 크기를 heigtVStackMain 변수에 넣어준다.
.onPreferenceChange(sizePreferenceKey.self){ newSize in
self.heigtVStackMain = newSize.height
print("높이 : \(self.heigtVStackMain)")
}
}
}
자세한 설명은 주석을 통해 달아 놨습니다
이렇게 해당파일을 실행하게된다면!!
이렇게 view의 높이가 구해진것을 확인 할 수 있습니다.
만약 view width 를 알 고 싶다면
self.heigtVStackMain = newSize.height 에서 height 를 width 로 변경해주시면 됩니다!
이상 모두들 즐코딩하세요!