Published on

๐Ÿ“ฑ iOS - Bounds vs Frame

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

์˜ค๋Š˜์€ frame๊ณผ bounds์˜ ์‹ค์ฒด์™€ ์ฐจ์ด์ ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณผ๊ฑฐ์—์š”. ๋‘ ์นœ๊ตฌ ๋ชจ๋‘ ์ฝ”๋“œ ์ƒ์—์„œ UIView์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•  ๋•Œ ์ž์ฃผ ๋ณด๊ฒŒ ๋˜๋Š” ์šฉ์–ด๋“ค์ด์ฃ . ๊ทผ๋ฐ ์ง€๊ธˆ๊นŒ์ง€๋Š” ๊ทธ๋ƒฅ ๋‘˜ ๋‹ค ์จ๋ณด๊ณ  ์ œ๊ฐ€ ์›ํ•˜๋˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์œผ๋ฉด ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์Šต๋‹ˆ๋‹ค. view.bounds.width = 32.0์™€ ๊ฐ™์€ ์ž‘์—…๋“ค์ด์š”.

๊ทธ๋ž˜์„œ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

frame

bounds

์šฐ์„  ๋ˆˆ์— ๋„๋Š” ์ ์€ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘ CGRect๋ผ๋Š” ํƒ€์ž…์œผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. CGRect ์ด ์นœ๊ตฌ๋„ ๋ญ”๊ฐ€ ์•„๋ฌด ์ƒ๊ฐ์—†์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋Š”๋ฐ ์ œ๋Œ€๋กœ ์•Œ์•„๋ณธ ์ ์€ ์—†๋„ค์š”. ๊ทธ๋ž˜์„œ ๋จผ์ € CGRect์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

CGRect

์ผ๋‹จ ๋ฐ˜๋ณต๋œ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด์„œ ์ด ์•„์ด๊ฐ€ ๋Œ€์ถฉ View์˜ ์˜์—ญ์„ ํ‘œํ˜„ํ•œ๋‹ค๋Š” ์ ์€ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ณต๋˜๋Š” ์ƒ์„ฑ์ž๋“ค์„ ๋ณด๋ฉด

  • init(origin: CGPoint, size: CGSize)
  • init(x: Double, y: Double, width: Double, height: Double)
  • init(x: Int, y: Int, Width: Int, height: Int)
  • init(x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat) ์ด๋Ÿฐ ์‹์œผ๋กœ ์ขŒํ‘œ๊ฐ’๊ณผ ๋„“์ด, ๋†’์ด๋ฅผ ๋ฐ›๊ณ  ์žˆ๊ฑฐ๋“ ์š”.

๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์• ํ”Œ์˜ ์„ค๋ช…์„ ๋ด…์‹œ๋‹ค.

CGRect

A structure that contains the location and dimensions of a rectangle.

์šฐ์„  CGRect๋Š” ๋‹ค๋ฅธ ๊ธฐ๋ณธ ํƒ€์ž…๋“ค๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ตฌ์กฐ์ฒด์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๊ฐํ˜•์˜ ์œ„์น˜์™€ ํฌ๊ธฐ ์ •๋ณด๋ฅผ ์ง€๋‹ˆ๋Š” ๊ตฌ์กฐ์ฒด๋ผ๊ณ  ํ•˜๋„ค์š”!

์–ด๋Š์ •๋„ ๊ฐ์œผ๋กœ ์•Œ๋˜ ๊ฑฐ์˜ ๊ทธ๋Œ€๋กœ๋„ค์š”. ๊ทธ๋ฆฌ๊ณ  Rect๋Š” ์‚ฌ๊ฐํ˜•์„ ํ‘œํ˜„ํ•˜๋Š” ์ž‘๋ช…์ด์˜€์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋‹ค ์•Œ์•„๋ƒˆ์–ด์š”. CGRect๋Š” ์–ด๋–ค ํ•œ ๊ธฐ์ค€์ (origin) ๊ณผ ํฌ๊ธฐ(size) ๋ฅผ ๊ฐ–๊ณ  ์‚ฌ๊ฐํ˜•์„ ํ‘œํ˜„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ธ ๊ฒƒ์ด์ฃ .

