본문 바로가기
iOS/설명

[iOS] frame과 bounds의 차이

by Sky Titan 2021. 1. 21.
728x90

※ 참조

 

iOS ) Frame과 Bounds의 차이 (1/2)

안녕하세요 :) Zedd입니다. 지금 다른 글을 쓰고있는데, 쓰면 쓸수록 쓸 주제가 많아집니다...급 이 글을 쓰게 됐어요 XD.. 아무튼 오늘은 저도 궁금했던 Frame과 Bounds의 차이를 알아볼거에요 :) 다음

zeddios.tistory.com

 

Apple Developer Documentation

 

developer.apple.com

Frame

  • 해당 UIView의 SuperView에 대응한 좌표 시스템을 가진다.
  • SuperView의 origin으로 부터의 x좌표, y좌표 거리를 표시해준다.
  • frame의 size는 항상 해당 뷰가 들어가있는 사각형 영역의 사이즈를 표시해준다.
    • 즉, view를 회전을 했을 때에도 해당 뷰가 들어가는 사각형 영역의 사이즈를 나타낸다.

 

Bounds

  • 해당 UIView 자체의 좌표 시스템을 사용한다.
    • subView들의 위치를 변경하는 좌표시스템
  • 그렇기에 항상 origin은 (0, 0)을 나타내고 있다.
  • 만약 bounds의 좌표계를 변경하면 해당 위치에서 다시 View를 그리게 된다. (UIView가 이동한다.)
    • 좀 더 정확히 말하자면 viewPort의 위치가 변하게 된다. 즉, view를 보여주고 있는 창틀(?)이 이동하는 개념이기 때문에 만약 (50, 50)으로 지정을 하게 되면 최종적으로 subview들이 (-50, -50)만큼 이동하게 되는 결과가 나오게 된다.
  • size를 변경하면 frame의 size도 동일하게 변하게 된다.
    • frame과 달리 View자체의 size를 나타내기 때문에 view를 회전해도 size는 변하지 않는다.
  • ScrollView의 기능을 구현하는 핵심 개념이다. 
    • 오른쪽으로 Scroll한다면 ScrollView의 x좌표에 양수 값을 준다.
    • 왼쪽으로 Scroll한다면 ScrollView의 x좌표에 음수 값을 준다.

 

frame size vs bounds size 예시

 

print("origin frame \(redView.frame), bounds \(redView.bounds)")
        
redView.transform = .init(rotationAngle: .pi / 4)
redView.layoutIfNeeded()
print("rotate frame \(redView.frame), bounds \(redView.bounds)")
  1. (150, 100) size의 UIView를 생성
  2. 45도로 회전시킨 후 frame, bounds의 size 비교

회전 후 frame의 size값은 변경됨

회전 후 frame 사이즈

  • (176.78, 176.78)로 변경

 

회전 후 bounds 사이즈

 

  • (150, 100) 유지

 

frame origin vs bounds origin 예시

let blue = UIView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
        blue.backgroundColor = .blue
        redView.addSubview(blue)
        blue.center = CGPoint(x: redView.bounds.width / 2, y: redView.bounds.height / 2)
        blue.layoutIfNeeded()
  • ViewController의 중앙에 redView가 위치
  • redView의 중앙에 위치한 blue라는 subview가 존재하는 상황

 

redView의 frame의 origin 변경

  • redView.frame.origin.x를 +20만큼 이동
  • redView의 superview에서의 위치가 변경

 

 

redView의 bounds의 origin 변경

  • redView.bounds.origin.x를 +20만큼 이동
  • blueView의 x좌표가 -20만큼 이동한 것처럼 보인다.
    • viewPort가 이동한 것이기에 보이기만 그렇게 보이는 것일 뿐, 실제 blueView의 frame 좌표값은 변하지 않는다.
728x90

댓글