๐Ÿ“˜ TIL: ํ…Œ์ด๋ธ” ๋ทฐ UI ๊ตฌํ˜„๊ณผ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ํ™œ์šฉ

jeongmuyametteยท2024๋…„ 12์›” 10์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
15/72
post-thumbnail

๐Ÿ“˜ TIL: ํ…Œ์ด๋ธ” ๋ทฐ UI ๊ตฌํ˜„๊ณผ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ํ™œ์šฉ

์˜ค๋Š˜์€ iOS ๊ฐœ๋ฐœ์—์„œ UITableView๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ๋ณธ์ ์ธ UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ , ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ™”๋ฉด์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ” ๋ทฐ์˜ ๋™์ž‘์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐Ÿš€ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ UITableView ๊ธฐ๋ณธ ๊ตฌ์„ฑ

  • UITableView๋Š” ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.
  • ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด UITableViewDataSource ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ํ•„์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • numberOfRowsInSection: ์„น์…˜์˜ ํ–‰ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜.
    • cellForRowAt: ๊ฐ ํ–‰์— ํ‘œ์‹œํ•  ์…€์„ ๋ฐ˜ํ™˜.

2๏ธโƒฃ SnapKit์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ์„ค์ •

  • SnapKit์„ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ” ๋ทฐ์™€ ๋‹ค๋ฅธ UI ์š”์†Œ์˜ ์ œ์•ฝ ์กฐ๊ฑด์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค์ •ํ–ˆ๋‹ค.
  • ํ…Œ์ด๋ธ” ๋ทฐ๊ฐ€ ํ™”๋ฉด ์ „์ฒด๋ฅผ ์ฑ„์šฐ๋„๋ก top, leading, trailing, bottom ์ œ์•ฝ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
tableView.snp.makeConstraints { make in
    make.top.equalTo(titleLabel.snp.bottom).offset(16)
    make.leading.trailing.bottom.equalToSuperview()
}

3๏ธโƒฃ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ํ™œ์šฉ

  • ํ…Œ์ด๋ธ” ๋ทฐ์˜ UI๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ–ˆ๋‹ค.
  • ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋Š” ์ž„์‹œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  UI๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค.
private let dummyData = ["ํ”ผ์นด์ธ„", "๊ผฌ๋ถ€๊ธฐ", "ํŒŒ์ด๋ฆฌ", "์ด์ƒํ•ด์”จ", "๋ผ์ด์ธ„"]
  • ๋ฐ์ดํ„ฐ๋Š” UITableViewDataSource์˜ cellForRowAt ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์…€์— ํ‘œ์‹œํ–ˆ๋‹ค.
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
    cell.textLabel?.text = dummyData[indexPath.row]
    return cell
}

4๏ธโƒฃ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์—ฐ๊ฒฐ

  • ํ…Œ์ด๋ธ” ๋ทฐ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ dataSource๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
  • viewDidLoad์—์„œ tableView.dataSource = self๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์—ฐ๊ฒฐํ–ˆ๋‹ค.
override func viewDidLoad() {
    super.viewDidLoad()
    setupUI()
    
    tableView.dataSource = self
}

5๏ธโƒฃ ๊ฒฐ๊ณผ

  • ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ด ํ…Œ์ด๋ธ” ๋ทฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
  • ํ™”๋ฉด์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ๋‹ค:
    • ํ”ผ์นด์ธ„
    • ๊ผฌ๋ถ€๊ธฐ
    • ํŒŒ์ด๋ฆฌ
    • ์ด์ƒํ•ด์”จ
    • ๋ผ์ด์ธ„

๐Ÿ’ก ๋ฐฐ์šด ์ 

  1. ๋”๋ฏธ ๋ฐ์ดํ„ฐ ํ™œ์šฉ: ๊ฐ„๋‹จํ•œ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด ํ…Œ์ด๋ธ” ๋ทฐ UI๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. SnapKit์˜ ์œ ์šฉ์„ฑ: ์ œ์•ฝ ์กฐ๊ฑด์„ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ๋•Œ SnapKit์ด ๋งค์šฐ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„ํŽธํ•˜๋‹ค.
  3. UITableViewDataSource์˜ ์ค‘์š”์„ฑ: ํ…Œ์ด๋ธ” ๋ทฐ๋Š” ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€์˜ ์—ฐ๊ฒฐ์ด ํ•„์ˆ˜์ ์ด๋‹ค.

๐Ÿ› ๏ธ ๊ฐœ์„  ์•„์ด๋””์–ด

  • ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹จ์ˆœ ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด ๋ฐฐ์—ด๋กœ ํ™•์žฅํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ์—ฐ์Šต์„ ํ•  ๊ฒƒ.
  • ์ปค์Šคํ…€ ์…€์„ ๋งŒ๋“ค์–ด ๋” ๋ณต์žกํ•œ UI๋ฅผ ํ…Œ์ŠคํŠธํ•ด ๋ณผ ๊ฒƒ.

๐Ÿ”— ์ฝ”๋“œ ์Šค๋‹ˆํŽซ

private let dummyData = ["ํ”ผ์นด์ธ„", "๊ผฌ๋ถ€๊ธฐ", "ํŒŒ์ด๋ฆฌ", "์ด์ƒํ•ด์”จ", "๋ผ์ด์ธ„"]

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dummyData.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: "cell")
        cell.textLabel?.text = dummyData[indexPath.row]
        return cell
    }
}

โœ๏ธ ๋А๋‚€ ์ 

ํ…Œ์ด๋ธ” ๋ทฐ๋Š” iOS ์•ฑ ๊ฐœ๋ฐœ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ๋„ ์ค‘์š”ํ•œ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ํŠนํžˆ, ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ฉด UI๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ํšจ์œจ์ด ๋†’์•„์ง„๋‹ค. ์•ž์œผ๋กœ ๋” ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์ปค์Šคํ…€ ์…€์„ ์—ฐ์Šตํ•ด ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

profile
์–‘์ •๋ฌด

0๊ฐœ์˜ ๋Œ“๊ธ€