Published on

๐Ÿ“ฑ iOS - ScrollView ์˜คํ†  ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

Authors
  • avatar
    Name
    ์ด์ฐฝ์ค€
    Twitter

UIScrollView๋Š” ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์—๋Ÿฌ๋ฅผ ๋‚ด๋Š” UI ์ปดํฌ๋„ŒํŠธ ์ค‘ ๋Œ€ํ‘œ์ ์ธ ์นœ๊ตฌ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์ œ๋‚˜์ฒ˜๋Ÿผ ์ปดํ“จํ„ฐ๋Š” ์ž˜๋ชป์ด ์—†์ฃ . ์ œ๋Œ€๋กœ ์•Œ๊ณ  ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•ด์„œ ์ผ์–ด๋‚˜๋Š” ์žฅ์• ๋ฌผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋จธ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•  ๊ฒธ ๋‹จ๊ณ„๋ณ„๋กœ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

UIScrollView

UIScrollView๊ฐ€ ๋ญ”์ง€๋ถ€ํ„ฐ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. UIScrollView๋Š” ํ™”๋ฉด์˜ ํฌ๊ธฐ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์Šคํฌ๋กค์„ ํ†ตํ•ด์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.

์ด UIScrollView๋Š” ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ๋…€์„์ž…๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ๋งค์ผ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” UITableView, UICollectcionView์™€ ๊ฐ™์€ ์Šคํฌ๋กค์ด ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ Super Class์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ํ…Œ์ด๋ธ”๋ทฐ์™€ ์ปฌ๋ ‰์…˜๋ทฐ์—์„œ ์Šคํฌ๋กค๋ทฐ์˜ ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋กค๋ทฐ๋Š” ๋‘ ๊ฐ€์ง€ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. Content Layout์€ ์Šคํฌ๋กค๋˜๋ฉฐ ํ™”๋ฉด์— ํ‘œํ˜„๋  ์ปจํ…์ธ ๋“ค์˜ ๋ ˆ์ด์•„์›ƒ์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์ž…๋‹ˆ๋‹ค. Frame Layout์€ ํ™”๋ฉด ์•ˆ์—์„œ ์‹ค์ œ๋กœ ํ‘œํ˜„๋˜๋Š” ์Šคํฌ๋กค๋ทฐ์˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์ž…๋‹ˆ๋‹ค.

ScrollView ์˜คํ†  ๋ ˆ์ด์•„์›ƒ ์žก์•„์ฃผ๊ธฐ

์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ UIScrollView๋ฅผ ํ•˜๋‚˜ ๋„ฃ์–ด์ฃผ๊ณ  ๋‹ค๋ฅธ View๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก์•„์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‹ค๋ฅธ View๋“ค๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋ฐ”๋กœ ์ ์šฉ์ด ์•ˆ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค? ์‹ค์งˆ์ ์ธ Contents๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์ด๋ผ๊ณ  ์ถ”์ •ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ •ํ™•ํ•œ ์ด์œ ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•Œ๊ฒŒ ๋˜๋ฉด ์ถ”๊ฐ€ ๋‚ด์šฉ์œผ๋กœ ์ ์–ด๋‘๊ฒ ์Šต๋‹ˆ๋‹ค..! ์•„๋ฌดํŠผ Constraints๋ฅผ ๋ณด๋ฉด ์ž˜ ์ ์šฉ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

View ์ถ”๊ฐ€ํ•˜๊ณ  Layout Guide ์„ค์ •ํ•˜๊ธฐ

์Šคํฌ๋กค๋ทฐ๋งŒ ์žˆ์œผ๋ฉด ์•„๋ฌด ์“ธ๋ชจ๊ฐ€ ์—†๊ฒ ์ฃ ? ์‹ค์ œ๋กœ ์Šคํฌ๋กค ๋  View๋ฅผ ๋„ฃ์–ด๋ด…์‹œ๋‹ค.

