๋งจ๋ ํท๊ฐ๋ฆฌ๋ ์ด๊ฒ. ์ค๋์ ๋ฝ์๋ฒ๋ฆฌ๊ฒ ๋ค.
Frame
Super view์ ์ขํ๊ณ๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ ๋ ๋ณธ์ธ์ ์ขํ๊ณ๋ฅผ ๋งํ๋ค.
์ฐ๋ฆฌ๊ฐ ์์น๋ฅผ ํ์ํ๊ธฐ ์ํด์๋ ๊ธฐ์ค ์ขํ๊ณ๊ฐ ์์ด์ผ ํ๋ค. iPhone์ ๊ฒฝ์ฐ ์ข์๋จ์์ ์์ํ์ฌ x์ถ์ ์ค๋ฅธ์ชฝ, y์ถ์ ์๋๋ก ๊ฐ๋ ๊ธฐ๋ณธ ์ขํ๊ณ๋ฅผ ๊ฐ๋๋ค.
์ด ๊ทผ๋ณธ ์ขํ๊ณ ์์์ ์ฐ๋ฆฌ๋ ์์๋ค์ ๋์์ผ ํ๋๋ฐ, ์ด ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ๊ฒ์ด frame์ด๋ค. apple์ ํน์ ์์๋ฅผ ์ฐ๋ฆฌ๊ฐ ๋ง๋ค ๋, ํด๋น ์์๋ฅผ ๋์ ๊ธฐ์ค์ ๋์ ๋ถ๋ชจ๋ก ์ก์๋ค. ์ฆ, ๋์ ๋ถ๋ชจ์ ๋นํด์ ๋์ ์์น๊ฐ ์ด๋๊ฐ?๋ก ์ค์ ํ๋ ๊ฒ. ๊ทธ๋ฆฌ๊ณ ์ด ์๊ฐ์ ๊ฐ์ฅ ๋ง๋ ์์๊ฐ frame
์ด๋ค.
์ด๋ ๊ฒ ๋ด๊ฐ ๋๊ณ ์ถ์ ์์์ ์์น๋ฅผ ํ์ ํ ๋, ํญ์ ๋ถ๋ชจ View์ Subview๋ก ๋ฃ์ด์ฃผ๋ ๋์์ ์ํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์ฌ๊ณ ๋ ์ฌ์ค ์์ฐ์ค๋ฝ๋ค.
let parentView = UIView()
let childView = UIView()
parentView.addSubview(childView)
childView.frame = CGRect(x: 10, y: 10, width: 20, height: 40) // ๋ถ๋ชจ๋ทฐ ๊ธฐ์ค์ผ๋ก ์์น ์ ์
Rotate
ํ์ ์ ๊ฒฝ์ฐ์๋ ์ด๋จ์ง ๊ถ๊ธํ์ฌ ๋๋ ค๋ณด์๋ค.
----------
ViewA frame: (0.0, 0.0, 390.0, 844.0)
ViewA bounds: (0.0, 0.0, 390.0, 844.0)
ViewB frame: (100.0, 200.0, 200.0, 300.0)
ViewB bounds: (0.0, 0.0, 200.0, 300.0)
----------
์ฌ๊ธฐ๊น์ง๋ ๋ฐฉ๊ธ ์ดํดํ ๋ด์ฉ๊ณผ ๊ฐ๋ค.
----------
ViewA frame: (0.0, 0.0, 390.0, 844.0)
ViewA bounds: (0.0, 0.0, 390.0, 844.0)
ViewB frame: (23.22330470336314, 173.2233047033631, 353.5533905932738, 353.55339059327383)
ViewB bounds: (0.0, 0.0, 200.0, 300.0)
----------
ํ์ ํ๊ฒ ๋๋ viewB์ frame์ด ๋ณ๊ฒฝ๋์๋ค. ์ด๋ ๋ณ๊ฒฝ๋์์ ๋ ์ฌ๊ฐํ์ ๋ชจ๋ ํฌํจํ๋ฉด์ ์ต์์ธ ์ฌ๊ฐํ์ ์๋ฏธํ๋ ๊ฒ์ด frame์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ฐ์์ผ๋ก ๊ฐ์ผ ์ฌ๊ฐํ์ด frame์ด๋ค.
Bounds
์์ ๋ง์ ๊ณ ์ ํ ์ขํ๊ณ
๊ทธ๋ ๋ค๋ฉด ์ ์ค์ ์ฌ๊ฐํ์ ๊ด๋ จ๋ ๊ฐ์ ์ป์ ์๋ ์์๊น? ๊ทธ๊ฒ์ด bounds์ด๋ค. ์ค๋ช ์ ๋ณด๋ฉด ์์ ๋ง์ ๊ณ ์ ํ ์ขํ๊ณ๋ฅผ ๋ํ๋ด๊ธฐ ๋๋ฌธ์, ํ์ฌ ํ์ ๋ ์ํฉ์์ bounds์ ์ขํ๊ณ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
----------
ViewA frame: (0.0, 0.0, 390.0, 844.0)
ViewA bounds: (0.0, 0.0, 390.0, 844.0)
ViewB frame: (23.22330470336314, 173.2233047033631, 353.5533905932738, 353.55339059327383)
ViewB bounds: (0.0, 0.0, 200.0, 300.0)
----------
์ค์ ๋ก ํ์ ๋ ์๋ฎฌ๋ ์ดํฐ์์ ๊ฐ์ ์ฐ์ด๋ณด๋ฉด, ํ์ ๋์์๋ ๋ถ๊ตฌํ๊ณ ViewB์ Bounds๋ ๋์ผํ ๊ฒ์ ์ ์ ์๋ค.
Bounds๋ฅผ ๋ฐ๊ฟ๋ณด์
viewA(๋ ธ๋)์ subview๋ก viewB(ํ๋)๊ฐ ๋ค์ด๊ฐ ์๋ ์ํฉ์์ viewA์ bounds๋ฅผ ๋ฐ๊ฟ๋ณด๊ฒ ๋ค.
self.viewA.bounds.origin = CGPoint(x: 100, y: 200)
์ ํ๋์ ๋ทฐ๊ฐ ์๋ก ์ฌ๋ผ๊ฐ์๊น? ์ฐํ๋จ์ผ๋ก ๊ฐ์ผ๋๋ ๊ฒ ์๋๊ฐ? ๋ผ๊ณ ์๊ฐํ ์ฌ๋์ด ์๋ค๋ฉด ์์๋ค. bounds์ ์ด๋์ ์ขํ๊ณ์ ์ด๋์ด๋ค.
์ขํ๊ณ๊ฐ (100, 200) ์์ง์ด๊ณ , ์ค์ ๋ณด์ด๋ ํ๋ฉด์ ์ด ์์ง์ธ ์ขํ๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ๋ณด์ฌ์ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฐ๋งํ ์๋ viewB๊ฐ ์ฐ๋ฆฌ ๋์๋ ์ข์๋จ์ผ๋ก ๊ฐ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ์ด๋ค!!
Whole Code
import UIKit
class FrameBoundsViewController: UIViewController {
let viewA: UIView = {
let view = UIView()
view.backgroundColor = .yellow
return view
}()
let viewB: UIView = {
let view = UIView()
view.backgroundColor = .blue
return view
}()
let rotateButton: UIButton = {
let button = UIButton()
button.setTitle("45๋ ํ์ ", for: .normal)
button.setTitleColor(UIColor.black, for: .normal)
return button
}()
let debugButton: UIButton = {
let button = UIButton()
button.setTitle("DEBUG", for: .normal)
button.setTitleColor(UIColor.black, for: .normal)
return button
}()
let boundsButton: UIButton = {
let button = UIButton()
button.setTitle("ViewA Bounds +10, +10", for: .normal)
button.setTitleColor(UIColor.black, for: .normal)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
self.viewA.frame = CGRect(origin: .zero, size: self.view.frame.size)
self.viewB.frame = CGRect(origin: CGPoint(x: 100, y: 200), size: CGSize(width: 200, height: 300))
self.rotateButton.frame = CGRect(x: 20, y: 600, width: 200, height: 40)
self.debugButton.frame = CGRect(x: 220, y: 600, width: 200, height: 40)
self.boundsButton.frame = CGRect(x: 20, y: 700, width: 400, height: 40)
self.view.addSubview(self.viewA)
self.view.addSubview(self.rotateButton)
self.view.addSubview(self.debugButton)
self.viewA.addSubview(self.viewB)
self.rotateButton.addTarget(self, action: #selector(self.rotateRectangle), for: .touchUpInside)
self.debugButton.addTarget(self, action: #selector(self.debug), for: .touchUpInside)
self.viewA.bounds.origin = CGPoint(x: 100, y: 200)
}
@objc func rotateRectangle() {
UIView.animate(withDuration: 1) {
self.viewB.transform = CGAffineTransform(rotationAngle: .pi/4)
}
}
@objc func debug() {
print("----------")
print("ViewA frame: \(self.viewA.frame)")
print("ViewA bounds: \(self.viewA.bounds)")
print("ViewB frame: \(self.viewB.frame)")
print("ViewB bounds: \(self.viewB.bounds)")
print("----------")
}
}
๋ง๋ฌด๋ฆฌ
๊ฐ๋จํ๊ฒ frame, bounds์ ๋ํด์ ์์๋ณด์๋ค. bounds๋ ์ค์ ๋์ ๋ณด์ด๋ ์ขํ๊ณ๊ฐ ์ด๋ํ๋ ๊ฒ์์ ๊ธฐ์ตํ์. ์ขํ๊ณ๊ฐ ์์ง์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋์ ๋ณด์ด๋ ๋ ์์ ์ ๋ฐ๋๋ก ์์ง์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ๋๋ค. ๋!