๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
SeSAC

[iOS] TIL_230731

by lizzydev 2023. 8. 3.

XIB๋กœ ํ…Œ์ด๋ธ”๋ทฐ ์…€ ๋งŒ๋“ค๊ธฐ

ํ…Œ์ด๋ธ”๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋งŒ๋“ค๋˜ ์…€์„ xib๋กœ ๋”ฐ๋กœ ๊บผ๋‚ด์„œ ๋งŒ๋“ฆ

์›๋ž˜ ํ…Œ์ด๋ธ”๋ทฐ ์ฝ”๋“œ๋ž‘ ๋˜‘๊ฐ™์ด ์งฐ์ง€๋งŒ runtime ์˜ค๋ฅ˜๋‚จ.

guard let ๊ตฌ๋ฌธ์œผ๋กœ ๋ฐ”๊ฟ”์ค˜ ๋ด„

guard let ๊ตฌ๋ฌธ์— ์˜ํ•ด ์—๋Ÿฌ ์—†์ด ๋นˆ ์…€๋“ค์ด ๋“ค์–ด๊ฐ€๊ธด ํ–ˆ์ง€๋งŒ ์ œ๋Œ€๋กœ ์›ํ•˜๋Š” ์…€์ด ์•ˆ ๊ฐ€์ ธ์™€์ง.

ํ…Œ์ด๋ธ”๋ทฐ ์…€ ๋“ฑ๋กํ•˜๊ธฐ

XIB๋กœ ํ…Œ์ด๋ธ”๋ทฐ์…€์„ ์ƒ์„ฑํ•  ๊ฒฝ์šฐ, ํ…Œ์ด๋ธ”๋ทฐ์— ์‚ฌ์šฉํ•  ์…€์„ ๋“ฑ๋กํ•ด์ฃผ๋Š” ๊ณผ์ •์ด ํ•„์š”!

  • bundle ์ด๋ž€? ์ง€๊ธˆ์€ ๋‚ด ํ”„๋กœ์ ํŠธ ์œ„์น˜์ •๋„ ๋ผ๊ณ ๋งŒ ์•Œ์•„๋‘๊ธฐ.(nil๋กœ ํ•˜๋ฉด ๋‚ด ํ”„๋กœ์ ํŠธ ์œ„์น˜)

ํ…์ŠคํŠธ ์–‘ ๋งŒํผ ๋†’์ด ๋„“ํžˆ๊ธฐ (Dynmic Height)

Dynamic Height์„ ์œ„ํ•ด ์„ค์ •ํ•ด์•ผ ํ•  ๊ฒƒ

  1. automaticDimension

  1. numberOfLines

  1. Auto Layout(์—ฌ๋ฐฑ)

Dynamic height์„ ์ฃผ๋ ค๋ฉด ์…€ ์•ˆ์— ๋ ˆ์ด์•„์›ƒ์„ ์ž˜ ์žก์•„์•ผํ•จ.

๋„ˆ๋น„๋‚˜ ๋†’์ด๊ฐ€ ๊ณ ์ • ๋˜์„œ ์œ ๋™์ ์œผ๋กœ ๋Š˜์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ ํ•  ์ˆ˜๋„ ์žˆ์Œ . (์—ฌ๋ฐฑ ์œ„์ฃผ๋กœ ๋ ˆ์ด์•„์›ƒ ์žก์•„์•ผํ•จ)

Swipe - ์…€์—์„œ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

system ์ œ๊ณต Cell ๊ธฐ๋Šฅ

  1. ํŽธ์ง‘ ( ์ค„ ๋ณ€๊ฒฝ ๋“ฑ)
  2. ์Šค์™€์ดํ”„ (์‚ญ์ œ ๋“ฑ)

custom ๊ธฐ๋Šฅ

System Swipe

์…€ ์Šค์™€์ดํ”„ ์‚ญ์ œ ๊ธฐ๋Šฅ ๋„ฃ๊ธฐ

  1. canEditRowAt ๊ตฌํ˜„

์Šค์™€์ดํ”„ ์‚ญ์ œ ๋ฒ„ํŠผ์€ ์ƒ๊ฒผ์ง€๋งŒ ์‚ญ์ œ๋Š” ์•ˆ ๋จ. ๊ธฐ๋Šฅ ๋„ฃ์–ด์ค˜์•ผํ•จ

  1. ์‚ญ์ œ ํ›„ ๊ธฐ๋Šฅ ๋„ฃ์–ด์ฃผ๊ธฐ