๊ฐ€์žฅ ์ฒซ ๋ฒˆ์งธ ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด CGPoint ํƒ€์ž…์˜ ๊ธฐ์ค€์ ๊ณผ CGSize ํƒ€์ž…์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๋ฉด,

  • CGPoint: ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…
    • ex: (1, 2)
  • CGSize: ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž…
    • ex: 15(width) * 4(height)

CGSize&CGRect

์‚ฌ๊ฐํ˜•์€ ๋„ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ฆผ์œผ๋กœ ๋ณผ ๋•Œ ๊ฐ€์žฅ ์ดํ•ด๊ฐ€ ๋น ๋ฅด๊ฒ ์ฃ ? ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๊ธฐ์ค€์ (origin)๊ณผ ๊ทธ ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ํฌ๊ธฐ(size) ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ CGRect์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด CGRect๋Š” โ€œ์–ด๋””์— ์–ด๋–ค ํฌ๊ธฐ๋กœ UI ์š”์†Œ๋ฅผ ๊ทธ๋ฆฌ๊ฒ ๋‹ค.โ€๋ฅผ ์‚ฌ๊ฐํ˜• ์˜์—ญ์œผ๋กœ ์ง€์ •ํ•ด ์ค„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€๋งŒ ์œ ์˜ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. width๋Š” ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฅธ์ชฝ์ด positive, height๋Š” ๊ธฐ์ค€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜์ชฝ์ด positive์ž…๋‹ˆ๋‹ค.

frame, bounds

์ด์ œ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์„œ frame๊ณผ bounds์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์„ค๋ช…์„ ํ•œ ๋ฒˆ ๋ณผ๊นŒ์š”?

frame:

The frame rectangle, which describes the viewโ€™s location and size in its superviewโ€™s coordinate system.

frame์€ superview(์ƒ์œ„ view)์˜ ์ขŒํ‘œ ์•ˆ์—์„œ view์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

bounds:

The bounds rectangle, which describes the viewโ€™s location and size in its own coordinate system.

bounds๋Š” ๋ณธ์ธ์˜ ๊ณ ์œ ํ•œ ์ขŒํ‘œ ์•ˆ์—์„œ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ๋œป์€ ์ •ํ™•ํ•˜๊ฒŒ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์ด ๋ณด์ž…๋‹ˆ๋‹ค. frame์€ ์ƒ์œ„ view์˜ ์ขŒํ‘œ ์•ˆ์—์„œ CGRect๊ฐ€ ์ •์˜๋œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , bounds๋Š” ๊ณ ์œ ํ•œ ์ขŒํ‘œ ์•ˆ์—์„œ CGRect๊ฐ€ ์ •์˜๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

๊ทธ๋ž˜๋„ ๊ฐ์ด ์กฐ๊ธˆ์€ ์˜ค๋Š” frame๋ถ€ํ„ฐ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

FrameBoundsCanvas

frame

์ด๋ ‡๊ฒŒ ์ƒ๊ธด ํ™”๋ฉด ๊ตฌ์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ด…์‹œ๋‹ค.

FrameHierarchy

โ€œSuperView โžก๏ธ ParentView โžก๏ธ ChildViewโ€œ์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํ•˜์œ„ view๋Š” ์ƒ์œ„ view์— nested๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ ์ด ์ƒํƒœ์—์„œ ParentView์™€ ChildView์˜ frame์„ ์ถœ๋ ฅํ•˜๋ฉด ์–ด๋–ค ๊ฐ’์ด ๋‚˜์˜ค๋Š”์ง€ ํ•œ ๋ฒˆ ๋ณผ๊ฒŒ์š”.

FrameTest

frame์€ ์ƒ์œ„ View ์•ˆ์—์„œ์˜ CGRect๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์ถœ๋ ฅ์€ ์ˆœ์„œ๋Œ€๋กœ x์ขŒํ‘œ, y์ขŒํ‘œ, ๋„ˆ๋น„, ๋†’์ด์˜€์ฃ ?

FrameTest2