์ €๋Š” ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ์Šคํฌ๋กค๋ทฐ์™€ ๊ฒน์น˜๊ฒŒ ์œ„์น˜๋ฅผ ์žก์•„์ฃผ๊ณ  ์ด๋ฆ„๋„ Content View๋ผ๊ณ  ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๊ณผ์ •์€ ์•„๋‹™๋‹ˆ๋‹ค!

์Šคํฌ๋กค ๋  ์‹ค์ œ ์ปจํ…์ธ ๋ฅผ ๋‹ด์„ View์ด๊ธฐ ๋•Œ๋ฌธ์— Content Layout Guide๋ฅผ ์ด View์˜ Layout๊ณผ ๋งž์ถฐ์ค„ ๊ฒ๋‹ˆ๋‹ค. ์ผ์ข…์˜ ๋ฐฐ๊ฒฝ์ด์ž ๋„ํ™”์ง€ ์—ญํ• ์„ ํ•˜๋Š” Content View์˜ ํฌ๊ธฐ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ๊ณผ์ •์ธ๊ฑฐ์—์š”!

Content View๋ฅผ Ctrlํ‚ค๋ฅผ ๋ˆ„๋ฅธ ์ƒํƒœ๋กœ Content Layout Guide๊นŒ์ง€ ๋Œ์–ด๋‹น๊ธฐ๋ฉด ๋‘ ์š”์†Œ๊ฐ„์˜ ๋ ˆ์ด์•„์›ƒ์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Content View์˜ ํฌ๊ธฐ๊ฐ€ ๊ณง ์Šคํฌ๋กค๋ทฐ์— ๋“ค์–ด๊ฐˆ ์ปจํ…์ธ ์˜ ํฌ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์— Leading, Top, Trailing, Bottom์˜ Spacing์„ ๋ชจ๋‘ 0์œผ๋กœ ์„ค์ •ํ•ด์ค์‹œ๋‹ค.

ํ˜„์žฌ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ๋†“์—ฌ์ง„ ๊ฐ’ ๊ทธ๋Œ€๋กœ Constant ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋‘ 0์ด ๋งž๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋Š” ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

Scroll View์˜ ๋ฐฉํ–ฅ ์ •ํ•ด์ฃผ๊ธฐ

์ €๋Š” ์„ธ๋กœ๋กœ ์Šคํฌ๋กค๋˜๋Š” ํ™”๋ฉด์„ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์ด ์„ธ๋กœ๋กœ ์Šคํฌ๋กค๋  ๋•Œ ๋„“์ด์™€ ๋†’์ด ์ค‘์— ๊ณ ์ •๋˜์–ด ์žˆ๋Š” ๊ฐ’์€ ๋„“์ด์ฃ ?

์Šคํฌ๋กค๋ทฐ์˜ Frame Layout Guide๋Š” ๋„“์ด๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ์„ธ๋กœ๋กœ ์Šคํฌ๋กค๋˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋†’์ด๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ฐ€๋กœ๋กœ ์Šคํฌ๋กคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™œ Frame Layout Guide๋ฅผ ์„ค์ •ํ•ด์ค˜์•ผ ํ•˜๋Š”์ง€ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, Frame Layout์€ ์‹ค์ œ ์Šคํฌ๋กค๋ทฐ๊ฐ€ ํ‘œํ˜„๋  Layout์ด๋ผ๊ณ  ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Frame Layout์˜ ๋„“์ด๋ฅผ ์ปจํ…์ธ ์˜ ๋„“์ด์™€ ๊ฐ™๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ Frame ๋ฐ–์— ๊ฐ€๋กœ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ปจํ…์ธ ๊ฐ€ ๋” ์ด์ƒ ์—†๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ๊ฐ€๋กœ๋Š” ๊ณ ์ •๋˜๊ณ  ์„ธ๋กœ๋กœ๋งŒ ์Šคํฌ๋กค๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ Content Layout์„ ์žก์•„์คฌ์„ ๋•Œ์ฒ˜๋Ÿผ Content View๋ฅผ Ctrlํ‚ค๋ฅผ ๋ˆ„๋ฅธ์ฑ„๋กœ Frame Layout Guide์— ๋Œ์–ด๋†”์ค๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ๋‚˜์˜ค๋Š” Constraint ์„ค์ • ์ฐฝ์—์„œ Equal Width๋ฅผ ์„ ํƒํ•ด์„œ ๊ฐ€๋กœ๋ฅผ ๊ฐ–๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์œ„์—์„œ์ฒ˜๋Ÿผ ์ˆ˜์น˜๊ฐ€ ํ˜„์žฌ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ๋งž๊ฒŒ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ ํ™•์ธํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ๋น„์œจ๋กœ์„œ ๋‹ค๋ค„์ง€๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— Multiplier๊ฐ€ 1์ธ์ง€ ํ™•์ธํ•ด์ค๋‹ˆ๋‹ค!