ํ•ด๋‹น ์…€์˜ ์ธ๋ฑ์Šค๊ฐ€ ์‚ญ์ œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์ธ๋ฑ์Šค์™€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์…€ indexPath.row ์ด์šฉํ•ด์„œ remove ํ•ด ์คŒ

→ ์˜ค๋ฅ˜๋‚จ ๋ฐ์ดํ„ฐ๋Š” ์‚ฌ๋ผ์กŒ๋Š”๋ฐ ๋ทฐ๊ฐ€ ๊ทธ ์ธ๋ฑ์Šค์— ์ ‘๊ทผํ•˜๋ คํ•ด์„œ

์˜ค๋ฅ˜ ๊ณผ์ •

list ๊ธธ์ด 3, tableview ๊ธธ์ด 3

remove 1 (1๋ฒˆ์ธ๋ฑ์Šค ๋ฐ์ดํ„ฐ ์ง€์›€)

list ๊ธธ์ด 2, tableview ๊ธธ์ด 3 (ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ์—†์–ด์ง„ ์ธ๋ฑ์Šค ์ ‘๊ทผํ•˜๋ ค๊ณ ํ•ด์„œ ์˜ค๋ฅ˜๋‚จ)

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : ๋ฐ์ดํ„ฐ ์‚ญ์ œ ํ›„ ํ…Œ์ด๋ธ” ๋ทฐ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•จ. tableview.reloadData()

Custom Swipe

  • ์นด์นด์˜คํ†ก ์…€์˜ ์Šค์™€์ดํ”„ ๊ธฐ๋Šฅ๋“ค(๊ณ ์ • ๊ธฐ๋Šฅ, ๋ฐฉ๋‚˜๊ฐ€๊ธฐ , ..)
  • ์ง์ ‘ ์ปค์Šคํ…€ํ•ด์„œ ์Šค์™€์ดํ”„ ๊ธฐ๋Šฅ๊ตฌํ˜„ ๊ฐ€๋Šฅ (๋‹ค์–‘ํ•œ ๋ฒ„ํŠผ ๋ชจ์–‘ ๋“ฑ )
  • leadingSwipeActionsConfigurationForRowAt (์™ผ์ชฝ์—์„œ ๋‚˜์˜ค๋Š” ๋ฒ„ํŠผ๋“ค)
  • trailingSwipeActionsConfigurationForRowAt (์˜ค๋ฅธ์ชฝ์—์„œ ๋‚˜์˜ค๋Š” ๋ฒ„ํŠผ๋“ค)

์œ„์˜ ํ•จ์ˆ˜ ์•ˆ์— UISwipeActionsConfiguration ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„

  • ๋ฐฐ์—ด์ธ ์ด์œ  : ์Šค์™€์ดํ”„ํ•ด์„œ ๋‚˜์˜ค๋Š” ๋ฒ„ํŠผ์ด ์—ฌ๋Ÿฌ๊ฐœ ์ผ ์ˆ˜ ์žˆ์Œ.

ํ™”๋ฉด ์ „ํ™˜

๊ฐ™์€ ๋ฒ„ํŠผ์œผ๋กœ ๋‹ค๋ฅธ ํ™”๋ฉด๋“ค๋กœ ์ „ํ™˜ํ•ด์•ผ ํ•  ์ผ์ด ๋งŽ์•„์„œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„์„ ๋งŽ์ด ํ•จ.

๋”ํ•˜๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ํ™”๋ฉด ์ „ํ™˜ํ•˜๊ธฐ

๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”์— bar button item ์ถ”๊ฐ€

add ์˜ต์…˜ ์„ ํƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋”ํ•˜๊ธฐ ๋ฒ„ํŠผ ๋จ

1.์Šคํ† ๋ฆฌ ๋ณด๋“œ ํŒŒ์ผ ์ฐพ๊ธฐ

let vc = DetailViewController()

2.์Šคํ† ๋ฆฌ๋ณด๋“œ ํŒŒ์ผ ๋‚ด ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ ์ฐพ๊ธฐ

let sb = UIStoryboard(name: "Main", bundle: nil)