ParentView์˜ CGPoint์™€ CGSize์— ์ˆ˜์น˜๋ฅผ ๋ฉ”๊ฒจ๋ณด์•˜์Šต๋‹ˆ๋‹ค. frame์€ ์–ด๋Š์ •๋„ ๋Š๋‚Œ์ด ์˜ค์ฃ ?

ParentView์˜ ๊ธฐ์ค€์ (origin)์ด ์ƒ์œ„ ๋ทฐ์ธ SuperView์˜ ๊ธฐ์ค€์ (origin)์—์„œ (24, 186)๋งŒํผ ๋–จ์–ด์ ธ์žˆ๊ณ , ํฌ๊ธฐ(size)๋Š” (342, 472)๋ผ๋Š” ๊ฒƒ์ด์ฃ !

frame์˜ ์„ค๋ช… ๊ทธ๋Œ€๋กœ ํ•ด๋‹น View์˜ ์ƒ์œ„ View์— ๋Œ€ํ•œ ์ขŒํ‘œ๊ฐ’์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ๋Œ€๋กœ ์ดํ•ดํ•œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ParentView์˜ ๊ธฐ์ค€์ (origin)์„ ํ•œ๋ฒˆ (0, 0)์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ํฌ๊ธฐ(size)๋„ (320, 380)์œผ๋กœ ์ค„์—ฌ๋ด…์‹œ๋‹ค.

FrameTest3

์™ผ์ชฝ์ด ๋ณ€๊ฒฝ ์ „, ์˜ค๋ฅธ์ชฝ์ด ๋ณ€๊ฒฝ ํ›„์ž…๋‹ˆ๋‹ค. ์ž˜ ๋ณด๋ฉด, Child View๋Š” ๋ณ€ํ•œ ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. ์ ˆ๋Œ€์ ์ธ ์œ„์น˜๋Š” Parent View์˜ ์œ„์น˜๊ฐ€ ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์ด ๋ฐ”๋€ ๊ฒƒ์ด๊ณ , ๊ธฐ์ค€์ (origin)์ด๋‚˜ ํฌ๊ธฐ(size)๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ParentView์˜ CGRect๋Š” ๋‹น์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ค€์ (origin)์˜ ์ขŒํ‘œ๊ฐ€ (0, 0)์ด ๋˜์—ˆ๊ณ , ํฌ๊ธฐ๋„ (320, 380)์œผ๋กœ ์ค„์–ด๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํ™•์‹คํ•˜๊ฒŒ ์•Œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค! frame์€ ์ƒ์œ„ View์— ๋Œ€ํ•œ ์ขŒํ‘œ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์œ„ View์˜ ๊ธฐ์ค€์ (origin)์ด ์ด๋™ํ•˜๋ฉด ํ•จ๊ป˜ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

bounds

์ด๋ฒˆ์—” ์„ค๋ช…์ด ์กฐ๊ธˆ ๋ชจํ˜ธํ•œ bounds๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ์„  ์•„๊นŒ ์˜ˆ์‹œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์„œ bounds ๊ฐ’์„ ์ฐ์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

BoundsPrint

๋‘ View ๋ชจ๋‘ ๊ธฐ์ค€์ (origin) ์ด (0, 0)์ด ๋‚˜์˜ค๋„ค์š”..?? ๐Ÿค”

๋„ค ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.. frame๊ณผ ๋‹ค๋ฅด๊ฒŒ bounds๋Š” โ€œ๋ณธ์ธ์˜ ๊ณ ์œ ํ•œ ์ขŒํ‘œโ€๋ผ๋Š” ๋ง์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ƒ์œ„ View์™€๋Š” ์•„๋ฌด๋Ÿฐ ๊ด€๋ จ ์—†์ด ๊ฐ–๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ž ์—ฌ๊ธฐ๊นŒ์ง„ ์•Œ๊ฒ ๊ณ , ๊ทธ๋Ÿผ bounds๊ฐ’์— ๋ณ€ํ˜•์„ ์ค˜๋ณผ๊นŒ์š”?

self.parentView.bounds.origin = CGPoint(x: 50, y: 100)

