[iOS 응용 프로그램 개발] View 좌표와 사이즈에 대한 팁 얻기

10322 단어 SwiftiOS
iOS 응용 프로그램 개발에서 View를 조작하는 코드를 쓸 때 다양한 용어가 등장한다.
frame, bounds, width, height, origin, center, x, y……
나는 분위기에서 오랫동안 사용했지만, 분위기에서는 여전히 매우 나쁘다
View 좌표와 사이즈를 얻는 비결을 정리하고 싶습니다.

원래 iOS 응용 프로그램의 좌표계



다른 화면 개발은 어떻게 하는지 모르겠지만 iOS 응용 프로그램은 왼쪽을 원점(0,0)으로 합니다.
x축에 관해서는 오른쪽으로 갈수록 바르고, y축에 관해서는 아래로 갈수록 바르다.

프레임과bounds의 차이



프레임:superview 좌표계의 위치와 크기
bounds: 좌표계에서 자신의 위치와 크기를 표시합니다.
모두 CGRect 타입입니다.

핵심 도면 정보


CG 타입이 많지만 Core Graphics라는 라이브러리입니다.
iOS 단말기의 화면을 그리기 위한 라이브러리입니다. 자세히 알고 싶으면 아래를 보십시오.

CGRect


직사각형 클래스 그리기
예제
let rect = CGRect(x: 0, y: 0, width: 100, height: 100

CGPoint


좌표계의 임의의 지점
예제
let point = CGPoint(x: 50, y: 50)

CGFloat


소수점을 나타내는 클래스.
View 주위를 처리할 때 이런 유형으로 지정해야 할 때가 있습니다.

그냥 Float랑 뭐가 달라요?


32비트 CPU는 Float, 64비트 CPU는 Double로 표현되는 특징이 있습니다.
사실 무서운 CGFloat.

origin


CGRect 객체 원점의 속성을 나타냅니다.
사각형의 왼쪽 상단에 있는 좌표를 되돌려줍니다.
참고 사항으로 AddSubview에서 루트View를 제외한 경우
자신의 부모 보기를 좌표(0,0)로 출력하기 때문에 때때로 화면의 좌표계와 다르다.
반환된 값이 CGPoint 유형이므로 (x, y) 형식으로 반환됩니다.
origin.x/y로 설정하고 그 중 하나만 가져옵니다.

size


CGRect 객체의 치수를 나타내는 속성입니다.
(width,height) 형식으로 되돌아옵니다.
size.width/height로 설정하고 그 중 하나만 가져옵니다.

터미널 크기


아이폰5S 정도는 평화롭지만 6 이후 화면 사이즈 변경 상황
개발자 입장에서 보면 대단하다.
iPhone 화면 크기 미리 보기 표(부도)
이쪽 봐.
소스 코드에 지정된 단위는 점입니다.

점, 픽셀 및 인치


단말기의 단위가 혼란스럽다는 표시가 많으니 정리해 보세요.
점: 논리적 드로잉 단위
픽셀: 화면으로 내보내는 단위
인치: 화면의 기울어진 부분의 길이를 표시합니다.
한 마디로 화면의 사이즈감을 전달하기 때문에 사양을 소개할 때 많이 사용된다.
개발할 때 고려하는 단위는 포인트만 있으면 된다.
픽셀은 이미지 편집 응용 프로그램에서 장치 화면의 크기와 제작된 아이콘의 크기를 고려한 측정 단위입니다.점은 화면상의 묘사 영역의 사이즈를 연구할 때 사용하는 측정 단위를 가리킨다.
표준 해상도 장치의 화면에서는 한 점이 픽셀에 대응하지만 다른 해상도의 대응 비율은 다를 수 있습니다.예를 들어, Retina 모니터에서는 점 하나가 픽셀 두 개에 해당합니다.
http://miblog.guruguruheadslab.com/archives/57

다양한 좌표 크기의 코드 가져오기


여기까지는 기초 지식입니다.
여기서부터 실제 사이즈, 좌표를 얻을 수 있는 편리한 코드를 쓰세요.

루트 뷰 좌표 크기


댓글의 숫자는 iPhoneSE 크기로 디버깅된 경우입니다.
루트 뷰
self.view.frame.minY //0
self.view.frame.midY //284.0
self.view.frame.maxY //568.0
self.view.frame.minX //0
self.view.frame.midX //160
self.view.frame.maxX //320

tabBar/navigationBar의 좌표 크기


루트 뷰
//tabBar/navigationBarがある場合
self.tabBarController?.tabBar.frame.height //49pt
self.navigationController?.navigationBar.frame.height //44pt

//tabBar/navigationBarがないが、値が欲しいとき
//(そんなときあるかわからないが、最初上を知らなくて、これで強引にやったため)
UITabBarController.init().tabBar.frame.height //49pt
UINavigationController.init().navigationBar.frame.height //44pt

//tabBar/navigationBarの上辺が欲しいとき
self.tabBarController?.tabBar.frame.origin.y //519pt
self.navigationController?.navigationBar.frame.origin.y //20pt

보안 영역 가져오기


iOS11 이상(단말기라면 아이폰8 이후는 iOS11 이후일 것)에는 SafeArea라는 개념이 있다.
그 사이즈도 얻을 수 있어요.
safeArea
if #available(iOS 11.0, *) {
            self.view.safeAreaInsets.top //44pt
            self.view.safeAreaInsets.right //0
            self.view.safeAreaInsets.left //0
            self.view.safeAreaInsets.bottom //34pt
        } 
