UIView에 대해 알아보자 2편

zeke·2021년 7월 17일
1

UIKit

목록 보기
8/8
post-thumbnail

저번에 이어서 UIView에 대해 알아보겠습니다.

5. Threading Considerations

앱의 유저 인터페이스는 반드시 메인 스레드에서 조작되어야 합니다. 따라서 항상 앱의 메인 스레드에서 실행되는 코드에서 UIView클래스의 메소드를 호출해야 합니다. 오직 view를 생성할 때만 메인 스레드에서 실행되지 않아도 되지만 그 이외에는 반드시 메인 스레드에서 실행되야 합니다.

6. Subclassing Notes

view를 상속받는 것은 view를 구현하고 성능을 조정하기 위해 더 많은 작업들이 필요합니다. 따라서 UIView클래스가 제공하지 않는 것이 있을때만 구현하는것이 좋습니다. 아래 8번을 참고하세요.

7. Methods to Override

UIView를 상속받을 때, 재정의 해야하는 소수의 메소드가 있고 필요에 따라 재정의할 수있는 메소드도 있습니다. UIView는 highly configurable 클래스이기 때문에 커스텀 메소드를 재정의하지 않고도 정교한 뷰 동작을 구현하는 방법도 많습니다. 다음 목록은 UIView클래스를 상속받으면 재정의할 수 있는 메소드입니다.

  • Initializaion:
    • init(frame:) - 이 방법으로 초기화 하는것이 좋습니다. 또한 이 메소드를 커스텀하여 초기화 메소드를 구현할 수 있습니다.
    • init(coder:) - 스토리보드 혹은 Nib파일에서 view를 로드하고 view에 커스텀 초기화가 필요한 경우 이 메소드를 사용하세요.
    • layerClass - view의 뒤에 다른 Core Animation layer를 사용하려면 이 속성을 사용하세요.

  • Drawing and Printing:
    • draw(_:) - 커스텀 컨텐츠를 그릴려면 이 메소드를 사용하세요. 커스텀 컨텐츠를 그릴게 없다면 이 메소드를 재정의 하지 마세요.
    • draw(_:for:) - printing하는 동안 view의 컨텐츠를 다르게 그리려는 경우에만 이 메소드를 구현하세요.

  • Layout and Constraints:
    • requiresConstraintBasedLayout - view클래스가 제대로 작동하기 위해 제약조건이 필요한 경우 이 속성을 사용하세요.
    • updateConstraints() - 뷰와 하위 뷰 간의 커스텀 제약조건 생성이 필요한 경우 이 메소드를 구현하세요.
    • alignmentRect(forFrame:), frame(forAlignmentRect:) - 여러 뷰 간의 정렬되는 방식을 재정의하려면 이 메소드를 구현하세요.
    • didAddSubview(_:), willRemoveSubview(_:) - 하위 뷰를 추가하거나 제거하는 것은 추적하고 싶다면 이러한 메소드를 구현하세요.
    • willMove(toSuperview:), didMoveToSuperview() - 뷰 계층에서 현재 뷰의 이동을 추적하고 싶다면 이러한 메소드를 구현하세요.

  • Event Handling
    • gestureRecognizerShouldBegin(_:) - 뷰가 터치 이벤트를 직접 처리하고 연결된 gesture recognizer가 추가 작업을 트리거하지 못하도록 하려면 이 메소드를 구현하세요.
    • touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:) - 터치 이벤트를 직접 처리하고싶다면 이 메소드를 구현하세요. (gesture기반 입력일 경우 gesture recognizer를 사용합니다.)

8. Alternatives to Subclassing

뷰의 여러 동작들은 따로 상속할 필요없이도 설정할 수 있습니다. 메소드를 재정의하기 전에 다음 나열되는 속성이나 동작들을 수정하면 필요한 동작을 제공할 수 있는지 고려해보세요.

  • addConstraint(_:) - 뷰와 하위 뷰에 대한 오토레이아웃을 정의합니다.

  • autoresizingMask - 수퍼뷰의 frame이 바뀌면 오토레이아웃 동작을 제공합니다. 이러한 동작들은 constraints들과 결합될 수 있습니다.

  • contentMode - 뷰 frame과 달리 뷰의 컨텐츠에 대한 레이아웃 동작을 제공합니다. 또한 이 속성은 뷰에 맞게 컨텐츠를 확장하는 방법(scaled to fit)과 컨텐츠를 캐시(cached) 또는 다시그리기(redrawn)여부에도 영향을 줍니다.

  • isHidden or alpha - 뷰 전체의 투명도를 변경합니다.

  • backgroundColor - 해당 색상을 직접 그리는것 보다는 뷰의 색상을 설정합니다.

  • Subviews - draw(_:)메소드를 사용하여 컨텐츠를 그리는 대신 원하는 컨텐츠를 포함한 image나 label의 하위 뷰를 포함합니다.

  • Gesture Recognizer - 터치 이벤트를 직접 처리하는 하위 클래스 대신 gesture recognizer을 사용하여 대상 객체에 Target-Action을 보낼 수 있습니다.

  • Animations - 변경 사항을 직접 애니메이션으로 만들지 말고 내장된 애니메이션 support를 사용하세요. Core Animation에서 제공하는 애니메이션 support는 빠르고 사용하기 쉽습니다.

  • Image-based backgrounds - 정적인 컨텐츠를 표시하는 view의 경우 이미지를 직접 서브클래싱하고 그리는 대신 gesture recognizer와 함께 UIImageView객체를 사용하는 것이 좋습니다. 대안으로 UIView객체를 사용하고 이미지를 view의 CALayer객체의 컨텐츠로 할당할 수도 있습니다.

정리

UIView는 화면을 통해 보여주는 핵심 객체인 만큼 책임도 많고 기능도 정말 다양합니다. 그리기, 애니메이션, 레이아웃, 하위 뷰와의 관계, 이벤트 처리 등이 있습니다. 앱의 유저 인터페이스는 반드시 메인 스레드에서 처리해야 한다는 것도 중요합니다. 스토리보드나 Nib파일에서 사용할 때와 아니면 코드로 사용할 때 초기화하는 메소드가 달라지는 것도 분명히 알게되었습니다.

profile
iOS & Swift

0개의 댓글