광어네 맛집

[ Layer 및 초기화 ] View 그리기 / Graphics Hardware, UIKit, draw(_ rect: CGRect) _ 01 본문

Swift/About Swift

[ Layer 및 초기화 ] View 그리기 / Graphics Hardware, UIKit, draw(_ rect: CGRect) _ 01

Lautner Jacob 2022. 8. 9. 14:33
728x90
반응형

이번 글은 과제를 하면서 실수, 의문점이 드는 것들을 정리 및 회고하고자 합니다!

아마 범위가 넓어서 두번 정도 나눠서 적을 예정!

 


 

우리는 Xcode에서 Cocoa Touch Class를 통해서 ViewController를 생성할 때면

viewDidLoad()라는 메서드가 override가 자동으로 만들어지게 됩니다

 

UIView를 생성할 때는 어떤 문구가 주석처리되어 만들어지는데

/*
  // Only override draw() if you perform custom drawing.
  // An empty implementation adversely affects performance during animation.
  override func draw(_ rect: CGRect) {
  // Drawing code
  }
*/

주석을 해석해보면 사용자 그리를 수행할 때, draw()를 override를 합니다

단, 빈 구현은 성능에 악영향을 미칩니다 라고 합니다

 

보통 UIView를 초기화할 때 사용하는 메서드는 Code base 유무에 따라서 생성하게 됩니다

 

여기서 의문점은 init을 사용하지 않고, draw(_ rect: CGRect)만을 사용했을 때 어떤 일이 벌어질까 입니다!

과연 그려질까 입니다

 

결론은 그려지긴 합니다!

 draw 메서드는 단순 배경색상을 설정하거나 기본 레이어 객체를 사용해서 뷰를 설정할 때 사용합니다

단, draw 메서드 내에서 super를 호출할 필요가 없다고 합니다. 하지만 다른 뷰를 상속 받을 때 super 메서드를 호출해줘야 합니다.

(적고 보니까 예외가 많네요 ㅎㅎㅎ)

 

과제를 진행하면서 가지고 있던 생각은

CustomView를 View 내부에 생성한 뒤, View 내부에 override func draw(_ rect: CGRect)와 super에 호출하도록 했습니다.

CollectionView 자체를 만들었기 때문에 굳이 init을 안해줘도 되지 않을까 라는 생각이 있었습니다.

또 시점이 제일 마지막에 그려졌으면 해서 draw(_ rect: CGRect)을 구현했습니다

 

이렇게 되면 일반적인 사용은 무리가 없을지 몰라도

재사용이 되는 table Cell같은 경우에는 계속해서 늘어나게 됩니다 

또한 제약 조건을 걸어 해결은 할 수 있지만, resource 낭비가 될 수 있기 때문에 이렇게 하면 안됩니다!

 

서론이 길었지만 draw(_ rect: CGRect)에 대해서는 직접적으로 호출하는 것을 지양하기 떄문에

사용하지 말아야겠다는 게 개인적인 결론입니다!

 

스탠포드 강의에서도 직접 호출하지말고 아래 메서드를 이용하여

커스텀 뷰를 만들어라 말하고 있으니  다음 개발을 할 때는 이렇게 사용해보도록 해야겠습니다!

( UIView는 초기화 메서드로 초기화해주는 걸로..; )

 

override func setNeedsDisplay() {
  <#code#>
}
    
override func setNeedsDisplay(_ rect: CGRect) {
  <#code#>
}

 

 

개인적으로 기능만 완성하는 개발 말고

이런 이슈들에 대해서 자유롭게 대화해보는 자리가 지속적으로 있었으면 좋겠네요 ㅎㅎ

(이 글에서도 틀린 점이나 의견은 언제든지 환영입니다!)

 

 

이어서 setNeedDisplay에 대해서 나왔으니

UIView 인스턴스 메서드에 대해 더 적어보고자 합니다!

 

 

참고: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CocoaViewsGuide/Optimizing/Optimizing.html#//apple_ref/doc/uid/TP40002978-CH11-SW1

 

Optimizing View Drawing

Optimizing View Drawing Drawing is often a processor intensive operation. The CPU, graphics system, window server, kernel, and physical memory must all contribute resources when an application draws something to the screen. The high expense of drawing make

developer.apple.com

 

728x90
반응형