iOS11까지는 불가능하기 때문에 고정치만... 그렇게 생각하지만 실제로는 StatusBar의 높이로 찾을 수 있습니다.
StatusBar
UIApplication.shared.statusBarFrame.size.height //20pt

터미널 화면 크기

UIScreen.mainScreen().bounds

"bounds.origin은 일반적으로 (0,0)"?


'프레임과bounds의 차이'에서 쓴 바와 같이bounds는 사각형 경계를 나타내는 대상이기 때문에 원래 좌표 정보가 없다.
그래서 bounds.origin을 가져오면 (0,0) 로 돌아갑니다.
하지만 나는 오늘 bounds의 y치가 마이너스인 상황을 만나 고통을 겪었다.
UITableView의 bounds오리진을 가져올 때 발생했습니다.
뜻밖에도 (0, -64)이 돌아왔다!
64pt라는 숫자는 찾아보면 알 수 있다.
제가 디버깅한 단말기는 아이폰5입니다.
SafeArea(또는 statusBar)는 20pt, NavigationBar는 44pt가 있습니다.
아마도 이 64pt분의 원점이 왜곡되었을 것이다.
여기서부터 추측론이에요.
UITableView는 UIScrollView를 계승하여 좌표계를 조정할 수 있는 반이다.
아마도 SafeArea+NavigationBar의 64pt 편차로 인해 다음과 같은 영향을 미칠 것이다
  • 루트 뷰가 64pt 이하이기 때문에 좌표는 상대적으로 음처리됩니다
  • 노선View는 변화가 없지만 만약 그렇다면 UITableView는 SafeArea+Navigation Bar 아래에서 변형되기 때문에 조정을 위해 -64pt를 지정합니다
  • 디버그 후 화면, UITableView를 스크롤합니다.bounds.origin.y의 값도 변했다.
    나는 이것이 UIScrollView 특유의 현상이라고 생각하지만 처리하기가 좀 어렵다.

    터미널 창의 좌표계를 찾을 수 있는지 여부(2019/08/21 추적)


    convert () 를 사용하여 루트 뷰 좌표계에서 손 뷰 좌표를 다시 가져올 수 있습니다.
    많이 만져봤는데 to/from을 nil로 설정하면 UI Windows 좌표계를 사용하면 돼요.
    하지만 손보기보다 깊게 끼우면 몇 번 물지 않으면 잘 바뀌지 않는다.
    Objective-C 시대는 convert Rect라는 이름이기 때문에 그곳에 참고 정보가 많이 나올 수 있습니다.
    이 일대는 매우 좋다
    더 이상 막연하지 않은 convertRect

    마지막


    오자 누자, 내용에 오류가 있으면 지적하세요!!!!

    좋은 웹페이지 즐겨찾기