๋†’์ด ์ •ํ•ด์ฃผ๊ธฐ

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์Šคํฌ๋กค๋ทฐ๋ฅผ ์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ์„ค์ •ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์•„์ง ๋นจ๊ฐ„ ์—๋Ÿฌ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์•˜์ฃ ? ์ปจํ…์ธ ์˜ ๋„“์ด๋Š” ์Šคํฌ๋กค๋ทฐ์˜ Frame Layout๊ณผ ๊ฐ™๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ•ด์กŒ์ง€๋งŒ, ๋†’์ด๋Š” ์•„์ง ์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Content View์˜ ๋†’์ด๋ฅผ ๊ณ ์ • ๊ฐ’์œผ๋กœ ์ •ํ•ด์ฃผ๊ฑฐ๋‚˜, ์‹ค์ œ๋กœ ๋‚ด๋ถ€์— ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์ง‘์–ด๋„ฃ์–ด์ฃผ๋ฉด ํ•ด๋‹น ์—๋Ÿฌ๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

์ถ”์ฒœํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” Content View์— ๋†’์ด ๊ฐ’์„ ์ฃผ๋˜, Priority๋ฅผ ๋‚ด๋ ค์ฃผ์–ด์„œ ์ •ํ•ด์ง„ ๋†’์ด ์ด์ƒ์ด ํ•„์š”ํ•˜๋ฉด ๋™์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Content View๋ฅผ Ctrlํ‚ค๋ฅผ ๋ˆ„๋ฅธ์ฑ„๋กœ ๋Œ์—ˆ๋‹ค๊ฐ€ Content View ๋ณธ์ธ์—๊ฒŒ ๋†”์ค๋‹ˆ๋‹ค. ๊ทธ ์ƒํƒœ์—์„œ Height๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด, ํ˜„์žฌ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ์„ค์ •๋œ ๋†’์ด๊ฐ€ Constraint์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

Priority๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Constraint์—์„œ ์ˆ˜์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์ธ 1000์—์„œ ๋‚ฎ์€ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ค์‹œ๋‹ค! ์ด ๊ฐ’์€ ๋‚ด๋ถ€์— ๋“ค์–ด์˜ฌ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๋†’์ด Priority๋ณด๋‹ค ๋‚ฎ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๋„‰๋„‰ํ•˜๊ฒŒ 250์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์—๋Ÿฌ๊ฐ€ ์—†๋Š” ๊น”๋”ํ•œ ์Šคํ† ๋ฆฌ๋ณด๋“œ๊ฐ€ ๋˜์—ˆ๋„ค์š”.

UIScrollView๋Š” ๋‹ค๋ฃจ๊ธฐ ๊ต‰์žฅํžˆ ๊นŒ๋‹ค๋กœ์šด ๋…€์„์ด์ง€๋งŒ, ๊ฐœ๋… ์ž์ฒด๋Š” ์‰ฌ์šด ๊ฒƒ ๊ฐ™์•„์š”. ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ๋‹ค๋ฃฌ๋‹ค๋ฉด ์ต์ˆ™ํ•ด์ง€๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!