๐ŸŽ iOS & Swift

[iOS] frame๊ณผ bounds

taeeekki 2021. 8. 20. 20:52

frame๊ณผ bounds

 

์•ˆ๋…•ํ•˜์„ธ์š”, ํƒœ๋ผ์ž…๋‹ˆ๋‹ค :)

์š”์ฆ˜์—๋Š” ํ•œ ๋‹จ๊ณ„ ๋” ์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์‹œ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๊ณต๋ถ€ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๊ณต๋ถ€๋ฅผ ํ•˜๋‹ค๋ณด๋‹ˆ ์ด์ „์— ์•„๋ฌด ์ƒ๊ฐ์—†์ด ์ž‘์„ฑํ•˜๋˜ ์ฝ”๋“œ๋‚˜ ๊ฐœ๋…๋“ค์ด ๋ˆˆ์— ํ™• ๋„๋”๋ผ๊ตฌ์š”...

 

์•Œ๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฑฐ๋ž‘ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๋Š”๊ฑฐ๋ž‘์€ ์—ญ์‹œ ์—„์ฒญ๋‚œ ์ฐจ์ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ํƒ„ํƒ„ํžˆ ํ•ฉ์‹œ๋‹ค...
(๊ทผ๋ฐ ๊ธฐ์ดˆ๋งŒ ๊ณต๋ถ€ํ•˜๋‹ค๋ณด๋ฉด ํฅ๋ฏธ๊ฐ€ ๋–จ์–ด์ง€๋Š”๊ฑด ์‚ฌ์‹ค... ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ ์ ˆํžˆ ์š”๋ฆฌ์กฐ๋ฆฌ ์•„์‹œ์ฃ ...? ๐Ÿ˜‹)

 

frame vs bounds

์˜ค๋Š˜์€ frame๊ณผ bounds์— ๋Œ€ํ•ด ์ •๋ฆฌํ•  ๊ฑฐ์˜ˆ์š”.
์•„ ๊ทผ๋ฐ, ์š”์•ฝ๋ฒ„์ „์ด๋‹ˆ๊นŒ ์ž์„ธํ•˜์ง€ ์•Š์•„๋„ ์ดํ•ดํ•ด์ฃผ์„ธ์š”...
๊ผผ๊ผผํ•œ ์„ค๋ช…๋ฒ„์ „์€ ๋‚˜์ค‘์—...

 

์šฐ์„  ๋‹ค ์ดํ•ดํ•˜๊ณ  ๋‚˜์„œ ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋ฉด frame๊ณผ bounds์˜ ์ฐจ์ด๋Š” ๋‹ค์Œ 3๊ฐ€์ง€๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

์ขŒํ‘œ๊ณ„์— ๋Œ€ํ•œ ์ฐจ์ด, ํฌ๊ธฐ์— ๋Œ€ํ•œ ์ฐจ์ด, ์‹ค์ œ๋กœ ์›€์ง์˜€์„ ๋•Œ ์›€์ง์ž„์˜ ์ฐจ์ด

 

์ œ๊ฐ€ ์ดํ•ดํ–ˆ์„ ๋•Œ๋Š” ์ด 3๊ฐ€์ง€๊ฐ€ ์ „๋ถ€์ด๋‹ค.
ํŠนํžˆ ๋งˆ์ง€๋ง‰ ๋‚ด์šฉ์ด ์ฒ˜์Œ์—๋Š” ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šด๋ฐ ์ด๋Š” ์ง์ ‘ ๊ทธ๋ ค๋ณด๋ฉด์„œ ์ดํ•ดํ•ด๋ณด๊ณ , ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด๋ณด๋ฉด์„œ ์ดํ•ดํ•ด์•ผํ•ด์š”!

 

Origin (x, y) : ์ขŒํ‘œ๊ณ„์— ๋Œ€ํ•œ ์ฐจ์ด

frame์—์„œ origin์€ Superview์˜ ์ขŒํ‘œ๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•˜๊ณ ,
bounds์—์„œ origin์€ ์ž์‹ ์˜ ์ขŒํ‘œ๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Size (width, height) : ํฌ๊ธฐ์— ๋Œ€ํ•œ ์ฐจ์ด

