본문 바로가기
🍎 iOS/UIKit

[UIKit] UIView(2)

by hyebin (Helia) 2022. 3. 28.

View 생성하기

일반적으로 스토리보드에 뷰를 만들 때는 라이브러리로부터 캔버스에 끌어다 놓아서 만듭니다.

프로그래밍 방식으로도 생성할 수 있습니다.

뷰를 생성할 때 일반적으로 미래의 super 뷰를 기준으로 초기 크기와 위치를 지정합니다.

다음 코드는 뷰를 생성하고 super 뷰의 좌표계에 있는 점(10, 10)에 왼쪽 상단 모서리를 배치합니다.

 

let rect = CGRect(x: 10, y: 10, width: 100, height: 100)
let myView = UIView(frame: rect)

 

다른 뷰에 하위 뷰를 추가하려면 super 뷰에서 addSubView(_:) 메서드를 호출하세요.

뷰에 하위 뷰를 여러 개 추가할 수 있으며 iOS에서는 형제 뷰가 서로 겹쳐있을 수 있습니다.

  • addSubView(_:): 다른 뷰 끝에 하위 뷰를 추가
  • insertSubview(_:avoveSubView:): 다른 뷰 위에 뷰 삽입
  • insertSubview(_:belowSubView:): 다른 뷰 아래에 뷰 삽입
  • exchange Subview(at: with Subview At:): 지정한 인덱스의 하위 뷰를 교환

 

뷰 드로잉 사이클

뷰 드로잉은 기본적으로 필요에 따라 발생합니다.

뷰가 처음 표시되거나 레이아웃 변경으로 인해 뷰의 전체나 일부가 표시되면 시스템에서 뷰에 콘텐츠를 그리도록 요청합니다.

UIKit 또는 Core Graphics를 사용하는 사용자 정의 콘텐츠가 포함된 뷰의 경우 시스템은 보기의 draw(_:) 메서드를 호출합니다.

이 메서드는 그래픽 콘텍스트에 뷰 콘텐츠를 그리는 방식으로 구현됩니다.

이렇게 함으로써 뷰 콘텐츠가 화면상에 시각적으로 나타납니다.

 

뷰의 콘텐츠가 변경되면 다시 그려져야 한다고 시스템에 알리는 것은 개발자의 책임입니다.

뷰의 setNeedsDisplay() 또는 setNeedsDisplay(_:) 메서드를 호출하여 작업을 수행할 수 있습니다.

이 메서드는 다음 드로잉 사이클 동안 뷰를 업데이트해야 한다고 시스템에 알립니다.

뷰를 업데이트하기 위해선 다음 드로잉 사이클까지 기다려야 하기 때문에 여러 뷰에서 이 메서드를 호출하여 동시에 업데이트할 수 있습니다.

OpenGL ES를 사용하여 그리는 경우 GLKView 클래스를 사용해야 함

 

애니메이션

뷰 프로퍼티의 변경 사항들을 애니메이션화 할 수 있습니다.

즉, 프로퍼티를 변경하면 현재 값에서 시작해서 지정한 값으로 끝나는 애니메이션이 생성됩니다.

UIView 클래스의 프로퍼티 중에서 애니메이션화 할 수 있는 것들은 다음과 같습니다

  • frame
    • var frame: CGRect {get set}
    • super 뷰의 좌표계에서 뷰의 위치와 크기를 설명하는 프레임 사각형
  • bounds
    • var bounds: CGRect {get set}
    • 자체 좌표계에서 뷰의 위치와 크기를 설명하는 경계 사각형
  • center
    • var center: CGPoint {get set}
    • 뷰의 사각형 프레임의 중심점
  • transform
    • var transform: CGAffineTransform {get set}
    • 뷰의 경계의 중심을 기준으로 뷰에 적용되는 변환을 지정
  • alpha
    • alpha: CGFloat {get set}
    • 뷰의 알파 값, 투명도 
  • backgroundColor
    • @NSCopying var backgroundColor: UIColor? {get set}
    • 뷰의 배경색

변경 사항을 애니메이션 화하려면 UIViewPropertyAnimator 객체를 만들고 객체의 핸들러 블록을 사용하여 뷰 프로퍼티를 변경합니다.

이 클래스를 사용하면 애니메이션의 지속시간과 타이밍을 설정할 수 있지만 실제 애니메이션이 그 즉시 실행됩니다.

또한 프로퍼티 기반 애니메이터는 실행 중에 멈추거나 대화형으로 구동될 수 있습니다.

  • @MainActor class UIViewPropertyAnimator: NSObject
  • 뷰에 대한 변경사항을 애니메이션화 하고 해당 애니메이션의 동적 수정을 허용하는 클래스

 

스레딩 고려사항

앱의 유저 인터페이스에 대한 조작은 반드시 메인 스레드에서 작업해야 합니다.

따라서 UIView 클래스의 메서드를 호출하는 코드도 반드시 메인 스레드에서 동작해야 합니다.

이 규칙이 필요 없는 유일한 경우는 뷰 객체를 생성하는 경우뿐입니다.

그 외에는 반드시 메인 스레드에서만 작업하세요

 

 

 

반응형

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

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

댓글