์Šคํ† ๋ฆฌ๋ณด๋“œ id ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ• (ํŽธ์˜์ƒ ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ฐ™๊ฒŒ)

 ์ด๋Ÿฐ์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๋ฉด ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ๋งŒ๋“ค์–ด ๋†“์€ ๊ทธ๋Ÿฐ๊ฑฐ ํ•˜๋‚˜๋„ ์—†์ด ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋จ.

 

 

3. ํ™”๋ฉด ์ „ํ™˜ ๋ฐฉ์‹ ์„ค์ • (ํšจ๊ณผ ์ฃผ๊ธฐ ์œ„ํ•œ ์˜ต์…˜ ์‚ฌํ•ญ. ์—†์–ด๋„ ํ™”๋ฉด ์ „ํ™˜ ๋จ)

vc.modalTransitionStyle = .crossDissolve //๋ชจ๋‹ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ 
vc.modalPresentationStyle = .fullScreen //๋ชจ๋‹ฌ ๋ฐฉ์‹

fullscreen์œผ๋กœ ํ•˜๋ฉด ๋Œ์•„๊ฐˆ ๊ธธ์ด ์—†์–ด์„œ ๋Œ์•„๊ฐ€๋Š” ๋ฒ„ํŠผ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•จ .

 

4. ํ™”๋ฉด ๋„์šฐ๊ธฐ

present(vc, animated: true)

 

 

modalTransitionStyle

.coverVertical

.crossdisolve

.fliphorizontal

.partialCurl

nav.modalTransitionStyle = .partialCurl //๋ชจ๋‹ฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ 
nav.modalPresentationStyle = .fullScreen //๋ชจ๋‹ฌ ๋ฐฉ์‹

โš ๏ธ .fullScreen์ด๋ž‘ ๊ฐ™์ด ์จ์•ผํ•จ. ์•ˆ ๊ทธ๋Ÿฌ๋ฉด ์˜ค๋ฅ˜๋‚จ.

dismiss ํ• ๋•Œ๋Š” animated false๋กœ ํ•ด์ค˜์•ผ ํ•จ.

dismiss(animated: false) 

true๋กœ ํ•˜๋ฉด ๋ ‰ ๋จน์Œ ์ด์ƒํ•จ.

๋„ค๋น„๊ฒŒ์ด์…˜ push

navigationController?.pushViewController(vc, animated: true) 

 

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {         
	let sb = UIStoryboard(name: "Main", bundle: nil)         
	let vc = sb.instantiateViewController(identifier: "DetailViewController") as! DetailViewController         
	navigationController?.pushViewController(vc, animated: true)     
}
  • ์ธํ„ฐํŽ˜์ด์Šค ๋นŒ๋”์— ๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ž„๋ฒ ๋“œ ๋˜์–ด ์žˆ์–ด์•ผ๋งŒ Push๊ฐ€ ๋™์ž‘! ์•„๋ž˜์ฒ˜๋Ÿผ initial ๋˜๋ฉด ์ž„๋ฒ ๋“œ ์•ˆ๋œ ์…ˆ

๋„ค๋น„๊ฒŒ์ด์…˜์„ ํ‘ธ์‹œ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ

๋„ค๋น„๊ฒŒ์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ(์ œ๋ชฉ๋ฐ”)๋กœ Present ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ

UINavigationController๋กœ ๋งŒ๋“ค์–ด์„œ present

์ด ์ •๋„๋งŒ ์•Œ๋ฉด ํ™”๋ฉด ์ „ํ™˜ ์ฝ”๋“œ๋Š” ๋‹ค ์•Œ๊ณ  ์žˆ๋Š” ์…ˆ .

 

Bar Button Item

์•„๋ž˜์™€ ๊ฐ™์€ LeftBarButton, Title๊ณผ dissmis ์•ก์…˜ ๊ตฌํ˜„

  • style์€ 99ํผ์„ผํŠธ ๊ฑฐ์˜ plain → ์ž์œ ๋กญ๊ฒŒ ์ปค์Šคํ…€ ๊ฐ€๋Šฅ
  • target์€ 99ํผ์„ผํŠธ ๊ฑฐ์˜ self
  • #selector์€ ObjectC์˜ ์ž”์žฌ special literal๋ผ๊ณ  ํ•จ. ์˜ต์ ์‹œ๊ฑฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ.
  • action์—๋Š” IBaction์ฒ˜๋Ÿผ ์ฝ”๋“œ๋กœ action ๋งŒ๋“ค์–ด์„œ ๋„ฃ์–ด์ฃผ๊ธฐ

