본문 바로가기
🍎 iOS/UIKit

[UIKit] UIView(3)

by hyebin (Helia) 2022. 3. 30.

서브 클래싱 노트

UIView 클래스는 시각적 콘텐츠와 더불어 유저 상호작용 제공을 위한 중요한 서브 클래싱 지점입니다.

view를 상속받는 것은 view를 구현하고 성능을 조정하기 위해 더 많은 작업들이 필요합니다.

따라서 UIView클래스가 제공하지 않는 것이 있을 때만 구현하는 것이 좋습니다. 

 

오버라이드 할 함수들

UIView를 상속받을 때 반드시 오버라이드 해야 하는 소수의 메서드들이 있고, 필요에 따라 오버라이드 할 수 있는 메서드들도 있습니다.

UIView는 유연하게 설정 가능한 클래스이기 때문에 커스텀 메서드를 오버라이드 하지 않고 정교한 뷰 동작으로 구현할 수 있습니다.

다음은 UIView 클래스를 상속받으면 오버라이드 할 수 있는 메서드 들입니다.

  • 초기화
    • init(frame:): 이 방법으로 초기화하는 것이 가장 좋습니다. 또한 이 메서드를 커스텀하여 초기화 메서드를 구현할 수 있습니다.
    • init(coder:): 스토리 보드 혹은 Nib 파일에서 view를 로드하고 view에 커스텀 초기화가 필요한 경우에 사용하세요.
    • layerClass: view 뒤에 다를 Core Animation layer를 사용하려면 이 속성을 사용하세요.
  • 드로잉과 프린팅
    • draw(_:): 커스텀 콘텐츠를 그릴 거면 이 메서드를 사용하세요. 커스텀 콘텐츠를 그릴 것이 없다면 이 메서드를 오버라이드 하지 마세요.
    • draw(_:for:): printing 하는 동안 view의 콘텐츠를 다르게 그리려는 경우에만 이 메서드를 구현하세요.
  • 레이아웃과 제약조건
    • requiresConstraintBasedLayout: view 클래스가 제대로 동작하기 위해 제약조건이 필요한 경우 사용하세요.
    • updateConstraints(): 뷰와 하위 뷰 간에 커스텀 제약조건 생성이 필요한 경우 이 메서드를 구현하세요.
    • alignmentRect(forFrame:), frame(forAlignmentRect:): 여러 뷰 간의 정렬되는 방법을 오버라이드 하려면 이 메서드를 구현하세요.
    • didAddSubview(_:), willRemoveSubview(_:): 하위 뷰를 생성과 제거를 추적하고 싶다면 이러한 메서드를 구현하세요.
    • willMove(toSuperview:), didMoveToSuperview(): 뷰 계층에서 현재 뷰의 이동을 추적하고 싶다면 이러한 메서드를 구현하세요.
  • 이벤트 핸들링
    • gestureRecognizerShouldBegin(_:) : 뷰가 터치 이벤트를 직접 처리하고 연결된 제스처 인식기가 추가 작업을 트리거하지 못하도록 하려면 이 메서드를 구현하세요.
    • touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:): 터치 이벤트를 직접 처리하고 싶다면 이 메서드를 구현하세요. (제스처 기반 입력일 경우 제스처 인식기를 사용합니다.)

 

서브 클래싱의 대안

뷰의 여러 동작들은 따로 상속할 필요 없이도 설정할 수 있습니다.

메서드를 오버라이드 하기 전에 다음 나열되는 속성이나 동작들을 수정하면 필요한 동작을 제공할 수 있는지 고려해보세요.

  • addConstraint(_:): 뷰와 하위 뷰에 대한 오토 레이아웃을 정의합니다.
  • autoresizingMask: super 뷰의 frame이 바뀌면 오토 레이아웃 동작을 제공합니다. 이 동작은 제약사항들과 결합될 수 있습니다.
  • contentMode: 뷰 frame이 아닌 뷰의 콘텐츠에 대한 레이아웃 동작을 제공합니다. 또한 이 속성은 뷰에 맞게 콘텐츠를 조정하는 방법을 제공하고 콘텐츠를 새로 그릴지 캐시 할지 결정할 수 있습니다.
  • isHidden or alpha:  뷰 전체의 투명도를 변경합니다.
  • backgroundColor: 해당 색상을 직접 그리는 것 대신에 뷰의 색상을 설정합니다.
  • Subviews: draw(_:) 메서드를 사용하여 콘텐츠를 그리는 대신 원하는 콘텐츠를 포함한 image나 label의 하위 뷰를 포함합니다.
  • Gesture Recognizer:  터치 이벤트를 직접 처리하는 하위 클래스 대신 제스처 인식기를 사용하여 대상 객체에 Target-Action을 보낼 수 있습니다.
  • Animations:  변경 사항을 직접 애니메이션으로 만들지 말고 내장된 애니메이션 지원 기능을 사용할 수 있습니다. Core Animation에서 제공하는 애니메이션 support는 빠르고 사용하기 쉽습니다.
  • Image-based backgrounds: 정적인 콘텐츠를 표시하는 view의 경우 이미지를 직접 서브 클래싱 하고 그리는 대신 제스처 인식기와 함께 UIImageView객체를 사용하는 것이 좋습니다. 대안으로 UIView객체를 사용하고 이미지를 view의 CALayer객체의 콘텐츠로 할당할 수도 있습니다.

애니메이션은 복잡한 드로잉 코드의 서브 클래싱과 구현 없이 시각적 변화를 줄 수 있는 또 다른 방법입니다.

UIView 클래스의 많은 속성들이 애니메이션 가능하며 이러한 속성의 변경으로 시스템에서 생성된 애니메이션이 트리거 될 수 있습니다.

애니메이션을 시작하려면 뒤따르는 변경사항을 애니메이션으로 표현해야 한다는 코드 한 줄만 있으면 됩니다.

 

 

 

 

 

 

반응형

'🍎 iOS > UIKit' 카테고리의 다른 글

[UIKit] UITableView  (0) 2022.04.01
[UIKit] UIView(2)  (0) 2022.03.28
[UIKit] UIView(1)  (0) 2022.03.25
[UIKit] UIApplication  (0) 2022.03.24
[UIKit] 앱의 라이프 사이클  (0) 2022.03.22

댓글