관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 상대 좌표 frame 구하는 방법 convert(_:to:), window 기준 프레임 구하는 방법 (#relative frame) 본문

iOS 응용 (swift)

[iOS - swift] 상대 좌표 frame 구하는 방법 convert(_:to:), window 기준 프레임 구하는 방법 (#relative frame)

jake-kim 2023. 10. 14. 01:52

convert(_:to:) 메소드

  • UIView의 확장으로 정의
  • 인수로 입력한 view를 기준으로 point의 좌표를 구하는 것

  • 중요한 팁) view에 nil을 전달하면 window를 기준으로 상대좌표를 구하므로, 절대좌표 획득이 가능

상대좌표 예시

  • 뷰 3개를 겹쳐놓고 각 뷰의 상대좌표를 출력해보는 예시

  • 빨강 - 초록 - 파랑을 순서대로 aView, bView, cView라고 정의
    • 크기가 정해진 타이밍 viewDidAppear에서 비교
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    print("== original frame ==")
    print("aView = ", aView.frame)
    print("bView = ", bView.frame)
    print("cView = ", cView.frame)
    
    print("\n\n")
    
    print("== relative frame ==")
    print("aView = ", aView.convert(aView.frame, to: nil))
    print("bView = ", bView.convert(bView.frame, to: nil))
    print("cView = ", cView.convert(cView.frame, to: nil))
}
  • 예상대로 relative frame은 superview기준이 아닌 window 기준으로 상대좌표를 계산
== original frame ==
aView =  (46.66666666666666, 276.0, 300.0, 300.0)
bView =  (75.0, 75.0, 150.0, 150.0)
cView =  (39.999999999999986, 40.0, 70.0, 70.0)



== relative frame ==
aView =  (93.33333333333331, 552.0, 299.99999999999994, 300.0)
bView =  (196.66666666666666, 426.0, 149.99999999999997, 150.0)
cView =  (201.66666666666663, 431.0, 70.0, 70.0)

cf) bounds와 구분하기 - bounds는 자기 자신의 뷰 기준이기 때문에 x, y좌표는 모두 0

print("== bounds ==")
print("aView = ", aView.bounds)
print("bView = ", bView.bounds)
print("cView = ", cView.bounds)

== bounds ==
aView =  (0.0, 0.0, 300.0, 300.0)
bView =  (0.0, 0.0, 150.0, 150.0)
cView =  (0.0, 0.0, 70.0, 70.0)

* 전체 코드: https://github.com/JK0369/ExRelativeCoordinate 

 

* 응용) convert(_:to:)를 이용하여 특정 뷰가 현재 화면에 보이는지 확인하는 방법: https://ios-development.tistory.com/1528

70UIlabel이 노출될때 이벤트 캐치하여 "보이는중"로 표시

* 참고

https://developer.apple.com/documentation/uikit/uiview/1622442-convert

Comments