frame์—์„œ size๋Š” view๋ฅผ ๊ฐ์‹ธ๋Š” ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ⇒ ํšŒ์ „์‹œ์—๋Š” size๊ฐ€ ์ปค์ง€๊ฒŒ ๋จ
bounds์—์„œ size๋Š” view ์ž์ฒด์˜ ๋ณธ๋ž˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Move : ์›€์ง์ž„์— ๋Œ€ํ•œ ์ฐจ์ด

frame์€ ์ž๊ธฐ ์ž์‹ ์˜ view๋ฅผ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.
bounds๋Š” subviews๋ฅผ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ(+, -)์œผ๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค.

 

 

Sample

๊ณต๋ถ€ ์ข€ ํ•ด๋ณด์‹œ๊ณ , ํ…Œ์ŠคํŠธ ํ•œ ๋ฒˆ ํ•ด๋ณด์„ธ์š”.

bounds๋ฅผ ์ดํ•ดํ–ˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ์˜ˆ์ œ 1

 

 

Mission1) ์•„๋ž˜์—์„œ ์ฃผ์„์ฒ˜๋ฆฌ ํ•œ ๋ถ€๋ถ„์„ ์ฑ„์›Œ์„œ ์ฃผํ™ฉ์ƒ‰ ๋ฐ•์Šค๋ฅผ ํšŒ์ƒ‰ ๋ฐ•์Šค ์šฐ์ธก ํ•˜๋‹จ์œผ๋กœ ๋ณด๋‚ด๋ณด์„ธ์š”!

import UIKit

class ViewController: UIViewController {
    
    let grayView = UIView()
    let orangeView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }

    private func setup() {
        grayView.backgroundColor = .gray
        grayView.frame = CGRect(x: 50, y: 50, width: 200, height: 200)
        view.addSubview(grayView)
        
        orangeView.backgroundColor = .orange
        orangeView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        grayView.addSubview(orangeView)
        
        UIView.animate(withDuration: 2) {
            // code
            // ์ฃผํ™ฉ์ƒ‰ ๋ฐ•์Šค๋ฅผ ํšŒ์ƒ‰ ๋ฐ•์Šค์˜ ์šฐ์ธกํ•˜๋‹จ์œผ๋กœ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹œ์˜ค.
        }
    }
}

 

์•„๋ž˜์—์„œ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”~

๋”๋ณด๊ธฐ
import UIKit

class ViewController: UIViewController {
    
    let grayView = UIView()
    let orangeView = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }

    private func setup() {
        grayView.backgroundColor = .gray
        grayView.frame = CGRect(x: 50, y: 50, width: 200, height: 200)
        view.addSubview(grayView)
        
        orangeView.backgroundColor = .orange
        orangeView.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
        grayView.addSubview(orangeView)
        
        UIView.animate(withDuration: 2) {
            // ์ฃผํ™ฉ์ƒ‰ ๋ฐ•์Šค๋ฅผ ํšŒ์ƒ‰ ๋ฐ•์Šค์˜ ์šฐ์ธกํ•˜๋‹จ์œผ๋กœ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์‹œ์˜ค.
            self.grayView.bounds.origin.x = -100
            self.grayView.bounds.origin.y = -100
        }
    }
}
bounds๋ฅผ ๊ฑด๋“œ๋ ค์ฃผ๋ฉด ์›ํ•˜๋Š”๋Œ€๋กœ ์›€์ง์ด๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋งˆ๋ฌด๋ฆฌ

์•„๋ž˜ ๊ณต๋ถ€ํ•˜๋Š”๋ฐ ์ฐธ๊ณ ํ•œ ๋ ˆํผ๋Ÿฐ์Šค ์ฒจ๋ถ€ํ• ๊ฒŒ์š”!
๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ์—์„œ ๋„ˆ๋ฌด ์ž˜ ์„ค๋ช…ํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๋ ˆํผ๋Ÿฐ์Šค