Swift/Xcode

[Swift] View Drawing Cycle

yeggrrr๐Ÿผ 2024. 5. 28. 15:38

View Drawing Cycle

Veiw Drawing Cycle์ด ๋ฌด์—‡์ผ๊นŒ?

view๊ฐ€ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ, ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋Š” Cycle์„ ๋งํ•œ๋‹ค.
view๊ฐ€ ๋กœ๋“œ ์‹œ, ์‹œ์Šคํ…œ์ด UIView์—๊ฒŒ draw ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋“œ๋กœ์ž‰์„ ์š”์ฒญํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์Šค๋ƒ…์ƒท์„ ์บก์ณํ•˜์—ฌ UIView์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
๊ทธ ๋‹ค์Œ ๋ทฐ์˜ ์ปจํ…์ธ  ๋ณ€๊ฒฝ ์‹œ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋“ค์„ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ์Šคํ…œ์—๊ฒŒ ์š”์ฒญํ•œ๋‹ค.

iOS์˜ ์ด๋ฒคํŠธ๋Š” ๊ฐ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ์กด์žฌํ•˜๋Š” Run loop๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌ๋œ๋‹ค.
๊ทธ ์ค‘ Main Run loop๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ด Main Run loop์˜ ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์—์„œ 'Update Cycle'์ด๋ผ๋Š” ๊ฒƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.
์—ฌ๊ธฐ์„œ Layout(size, position), Display(color, text, image), Constraints(์ œ์•ฝ์กฐ๊ฑด)๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

Display์˜ ๊ฒฝ์šฐ draw,
Layout์˜ ๊ฒฝ์šฐ 
layoutSubviews,
Constraints์˜ ๊ฒฝ์šฐ 
updateConstraints๊ฐ€ ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. 

์ด๋“ค์€ ์ตœ์ดˆ๋กœ View๊ฐ€ load ๋˜์–ด ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ๋„ ๋ถˆ๋ ค์ง„๋‹ค. (-> viewDidLoad)


์•„๋ž˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด์„œ 
View Drawing Cycle์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.



tableViewCell.Xib ํŒŒ์ผ์„ ํ†ตํ•ด ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก์•˜๋‹ค.

(์™ผ์ชฝ: titleImageView / ์˜ค๋ฅธ์ชฝ: subtitleImageView)

์™ผ์ชฝ imageView๋Š” 

1:1 ๋น„์œจ์— ๊ณ ์ • ๋„ˆ๋น„ ๊ฐ’ 66์„ ์„ค์ •ํ•ด์คฌ๋‹ค.
(-> ๊ธฐ๊ธฐ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ๋„ˆ๋น„ 66 ๊ณ ์ •๋จ)

 


์˜ค๋ฅธ์ชฝ imageView๋Š”

1:1 ๋น„์œจ์— ๋„ˆ๋น„๋ฅผ ๋ทฐ์— Equal Widths๋ฅผ ์คฌ๋‹ค.
(-> ๊ธฐ๊ธฐ ํฌ๊ธฐ์— ๋”ฐ๋ผ ํ•ด๋‹น ๋„ˆ๋น„๋น„์œจ๋Œ€๋กœ ์ด๋ฏธ์ง€ ํฌ๊ธฐ๊ฐ€ ๋งž์ถฐ์ง)


์ด๋•Œ, ๋‘ imageView๋ฅผ ์›์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ
cornerRadius๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ”๋ทฐ ์…€์— ๋ทฐ๊ฐ€ UI๋ถ€๋ถ„์€ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ผ๋„ ์ƒ๊ด€์—†๊ธฐ ๋•Œ๋ฌธ์—
awakeFromNib์— ์ž‘์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

        titleImageView.layer.cornerRadius = titleImageView.frame.width / 2
        
        subtitleImageView.layer.cornerRadius = subtitleImageView.frame.width / 2



์ด๋ ‡๊ฒŒ ํ•œ ๋‹ค์Œ ์‹คํ–‰ํ•ด๋ณด๋ฉด,




๋„ˆ๋น„๋ฅผ ๊ณ ์ •์œผ๋กœ 66์„ ์ค€ imageView๋Š” ์›์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋Š”๋ฐ,
๋„ˆ๋น„๋ฅผ ๋น„์œจ๋กœ ์„ค์ •ํ•œ imageView๋Š” ์›์ด ์ด์ƒํ•˜๊ฒŒ ๋งŒ๋“ค์ง„ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ ์ด์œ ๋Š”
๋†’์ด ๋„ˆ๋น„๊ฐ€ ์ ˆ๋Œ€์ ์ธ ์‚ฌ์ด์ฆˆ๋ฉด, ๊ทธ ๋„ˆ๋น„์— ๋งž์ถฐ ๊ทธ๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ์›์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์ง€๋งŒ,

๋น„์œจ์„ ํ†ตํ•ด์„œ ๋†’์ด์™€ ๋„ˆ๋น„๋ฅผ ์„ค์ •ํ•œ ๊ฒฝ์šฐ, ํ™”๋ฉด์ด ๊ทธ๋ ค์ง€๊ณ  awakeFromNib์— ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด,
Xib ๋น„์œจ ๊ทธ๋Œ€๋กœ ๊ทธ๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ทฐ์— ๊ทธ๋ ค์ง„ ๋ชจ์Šต์ด ์™„๋ฒฝํ•œ ์›์œผ๋กœ ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.
(awakeFromNib์€ ์ดˆ๊ธฐํ™” ๋  ๋•Œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ)


๊ทธ๋ ‡๋‹ค๋ฉด ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ awakeFromNib์— ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์ด๋ ‡๊ฒŒ ์ฒ˜์Œ์—๋Š” ์›์ด ์•„๋‹ˆ์—ˆ๋‹ค๊ฐ€ ์Šคํฌ๋กค์„ ํ•˜๋‹ค๋ณด๋ฉด, ์›์ด ๋งŒ๋“ค์–ด์ง„๋‹ค..

๊ทธ๋ž˜์„œ ์ฒ˜์Œ์— ๋ณด์—ฌ์งˆ ๋•Œ๋ถ€ํ„ฐ ์›์œผ๋กœ ๊ทธ๋ ค์ง€๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ layoutSubView ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ์‹œ์ ์— layout์ด ํ•œ ๋ฒˆ ๋” ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

    override func layoutSubviews() {
        super.layoutSubviews()
        subtitleImageView.layer.cornerRadius = subtitleImageView.frame.width / 2
    }

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๊ณ , ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด?


์ด๋ ‡๊ฒŒ ์ •์ƒ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.












728x90

'Swift > Xcode' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Swift] CLLocationManager  (0) 2024.05.31
[Swift] UIButton Configuration  (0) 2024.05.30
[Swift] Delegate ํŒจํ„ด  (0) 2024.05.26
[Swift] UserDefaults  (0) 2024.05.25
[Swift] tag ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ„์†Œํ™”ํ•˜๊ธฐ  (0) 2024.05.20