์ด๋ ‡๊ฒŒ ํ•œ ๋ฒˆ Parent View์˜ bounds๋ฅผ (50, 100)๋งŒํผ ์ด๋™์‹œ์ผœ๋ณผ๊ฒŒ์š”.

BoundsEx

์Œ.. ParentView๋Š” ๊ฐ€๋งŒํžˆ ์žˆ๊ณ , ChildView๊ฐ€ ์™ผ์ชฝ ์œ„๋กœ ์ด๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿค”๐Ÿค”๐Ÿค”

์ „ํ˜€ ๋ชจ๋ฅด๊ฒ ๋„ค์š”. ์™œ์ฃ ..?

bounds๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ € ํ™”๋ฉด์„ ์กฐ๊ธˆ ๋” ๋„“๊ฒŒ ๋ณผ ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. frame์ด์•ผ ์ € ์‚ฌ๊ฐํ˜•์˜ View ์ž์ฒด๋ฅผ ์ด๋™์‹œํ‚จ ๊ฒƒ์ด ๋งž์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ bounds์˜ ๊ฒฝ์šฐ์—๋Š” View๋ฅผ ์›€์ง์ด๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ•ด๋‹น View ์•ˆ์—์„œ ๋ณด์ด๋Š” ๊ณต๊ฐ„์˜ ์ขŒํ‘œ๋ฅผ ๋ฐ”๊ฟ”์ค€๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๋„ค ์–ด๋ ต์ฃ ..? (์•„๋‹Œ๊ฐ€์š”? ์ €๋งŒ ์–ด๋ ต๋‚˜์š”?)

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์ง„์„ ํ™•๋Œ€ํ•ด์„œ ๋ณผ ๋•Œ ํ•œ ์ ์„ ์ฐ๊ณ  ๋“œ๋ž˜๊ทธ๋ฅผ ํ•˜์ฃ ?

Pointer

์š” ํฌ์ธํ„ฐ ์žˆ์ž–์•„์š”?

์ด ํฌ์ธํ„ฐ๋กœ ๋”ฑ ์ฐ์€ ๊ทธ ์ ์ด ๋ฐ”๋กœ ๊ธฐ์ค€์ (origin)์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๊ทธ ์ ์„ ๋ˆ„๋ฅด๊ณ  ์˜ค๋ฅธ์ชฝ ์•„๋ž˜(50, 100)๋กœ ๋‚ด๋ฆฐ๊ฒ๋‹ˆ๋‹ค!

PointerDrag

๊ทธ๋Ÿฌ๋ฉด ์‚ฌ์ง„์€ ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? ์™ผ์ชฝ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ‘๋‹ˆ๋‹ค.

ParentView๋Š” ์•ˆ์— ์žˆ๋Š” ๋‹ค๋ฅธ View๋“ค์„ ๋‹ด๊ณ  ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋˜ ๋‹ค๋ฅธ ํ™”๋ฉด์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ™”๋ฉด์—์„œ ๋“œ๋ž˜๊ทธ๋ฅผ ํ•ด์„œ ๋ณด๊ณ  ์žˆ๋Š” ํ™”๋ฉด์„ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด์ฃ .

๊ทผ๋ฐ ์ €๊ฒŒ ํ™”๋ฉด์ด๋ฉด, ๋ฐ–์œผ๋กœ ํŠ€์–ด๋‚˜์˜ค๋ฉด ์•ˆ๋˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?

๋งž์•„์š”. ๊ทธ๋ž˜์„œ ํŠ€์–ด๋‚˜์˜ค์ง€ ์•Š๋„๋ก ํ•ด์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. clipsToBounds๋ผ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ true๋กœ ํ•ด์ฃผ๋ฉด

ClipsToBounds