ํ™”๋ฉด ์ œ๊ฑฐ ํ•จ์ˆ˜

present → dismiss๋กœ ์ œ๊ฑฐ

dismiss(animated: true) 

push → pop๋กœ ์ œ๊ฑฐ

navigationController?.popViewController(animated: true) 
  • popToViewController(): ๋‹ค์–‘ํ•œ ๋‹จ๊ณ„์˜ ์ด์ „ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Œ
  • popViewController(): ํ•œ๋‹จ๊ณ„๋งŒ ๋Œ์•„๊ฐ

Toolbar

  • ๋ฉ”๋ชจ ํ•˜๋‹จ ๋ฐ” or ํ‚ค๋ณด๋“œ์˜ bar๊ฐ€ ํˆด๋ฐ”
  • ์™ผ,์•„๋ž˜,์˜ค ๋งˆ์ง„ 0 ์ฃผ๋ฉด ๋†’์ด์žˆ์–ด์„œ ๋ ˆ์ด์•„์›ƒ ๋ฌธ์ œ๋Š” ์•ˆ ์ƒ๊น€
  • but ๋‹ค๋ฅธ ๋ทฐ ์š”์†Œ๊ฐ€ ์–˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ ˆ์ด์•„์›ƒ ์žก์œผ๋ฉด ํ™• ์˜ฌ๋ผ๊ฐ€๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Œ

  • ํˆด๋ฐ”์— bar button item ๋„ฃ์–ด์„œ ๋ฒ„ํŠผ ๊ตฌํ˜„ํ•˜๋ฉด ๋จ.
  • ์•„๋ž˜ ๋‘๊ฐœ๋Š” ๋ฒ„ํŠผ ์‚ฌ์ด์— ๊ณต๊ฐ„ ๋„“ํžˆ๋Š” ์šฉ

Extension

์–ด๋Š ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋“  ๊ฐ€์ ธ๋‹ค๊ฐ€ ์“ธ ์ˆ˜ ์žˆ์Œ. ๋‚˜์ค‘์— ๋ชจ๋“  ์•ฑ ์ƒ‰๊น” ํ•œ๋ฒˆ์— ๋ฐ”๊พธ๊ธฐ ํŽธํ•  ๊ฒƒ

Tips

๋ทฐ์ปจ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ƒ‰์ƒ ๋„ฃ์—ˆ์„ ๋•Œ ํ…Œ์ด๋ธ”๋ทฐ๊ฐ€ ํ™”์ดํŠธ๋ผ ๊ฑฐ์Šฌ๋ฆผ .

์•„๋ž˜์ฒ˜๋Ÿผ ํˆฌ๋ช…์œผ๋กœ ํ•ด๋†“์œผ๋ฉด ์ข‹์Œ

tableView.backgroundColor = .clear 

์…€ ์ƒ‰๊น” ํˆฌ๋ช…ํ•˜๊ฒŒํ•˜๊ธฐ

cell.backgroundColor = .clear 

UIKit ๊ธฐ๋ณธ ํŠน์„ฑ ์ฒ˜์Œ์— ๋‹ค ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•

์ผ๊ด„ ์ ์šฉ ๋จ .

CollectionView

  • ์ˆ˜ํ‰ ์Šคํฌ๋กค์ด ๋œ๋‹ค.
  • ์…€ ์‚ฌ์ด์ฆˆ๋ฅผ ์กฐ์ • ํ•  ์ˆ˜ ์žˆ๋‹ค.(ํ…Œ์ด๋ธ”๋ทฐ์…€์€ ๋„ˆ๋น„ ๊ณ ์ •)
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜์ง ์Šคํฌ๋กค → ์…€ ๋„ˆ๋น„๊ฐ€ ๊ธฐ๊ธฐ ๋„ˆ๋น„ ๋ฐ˜์ ˆ๋ณด๋‹ค ํฌ๋ฉด ์ค„๋ณ„๋กœ ํ•˜๋‚˜๋ฐ–์— ๋ชป ๋“ค์–ด๊ฐ€์„œ ์…€ ๋ ˆ์ด์•„์›ƒ ์žก๋Š”๊ฒŒ ๊ฐ€์šด๋ฐ๋กœ ์˜ด

