화면을 구성하거나 로직을 작성하다보면 동적으로 변하는 view의 크기를 구해야한 경우가 생긴다.
안드로이드나 스토리보드에서는 비교적 쉽게 해당 view의 크기를 구할수 있었지만
SwiftUI에서는 view의 크기를 구하는 방법이 잘 알려져 있지 않고 SwiftUI 특성상 별로 권장하지 않는다.
하지만 꼭 필요한 경우 view의 크기를 동적으로 가져올수 있는 방법이 있다.
그건 바로
sizePreferenceKey 를 이용한 방법인데
PreferenceKey란?
https://developer.apple.com/documentation/swiftui/preferencekey
하지만 이해가 어렵다면 간단하게 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 로 변경해주시면 됩니다!
이상 모두들 즐코딩하세요!
'SwiftUI' 카테고리의 다른 글
앱스토어 등록시 전화 번호 : 유효하지 않은 필드입니다. (7) | 2021.01.26 |
---|---|
Geometryreader란? Geometryreader 사용하기 (0) | 2021.01.20 |
5392b68f539b489193e4508c39687898 (0) | 2020.12.27 |
SwiftUI 카카오 로그인 사용하기 (0) | 2020.12.24 |
SwiftUI 란? 무엇인가 (개발하면서 느낀점 위주) (2) | 2020.12.24 |