요즘엔 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 앱 내 구입] iOS 앱 내 결제 시스템을 구현하면서 필수 고려할 사항 정리 (2) | 2019.12.04 |
---|---|
[iOS] App Lifecycle( 앱 생명주기) (0) | 2019.11.27 |
[iOS DateFormatter Locale] Date->String Locale identifier 사용표 (0) | 2019.11.21 |
[swift Date, DateFormatter] Date->String , String->Date 일때 locale(identifier), TimeZone(abbreviation) 관계 (0) | 2019.11.21 |
[Swift Date] 예약과 유저에게 보여줘야 할 DateFormatter TimeZone 설정 (0) | 2019.11.20 |
[Objectvie-c 의 블록] objectvie c 블록[block] 2장 메모리 영역 (0) | 2019.11.08 |
[Objectvie-c 의 블록] objectvie c 블록[block] 1장. (0) | 2019.11.08 |
델리게이트(Delegate) 위임 패턴이란? (0) | 2019.10.23 |
ARC, 순환참조와 소유권 지시어 (iOS, xcode) (0) | 2019.10.22 |
iOS13 dark mode(다크모드) 설정시 xcode로 대응 방법 (0) | 2019.10.22 |
댓글