์ด๋ ‡๊ฒŒ ํ™”๋ฉด์—์„œ ๋ฒ—์–ด๋‚œ View๋ฅผ ์ž˜๋ผ์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž ๊ทธ๋Ÿฐ๋ฐ ์œ„์—์„œ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด์„œ ์ด๋ฏธ์ง€๋ฅผ ํ™•๋Œ€ํ•ด์„œ ๋“œ๋ž˜๊ทธํ•˜๋Š” ์ƒํ™ฉ์„ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ์—ˆ์ฃ ? ์‚ฌ์‹ค ์ •ํ™•ํžˆ ์ด ์ƒํ™ฉ์„ ์‚ฌ์šฉํ•˜๋Š” UI ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ScrollView์—์š”. ScrollView์—์„œ ๋“œ๋ž˜๊ทธ๋ฅผ ํ•  ๋•Œ ์‚ฌ์‹ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ํ•ด๋‹น View์˜ bounds๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ฐ”๊ฟ”์ฃผ๊ณ  ์žˆ๋Š” ๊ฒ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‚ฌ์‹ค์€ ScrollView์˜ contentOffset์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ˜น์‹œ size๋Š” frame๊ณผ bounds์—์„œ ๋ณ„ ์ฐจ์ด๊ฐ€ ์—†์–ด์„œ ์–ธ๊ธ‰์ด ์—†๋Š”๊ฑด๊ฐ€์š”?

์•„๋‹™๋‹ˆ๋‹ค. ์ƒ๋‹นํžˆ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์–ด์š”. ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๊ธฐ์ค€์ (origin) ์— ์ดˆ์ ์„ ๋งž์ถฐ์„œ ๊ณต๋ถ€ํ–ˆ์ฃ ? ๊ทธ๋„ ๊ทธ๋Ÿด๊ฒŒ ๋‘ ์˜ˆ์‹œ ๋ชจ๋‘ ํฌ๊ธฐ๋Š” ๋™์ผํ•˜๊ฒŒ ๋‚˜์™”๊ฑฐ๋“ ์š”. ๊ทธ๋ž˜์„œ ํฌ๊ธฐ๋Š” frame๊ณผ bounds๊ฐ€ ๋™์ผํ•˜๋ƒ?ํ•˜๋ฉด, ๊ทธ๊ฑด ๋˜ ์•„๋‹™๋‹ˆ๋‹ค.

์ด ์ฐจ์ด๋Š” View๋ฅผ ํšŒ์ „์‹œํ‚ฌ ๋•Œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Rotate

์œ„์™€ ๊ฐ™์ด View ํ•˜๋‚˜๋ฅผ 45๋„ ๋Œ๋ ค๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ์˜ frame.size์™€ bounds.size๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด,

RotatePrint

๋ถ„๋ช… ํ•˜๋‚˜์˜ View์˜ size์ธ๋ฐ ๋‘ ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ต๋‹ˆ๋‹ค.

frame์˜ ๊ฒฝ์šฐ View๋ฅผ ๊ฐ์‹ธ๊ณ  ์žˆ๋Š” ์‚ฌ๊ฐํ˜•์˜ ์ขŒํ‘œ์™€ ํฌ๊ธฐ ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์™œ๋ƒ๋ฉด ์ƒ์œ„ View์— ๋Œ€ํ•œ ์ƒ๋Œ€์  ์ขŒํ‘œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํžˆ ์‚ฌ๊ฐํ˜•์˜ ํ˜•ํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๋ฐ˜๋ฉด bounds๋Š” ํšŒ์ „์ด ๋๋‹ค๋ฉด ๋œ ์ƒํƒœ ๊ทธ ๋ชจ์Šต ๊ทธ๋Œ€๋กœ์˜ ์ขŒํ‘œ์™€ ํฌ๊ธฐ ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๋ณธ์ธ๋งŒ์˜ ๊ณ ์œ ํ•œ ์ขŒํ‘œ๊ณ„์— ๋Œ€ํ•œ ๊ฐ’์ด๊ธฐ ๋–„๋ฌธ์ž…๋‹ˆ๋‹ค.

FramevsBounds

์ถœ์ฒ˜: iOS Frame vs Bounds

์‚ฌ์ง„์œผ๋กœ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋งค์šฐ ๋น ๋ฅผ ๊ฒƒ ๊ฐ™์•„์„œ StackOverflow์—์„œ ์ด๋ฏธ์ง€๋ฅผ ํ•˜๋‚˜ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.