๋ทฐ ์ขํ๊ณ
UIView์ ๊ณต์ ๋ฌธ์์๋ ์ขํ๊ณ์ ๋ํด ์ง์ ์ ์ธ ์ธ๊ธ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์งค๋งํ๊ฒ View Programming Guide for iOS ๋ผ๋ ๋งํฌ๋ก ์ธ๊ธํ๊ณ ์๊ณ , View and Window Architecture - View Geometry and Coordinate Systems์์ ๋ทฐ ์ขํ๊ณ์ ๋ํ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
๋ฒ์ญํ๋ฉด ๋ทฐ์ ๊ธฐํํ์ ๊ตฌ์กฐ์ ์ขํ๊ณ ์ ๋๊ฐ ๋๊ฒ ๋ค์.
๋ทฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ข์๋จ์ด (0,0)๋ถํฐ ์์ํ๊ณ ์ด๋ฅผ origin point๋ผ๊ณ ํฉ๋๋ค. ์ํ ๋ฐฉํฅ์ด x์ถ์ด๋ฉฐ ์์ง ๋ฐฉํฅ์ด y์ถ ์ด๊ณ , ์ขํ๊ณ์ ๊ฐ์ ๋ถ๋์์์ ์ผ๋ก ํํํฉ๋๋ค.
๋ชจ๋ ๋ทฐ์ ํ๋ฉด์ ์์ ๋ง์ ์ขํ๊ณ๋ฅผ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฐ์๋ ์ด๋ค ์์ผ๋ก๋ ์ขํ๊ณ๋ฅผ ์กฐ์ํ ๋ ๋ฐ์ํ๋ ์ํฅ์ ๋ํด ์ธ์งํ๊ณ ์์ด์ผ ํ๋ค๊ณ ํ๋ค์.๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ฑฐ๋, ๋ทฐ์ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ฉด ํด๋น ๋ทฐ์ ์ฐ๊ด๋ ๋ชจ๋ ์ขํ๊ณ๊ฐ ์ํฅ์ ๋ฐ๋๋ค๊ณ ํฉ๋๋ค.
๋ํ ๋ทฐ๋ฅผ ๊ทธ๋ฆด๋ (์ด ๋ง์ ๋ทฐ์ ์์น๋ฅผ ์ฎ๊ธฐ๊ฑฐ๋ ๋ทฐ๋ฅผ ์์ฑํ๋ ๋ฑ์ ๋ทฐ์ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๋ชจ๋ ํ์๋ฅผ ๋งํ๋ ๋ฏ ํด์) ๋ถ๋ชจ ๋ทฐ์์ ๊ด๊ณ๋ฅผ ์ ์์์ผ ํ๋ค๊ณ ํฉ๋๋ค.
ํน์ ๋ทฐ์ ๊ธฐํํ์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ์ด์ ์ฐ๊ด๋ ๋ชจ๋ ์ขํ๊ณ๊ฐ ์ํฅ์ ๋ฐ๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๋ง์ธ๋ฏ ์ถ๊ธฐ๋ ํฉ๋๋ค๋ง,, UIWindow ์ UIView ๋ ๊ทธ๋ฌํ ๊ด๊ณ, ์์ ๋ทฐ ์ขํ๊ณ์์์ ์ขํ๊ธฐ ๋ถ๋ชจ ๋ทฐ ์ขํ๊ณ์์์ ์๋์ ์์น๋ฑ์ ๊ณ์ฐํ๋๋ฐ์ ๋์์ ์ฃผ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํด์ค๋ค๊ณ ํฉ๋๋ค.
UIView.Frame
๋ทฐ ์ค๋ธ์ ํธ๋ ์์ ์ frame, bounds, center ์์ฑ์ผ๋ก ์์ ์ ํฌ๊ธฐ์ ์์น๋ฅผ ์ถ์ ํ๋ค๊ณ ํฉ๋๋ค.
์ด๋ฒ์ ์์๋ณผ๊ฒ์ ๊ทธ์ค์์๋ frame ์ธ๋ฐ์! ๊ณต์๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ๊ณ ์์ต๋๋ค.
The frame property contains the frame rectangle, which specifies the size and location of the view in its superview’s coordinate system.
frame์ ๋ถ๋ชจ๋ทฐ์ ์ขํ๊ณ ์์์์ ์์ ์ ์์น์ ํฌ๊ธฐ๋ฅผ ํน์ ํ๋ ์ฌ๊ฐํ ํ๋ ์์ ํฌํจํฉ๋๋ค.
๋ฐํ์์์ frame์ ์กฐ์ํ๋ค๋ ๊ฒ์ ๋ทฐ์ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ์กฐ์ํ๋ค๋ ๋ป์ด๋ฉฐ, ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ์ง๊ฑฐ๋, ๋ทฐ์ ํฌ๊ธฐ ๋๋ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค๋ ๋ป์ด๋ผ๊ณ ํฉ๋๋ค.
frame ์ฌ์ง์ ๋ณด๋ฉด, origin point๊ฐ (40,40) ์ผ๋ก ๋ถ๋ชจ ๋ทฐ์ ์ขํ๊ณ ์ ์์น์ธ๊ฒ์ ์ ์ ์์ต๋๋ค. center ์์ฑ์ ๊ฐ ๋ํ (160, 230) ์ผ๋ก 40 + 120 {240/2} ์ผ๋ก ๋ถ๋ชจ ์ขํ๊ณ์ ๊ธฐ์ค์ ๋๊ณ ์๋ค์.
๋ทฐ ์ขํ๊ณ์ Frame ์ค์ต
์ฌ๋ฏธ์๋ ์ค์ต์๊ฐ! ์ค๋์ ๋ทฐ์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ 3๋จ์ผ๋ก ๋ง๋ค๊ณ , ๋ทฐ ์์น๋ฅผ ์กฐ์ํ๋ฉฐ origin point ์ center ์์ฑ์ ๊ฐ์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋๋์ง ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋์ค์ ๋ทฐ๋ฅผ ๊ตฌ๋ถํ๊ธฐ ์ํด ์ผ๋จ ๋ฐํ์ ํ๋์์ผ๋ก ์น ํ์ต๋๋ค.
๋ทฐ ๊ณ์ธต๊ตฌ์กฐ๊ฐ UIWindowScene - UIWindow - VC - Root View ์ธ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ทธ๋ฅ UIView๋ฅผ ์์ฑํ๊ณ addSubView ๋ก ๋ถ์ฌ๋ณผ๊ฒ์.
class ExViewController: UIViewController {
lazy var view0 = UIView()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .blue
self.view.addSubview(view0)
// Do any additional setup after loading the view.
}
์ด๋ผ.. ๋ทฐ์ ๊ณ์ธต ๊ตฌ์กฐ์์๋ ์ถ๊ฐํ ๋ทฐ๊ฐ ๋ณด์ด๋๋ฐ, ํ๋ฉด์์๋ ๋ทฐ๊ฐ ์๋ณด์ ๋๋ค. ์ด์ฐ ๋ ์ผ์ผ๊น์? ๋ฐ๋ก ๋ทฐ์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ์ง ์์๊ธฐ ๋๋ฌธ์ด์ง์. UIView๋ฅผ ์์ฑํ ๋ ์๋ฌด ํฌ๊ธฐ๋ฅผ ์ฃผ์ง ์์ผ๋ฉด, ํฌ๊ธฐ๊ฐ 0์ธ ๊ฒ์ ์ ์ ์์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด iOS์ ์ขํ๊ณ์์ ํฌ๊ธฐ์ ์์น๋ฅผ ํํํ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ ๋ฌด์์ผ๊น์?
๋ฐ๋ก CGRect ์
๋๋ค.
CGRect ์์ฒด๋ ์ขํ๊ณ์ ์ถ์์ ์ธ ํ๋์ ์ค์ ์ฝ๋๋ก ์ฎ๊ธธ ๋ ์ฌ์ฉํ๋ ํ์
์ด๊ธฐ์ ์ง๊ธ์ ์์ธํ ์ค๋ช
์ ํ์ง๋ ์๊ฒ ์ต๋๋ค๋ง, UIView.frame ์์ frame์ CGRect์ด๊ณ , CGRect๊ฐ origin, x, y, width, height, center ๋ฑ์ ์์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฆ, UIView.frame์ ํด๋น ์์ฑ๋ค์ ์กฐ์ํ๋ ๊ฒ์ด ๋ทฐ์ ๊ธฐํํ์ ๊ตฌ์กฐ๋ฅผ ์กฐ์ํ๋ ํ์ ์ค ํ๋์ธ๊ฒ์ ์ ์ ์์ต๋๋ค.
์ ํ UIView ๊ณต์ ๋ฌธ์์๋ view์ ์ฌ์ด์ฆ๋ฅผ ์ง์ ์กฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ดํ๊ณ ์์ง ์๋๋ฐ์, ์๋ง ์ง์ ์กฐ์ํ๋ ๊ฒ์ ๊ถ์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ์ด๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ผ ์ด๋ป๊ฒ ์กฐ์ํ๋๋? ์กฐ์ํ๊ธฐ ์ํด์๋ ๋งค๋ฒ ์คํ ๋ ์ด์์ ๊ฐ์๊ฑธ ์ฌ์ฉํด์ผ ํ๋๋?
๊ทธ๊ฒ ์ ์์ด๊ฒ ์ต๋๋ค๋ง, frame.size ๋ฅผ ํตํด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
self.view0.backgroundColor = .brown
self.view0.frame.size.width = 100
self.view0.frame.size.height = 100
์๋ฎฌ๋ ์ดํฐ์์ ๋ผ์ด๋ฉ๋๋ฌธ์ ์กฐ๊ธ ์งค๋ ธ๋๋ฐ, ์ ํํ (0,0)๋ถํฐ ์์ํด ๊ฐ๋ก์ธ๋ก 100๋งํผ์ ํฌ๊ธฐ๋ฅผ ๊ฐ๋ View๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
์, ์ด์ ์ด ๋ทฐ์ ์์ ๊ณผ ๊ฐ๋ก์ธ๋ก๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๋ณ๊ฒฝ ์ ๊ณผ ํ์ ๊ฐ์ ํ์ธํด๋ณด๋๋ก ํฉ์๋ค.
self.view.addSubview(view0)
self.view0.backgroundColor = .brown
self.view0.frame.size.width = 100
self.view0.frame.size.height = 100
print("view0.center", view0.frame.origin)
print("view0.center", view0.center)
self.view0.frame.origin.x = 100
self.view0.frame.origin.y = 100
print("view0.center", view0.frame.origin)
print("view0.center", view0.center)
์ ์งํ๊ฒ ๋ฑ 100๋งํผ๋ง ๋์ด๋๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์, ์ด์ ์๋ก์ด ๋ทฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ด ๋ทฐ์ origin์ ํ๋ฒ ํ์ธํด๋ณด์ฃ .
self.view0.addSubview(view1)
self.view1.backgroundColor = .purple
self.view1.frame.size.width = 100
self.view1.frame.size.height = 100
print("view1.center", view1.frame.origin)
print("view1.center", view1.center)
view1์ origin point ๊ฐ (0,0) ์ ๋๋ค!
๊ณต์ ๋ฌธ์๋๋ก ๊ฐ ๋ทฐ๋ ๋ถ๋ชจ ๋ทฐ์ ์ขํ๊ณ๋ง์ ๊ธฐ์ค์ผ๋ก ํ๋ค๋ ๊ฒ์ ํ์ธํ ์๊ฐ์ ๋๋ค. center ๋ ์ ์งํ๊ฒ (50,50)์ด๋ค์. ์ด์ ์์น๋ฅผ ์กฐ๊ธ ์ฎ๊ธฐ๋ฉด..?
self.view1.frame.origin.x = 100
self.view1.frame.origin.y = 100
print("view1.center", view1.frame.origin)
print("view1.center", view1.center)
๊ณต์ ๋ฌธ์๋๋ก ๊ฐ ๋ทฐ๋ ๋ถ๋ชจ ๋ทฐ์ ์ขํ๊ณ๋ง์ ๊ธฐ์ค์ผ๋ก ํ๋ค๋ ๊ฒ์ ํ์ธํ ์๊ฐ์ ๋๋ค. center ๋ ์ ์งํ๊ฒ (50,50)์ด๋ค์. ์ด์ ์์น๋ฅผ ์กฐ๊ธ ์ฎ๊ธฐ๋ฉด..?
self.view1.frame.origin.x = 100
self.view1.frame.origin.y = 100
print("view1.center", view1.frame.origin)
print("view1.center", view1.center)
๋ชจ๋ ๊ฒ์ด ๊ณต์๋ฌธ์๋๋ก ์ ์งํ๊ฒ ์๋ํ๋๊ฒ์ ์ ์ ์์ต๋๋ค.
iOS ๊ฐ๋ฐ์๋ผ๋ฉด ๊ผญ ์์์ผ ํ ์ขํ๊ณ์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
์ด ์ธ์๋ transform์ด๋ผ๋๊ฐ, bounds๋ผ๋๊ฐ.. ๋จธ๋ฆฌ์ํ๊ฒ๋ค์ด ๋ง์ด ๋จ์์ต๋๋ค. ๊ทธ๋ฌ๋๊น ๋ ๋ต๊ฒ ์ต๋๋ค. ๋ค์ ํฌ์คํ
์์ ๋ต์!
์ฐธ๊ณ ์๋ฃ
CGRect | Apple Developer Documentation
CGRect | Apple Developer Documentation
A structure that contains the location and dimensions of a rectangle.
developer.apple.com
About Windows and Views
About Windows and Views In iOS, you use windows and views to present your application’s content on the screen. Windows do not have any visible content themselves but provide a basic container for your application’s views. Views define a portion of a wi
developer.apple.com
UIView | Apple Developer Documentation
An object that manages the content for a rectangular area on the screen.
developer.apple.com
'learnings > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS/Swift] URLProtocol์ ์ฌ์ฉํด ๋คํธ์ํน์ ํ ์คํธํด๋ณด์ (2) | 2024.10.16 |
---|---|
[iOS/Swift] ์๋ฉธ์๋ฅผ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ํด์ (0) | 2024.03.26 |
[iOS/Swift] ์ธ์คํด์ค์ ์ํ ์ฐธ์กฐ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๋์ (0) | 2024.03.21 |
[iOS/Swift] TableView์์ SnapScroll (magnetic scroll) ๊ตฌํ (0) | 2023.01.20 |
[iOS/Swift] #1-2 ๋์ ์ฒซ ํ ์ดํ๋ก์ ํธ (0) | 2021.09.23 |