- 목표 : CGAffineTransform을 적용할 때, 각 적용 종류 별 적용되는 기준점을 이해하고, Constraint와 같이 적용했을 때 정확히 어떻게 동작하는 지에 대해서 이해하기
CGAffineTransform의 생성자를 보면 Scale/Translation/Rotation 이 세가지 값으로 생성할 수 있으며, 동시에 여러 CGAffineTransform을 적용하려면 생성된 다수의 인스턴스를 내부 메서드인 concatenating을 호출하여 조합할 수 있다.
그런데, 정확히 이해하지 못한 내용은 Scale/Translation/Rotation을 적용하면 뷰에 어느 기준점을 기준으로 적용되서 마지막에 반영되는 지 이해하지 못하고 있었다. 이 부분을 이해해보자.
Scale(scaleX sx: CGFloat, y sy: CGFloat)
X 및 Y 축에 대한 스케일 값을 파라미터로 생성되는 Scale을 적용할 때 뷰의 어느 위치를 기준으로 증감하는 지 바로 적용해서 확인해보자.
일단 파라미터로 전달되는 X, Y는 말그대로 가로축과 세로축에 대한 스케일 조정이다.
그리고 조정해본 결과 스케일의 확대 및 축소는 Center를 기준으로 진행된다.
Translation(translationX tx: CGFloat, y ty: CGFloat)
X 및 Y로 전달되는 CGFloat 값 만큼 이동된다. 마치 Frame의 Origin의 위치가 변경되는 듯한 느낌이라고 생각하면 된다.
해당 Translation은 센터를 기준으로 움직이던, Origin을 기준으로 움직이던 둘 다 동일한 형태이므로 딱히 기준이 없다라고 생각하면 되고, Scale/Rotation과의 통일성을 위해서 Center를 기준으로 진행된다고 보는 것이 좋겠다.
Rotation(rotationAngle angle: CGFloat)
전달되는 CGFloat값에 의해 뷰가 회전된다. 참고로 CGFloat에는 pi라고하는 값이 static으로 존재하며, 해당 파이는 180도를 의미한다.
전달되는 값은 음수이던 양수이던 절대값을 기준으로 하는 것 같고, 시계방향으로 돈다고 생각하면 된다.
회전은 뷰의 Center를 기준으로 진행된다.
Constraints와의 관계
테스트를 진행하면서 CGAffineTransform은 뷰의 Constraint에 의해 일절 영향을 받지 않는다는 점이다. 사실 뷰의 제약조건은 뷰를 셋업하는 시점에서 진행하기 때문에 레이아웃을 실시간으로 변경하는 CGAffineTransform은 이후에 적용되는 케이스일 수 밖에 없다. 이런 관점에서 CGAffineTransform을 적용한다고해서 Constraint에 의해 강제로 적용이 안된다던가 이런 이슈는 발생하지 않는다. 제약 조건은 뷰의 최초 프레임일 제약 조건에 의해 결정하는 것이며, 제약 조건을 사용하는 이유는 뷰의 오리엔테이션이 변경됨에도 동일한 레이아웃을 보여주기 위해 적용하는 이유가 하나 있으므로, 그런 의미로써 CGAffineTransform은 프레임이 결정된 뷰를 실시간 렌더링하여 스케일, 위치 이동, 회전등을 진행하는 것이라고 보면 되겠다.
'스위프트' 카테고리의 다른 글
[Swift] NSCoding, NSSecureCoding 고촬 (0) | 2022.03.11 |
---|---|
[Swift] FileManager에 대해 알아보자 (0) | 2022.02.23 |
[Swift] Swift Package Manager로 프레임워크를 만들고 불러오자 (0) | 2022.01.26 |
[Swift] UICollectionViewDrag & DropDelegate (0) | 2022.01.17 |
[CoreGraphics] CGContext를 통해 뷰를 커스터마이징하게 그려보자 (0) | 2022.01.17 |