Swift
[iOS] FlexLayout + PinLayout
JSKoder
2023. 6. 29. 21:01
FlexLayout + PinLayout
개요: Yoga(Facebook) 기반의 Flexbox 구현에 Swift 인터페이스를 추가. UIStackView에 비해 8 ~ 12배 빠른 속도
두 프레임워크는 유사한 방식과 메서드명을 공유한다. PinLayout은 CSS의 절대적인 포지셔닝에서 영감을 얻었으며, 일반적인 제어 및 애니메이션에 매우 유용하다. 한 번에 하나의 보기를 레이아웃으로 전체 제어를 제공한다.(코딩 및 결함이 간단함.)
🎯 핵심
- Pinlayout은 세밀화한 작업에, Flexlayout은 큼지막한 작업에 적합하다.
📜 규칙
- layoutSubview에서 레이아웃 위치를 잡아줘야 한다.
📏 FlexLayout의 Grow와 Shrink
FlexLayout은 Flexbox 개념에서 grow
와 shrink
라는 두 가지 중요한 속성을 지원한다.
grow
: 이 속성은 뷰가 가용 공간을 채우기 위해 얼마나 성장할 수 있는지를 결정. 기본 값은 0이며, 양의 값은 주 축 방향의 남은 공간에 대한 뷰의 성장 가능성을 나타낸다.shrink
: 이 속성은 뷰가 필요한 공간이 부족할 때 얼마나 줄어들 수 있는지를 결정. 기본 값은 1이며, 양의 값은 주 축 방향의 부족한 공간을 상쇄하기 위한 뷰의 줄어듦 가능성을 나타낸다. >> UIKit에서 Label의 Autoshrink와 같은 역할을 진행하는듯?
📍 PinLayout의 기준점(anchor point) 설정
PinLayout은 뷰의 크기와 위치를 조정할 때 기준점을 설정하는데 사용. 기준점은 뷰의 좌표를 결정하는데 사용되는 포인트. 이는 다음의 메서드를 사용해 설정할 수 있다.
anchor(: CGPoint)
: 뷰의 기준점을 설정한다. CGPoint는 (0,0)에서 (1,1) 사이의 값을 가진다. 예를 들어, (0,0)은 뷰의 왼쪽 상단, (1,1)은 뷰의 오른쪽 하단이며, (0.5,0.5)는 뷰의 중심이다.anchor(: HorizontalAlign, _: VerticalAlign)
: 수평 및 수직 정렬을 사용하여 뷰의 기준점을 설정한다.
🧭 원칙 및 철학
- Flexbox는 간단하고 강력하며 빠름.
- FlexLayout 구문은 간결하고 연결이 가능함.
- 수동레이아웃보다 빠름.
📌 PinLayout 연산자
RTL(Right To Left): LTR 언어를 지원하는 오른쪽에서 왼쪽으로 텍스트를 읽는 언어
LTR(Left To Right): 왼쪽에서 오른쪽으로 텍스트를 읽는 언어
정렬 연산자
.left
: 뷰의 왼쪽 가장자리가 첫 번째 보기에 왼쪽 정렬..center
: 뷰의 첫번째 보기가 수평 가운데 정렬.right
: 뷰의 오른쪽 가장자리가 첫 번째 보기에 오른쪽 정렬.start
: LTR >.left
, RTL >.right
.end
: LTR >.right
, RTL >.left
.top
: 뷰의 위쪽 가장자리가 첫 번째 보기와 위쪽 정렬..center
: 뷰가 첫 번째 뷰와 수직 가운데 정렬..bottom
: 뷰의 아래쪽 가장자리가 첫 번째 뷰와 아랫쪽 정렬.
모서리 레이아웃
top
,bottom
,left
,right
함수들은 각각 상단, 하단, 왼쪽, 오른쪽 가장자리를 배치 >> SnapKit과 비슷?top().right()
>>topRight()
+ 사이즈 설정.size
vCenter
와hCenter
는 수평, 수직 중심 설정.- LTR(왼쪽에서 오른쪽) 또는 RTL(오른쪽에서 왼쪽) 언어에 따라
start
,end
함수들이 사용됩니다. all
함수는 모든 가장자리를 동시에 배치하고,horizontally
와vertically
함수는 각각 수평, 수직 방향의 가장자리를 배치합니다.
가장자리 정렬 레이아웃
above(of: UIView)
: 지정된 뷰 위에 뷰를 배치합니다.below(of: UIView)
: 지정된 뷰 아래에 뷰를 배치합니다.before(of: UIView)
: LTR(왼쪽에서 오른쪽) 방향에서 보기는 지정된 뷰의 왼쪽에, RTL(오른쪽에서 왼쪽) 방향에서는 오른쪽에 배치됩니다.after(of: UIView)
: LTR 방향에서 보기는 지정된 뷰의 오른쪽에, RTL 방향에서는 왼쪽에 배치됩니다.left(of: UIView)
: 지정된 뷰의 왼쪽에 뷰를 배치합니다.right(of: UIView)
: 지정된 뷰의 오른쪽에 뷰를 배치합니다.
다른 뷰 사이 레이아웃
horizontallyBetween(: UIView, and: UIView)
: 지정된 두 뷰 사이에 뷰를 수평으로 배치verticallyBetween(: UIView, and: UIView)
: 지정된 두 보기 사이에 세로 보기를 배치
정렬이 있는 다른 보기 사이의 레이아웃
horizontallyBetween(: UIView, and: UIView, aligned: VerticalAlign)
verticallyBetween(: UIView, and: UIView, aligned: HorizontalAlign)
제약조건(anchor)
- 그림으로 대체
너비, 높이 및 크기
width(또는 height)(:CGFloat)
: 뷰의 너비를 픽셀로 지정width(또는 height)(of: UIView)
: 참조된 뷰의 높이와 일치하게 설정width(또는 height)(N%)
: 뷰의 너비와 높이를 픽셀(또는 슈퍼 뷰의 백분율)로 지정. 값은 음수가 아니여야 한다.
크기조정 메서드
sizeToFit()
sizeToFit(: FitType)
: 매개변수 값에 따라 보기의 너비 또는 높이를 조정함.
최소 및 최대 너비 또는 높이를 설정하는 메서드
minWidth(또는 minHeight)(:CGFloat)
minWidth(또는 minHeight)(:Percent)
maxWidth(또는 maxHeight)(:CGFloat)
maxWidth(또는 maxHeight)(:Percent)
여백
- CSS와 유사한 방식
marginTop,left,bottom,right
: 상단 여백을 픽셀 또는 슈퍼뷰 높이의 백분율로 설정 >> 퍼센트도 가능함.marginStart, marginEnd
: 시작, 종료 여백을 설정
📐 Flexlayout 연산자
Direction
: 주축을 설정하여 flex 아이템이 플렉스 컨테이너에 어떻게 배치될지 결정, column, columnReverse, row, rowReverse 값을 가질 수 있다.JustifyContent
: 플렉스 컨테이너의 주축을 따라 플렉스 아이템이 어떻게 배치될지 결정, start, end, center, spaceBetween, spaceAround, spaceEvenly 값을 가질 수 있다.AlignItems
: 교차 축을 따라 플렉스 아이템이 어떻게 배치될지 결정, stretch, start, end, center, baseline 값을 가질 수 있다.AlignSelf
: 교차 축에서 자식 아이템이 어떻게 배치될지 결정, 이 속성은 부모의 alignItems를 무시한다. auto, stretch, start, end, center, baseline 값을 가질 수 있다.Wrap
: 플렉스 컨테이너가 단일 행 또는 여러 행을 가지도록 설정, noWrap, wrap, wrapReverse 값을 가질 수 있다.AlignContent
: 플렉스 컨테이너의 교차 축에서 플렉스 라인이 어떻게 배치될지 결정, start, end, center, stretch, spaceBetween, spaceAround 값을 가질 수 있다.LayoutDirection
: 플렉스 컨테이너의 레이아웃 방향을 제어, LTR(왼쪽에서 오른쪽)과 RTL(오른쪽에서 왼쪽) 언어를 지원. 이 값을 설정하면 start 또는 end 속성을 사용하여 뷰를 위치시키면서 언어에 따른 스크린의 왼쪽 또는 오른쪽에 배치될지 고려할 필요가 없다.