CollectionView ๊ตฌํ˜„

๊ธฐ๋ณธ ์ƒ์„ฑ๋˜์–ด์žˆ๋Š” reuseIdentifier ์‚ญ์ œ

numberOfItemsInSection : ์•„์ดํ…œ ๊ฐœ์ˆ˜

cellForItemAt : ์…€ ์„ค์ •

register : ์…€ ๋“ฑ๋ก

๋ ˆ์ด์•„์›ƒ ์กฐ์ •ํ•˜๊ธฐ

UICollectionViewFlowLayout ์ด์šฉํ•ด์„œ ์ปฌ๋ ‰์…˜๋ทฐ ๊ตฌํ˜„

sectionInset

minimumLineSpacing

minimumInteritemSpacing

Apple ๊ณต์‹ ๋ฌธ์„œ ๊ทธ๋ฆผ

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์…€์ด ๋งŒ๋“ค์–ด์ง

์ง€์ • ํ•ด๋†“์€ section inset์€ ๋ฌด์กฐ๊ฑด ํ™•๋ณด ํ•œ ๋’ค์— interitemspacing ๊ฐ„๊ฒฉ์„ ๋บ€ ํ›„์— ๋ฐฐ์น˜ ๋จ

์•„์ดํฐ ๋””๋ฐ”์ด์Šค ๋„ˆ๋น„ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ

let width = UIScreen.main.bounds.width 
  • main์€ iOS 16๊นŒ์ง€๋งŒ ์“ฐ์ž„.
func setCollectionViewLayout() {         let layout = UICollectionViewFlowLayout()         let spacing: CGFloat = 20         let width = UIScreen.main.bounds.width - (spacing * 4)          layout.itemSize = CGSize(width: width / 3, height: width / 3)         layout.sectionInset = UIEdgeInsets(top: spacing, left: spacing, bottom: spacing, right: spacing)         layout.minimumLineSpacing = spacing         layout.minimumInteritemSpacing = spacing         collectionView.collectionViewLayout = layout              } 

๋ ˆ์ด์•„์›ƒ ์ž˜ ์•ˆ๋˜๋ฉด Estimate Size : None์œผ๋กœ ์„ค์ •

Tip

option๋ˆ„๋ฅธ์ฑ„๋กœ ๋ˆ„๋ฅด๋ฉด ์•„๋ž˜์— ์ฐฝ ์—ด๋ฆผ

๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๊ณผ์ •

A(VC)→B(VC)

  1. B์— ๋ณ€์ˆ˜(๊ณต๊ฐ„) ๋งˆ๋ จ
  2. A์—์„œ ๊ฐ’ ์ „๋‹ฌ
  3. B์˜ ๋ทฐ์— ํ‘œํ˜„
  • B์— ๋ณ€์ˆ˜ ์ถ”๊ฐ€

  • A VC์—์„œ ๋ณ€์ˆ˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋จ.

  • ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•˜๋ฉด์„œ B VC์ƒ์„ฑ

  • B์˜ ๋ผ๋ฒจ์— ๋ฐ›์€ ๊ฐ’ ๋„ฃ๊ธฐ

contentsLabel outlet ์ด ์ƒ๊ธฐ๊ธฐ ์ „์— ๊ฐ’์„ ๋„ฃ์–ด์„œ ์˜ค๋ฅ˜ ์ƒ๊ธด ๊ฒƒ. → ์Šคํ† ๋ฆฌ ๋ณด๋“œ์—์„œ๋Š” ๊ฐ’ ์ „๋‹ฌํ• ๋•Œ outlet์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ. outlet์ด ๋Šฆ๊ฒŒ ์ƒ๊น€ .

ํ”„๋กœํผํ‹ฐ ํ†ตํ•ด์„œ ์ „๋‹ฌํ•ด์•ผํ•จ.

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

[iOS] TIL_230802  (0) 2023.08.05
[iOS] TIL_230801  (0) 2023.08.03
[iOS] TIL_230728  (0) 2023.08.01
[iOS] TIL_230727  (0) 2023.07.31
[iOS] TIL_230726  (0) 2023.07.31