본문 바로가기
개발 블로그/아이폰개발

frame 과 bounds 차이라면..? Swift, Xcode, iOS 개발

by snapshot 2019. 10. 30.

요즘엔 storyboard 또는 code로 autolayout 기준으로 UI 작업을 하기 때문에  frame과 bounds는 잘 사용하지 않는다. 

하지만 런타임중 어떤 뷰를 생성해야 할 때... 애니메이션을 할 때 필요할 경우가 생긴다. 

그럼 간단히 frame과 bounds 기준을 알아 보자. 

 

일단 알아 두자....알면 좋다...

 

frame: frame으로 기준을 잡을 때는 나의 위,, 그러니깐 super view 기준이다. 그 기준 0,0 기준으로 나 자신의 위치가 결정된다. 

 

bounds:이건 그냥 온 세상의 중심은 나..내가 중심이다. super view 어찌 됐든지.. 그냥 내가 0.0이다

frame 기준으로는 (50,50) 이어도 bouds는 (0,0)이다

 

그러니깐 기준이 superview냐.. 아니면 나 자신이냐.. 이것인데.. bounds의 x, y는 뭔가 좀 다르다..

 

우리는 사실 거의 frame만 사용할 것이다. 

 

밑의 코드는 그냥 예제로 만들어 봤다.

근데.. TestView 굳이 만들지 않아도 되는데.... 괜히 만들었다...

아마 처음에 무슨 계획이 있었던 거 같은데.. 까먹어서... 하이 튼 그냥 알아보자. 

 

이 코드로 한번 놀아보자. 

import UIKit

class TestView : UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ViewController의 뷰에 view01 add
        let blue = TestView(frame: CGRect(x: 50, y: 50, width: 200, height: 300))
        blue.backgroundColor = UIColor.systemBlue
        
        self.view.addSubview(blue)
        
        // view01에 view02 add
        
        let yellow01 = TestView(frame: CGRect(x: 100, y: 100, width: 50, height: 50))
        
        yellow01.backgroundColor = UIColor.systemYellow
        blue.addSubview(yellow01)
        
        // view02에 view03 add
        
        let yellow02 = TestView(frame: CGRect(x: 50, y: 200, width: 50, height: 50))
        
        yellow02.backgroundColor = UIColor.systemYellow
        blue.addSubview(yellow02)
        

        /*
        // blue의 bounds x를 수정해보자
        blue.bounds = CGRect(x: 50, y: 0, width: blue.bounds.width, height: blue.bounds.height)

         
         // yellow01의 bounds x를 수정해보자
         yellow01.bounds = CGRect(x: 50, y: 0, width: yellow01.bounds.width, height: yellow01.bounds.height)

 
         */
        
        // Do any additional setup after loading the view.
    }
    
    
}

 

 

1. 일단 우리는 superView 위에 blueView을 Add 했다

2. blueView 위에 yellowView01, yellowView02을 같이 Add 했다. 

 

 

3. frame으로 여러분은 많이 옮겨 봤으니.. 우리는 blueView의 bounds의 x를 수정해 봤다. 

한번 생각해보자..

 

문제 : 여러분 생각에 저 파란색의 bounds의 x를 에 50을 했을 경우 어떻게 됐을 것 같은가..?'

 

 1. x축으로 50 이동   

 

 

 

 

 

 

 

 

 

 

2. 그냥 원래 그 자리  ( 아무런 변화가 없다..)

 

 

 

 

 

 

 

 

 

3. yellow01, 02가 왼쪽으로 50 이동

 

 

 

 

 

 

 

 

 

 

 

답은????

.

.

.

.

.

.

.

.

.

.

3번이다. 

 

이유는 무엇일까..

1. blueview의 frame에서 x에 50을 더 해주면 된다. 결국 x = 100

2. 그냥 아무것도 안 했을 때.... 혹시 몰라서 yellow01 또는 yellow02의 bounds x, y를 해봤을 때.. 아무 일 없다. 

3. 정답!! blueview의 위치는 아무 변화가 없고 blueview 속의 subview인 yellow01,02가 왼쪽으로 움직인다.. 상상해보자..

 

bounds는 나 자신이 기준이지만 bounds로 xy,를 변경했다고 해서 내 자신이 superview 기준으로 움직이는 것이 아니다. 

나의 subview들이 움직인다... 그냥 모르면 정말 크기만 구할 때 사용하자..

이것은 스크롤 뷰 속의 subview들이 스크롤에 따라서 움직이는 방식으로 생각하면 된다. 

스크롤은 bounds의 x 또는 y를 기준으로 subview를 보여준다. 

 

 

그렇다면 yewllo01 또는 yellow02를 움직여보면..?

 

아무 일도 안 일어 난다.. 2번과 같다. 

 

저 위에 코드로 실험을 해보길 바란다. 

 

 

그럼 Frame과 Bounds를 언제 써야 하느냐?

- Frame : viiew의 위치나 크기를 설정하는 경우. 

 

- Bounds : 

transfomation 후, View의 크기를 알고 싶을 때. 

하위 View를 정렬하는 것과 같이 내부적으로 변경하는 경우. (잘 알지 못하면 안 쓰는 게 나은 거 같다.. 그냥 크기 구할 때만 쓰자..)

 

https://zeddios.tistory.com/203

 

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

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

zeddios.tistory.com

이 분의 블로그가 더 잘 이해가 될 수도 있다. 

댓글