Jupitor's Blog

[programming iOS 14] Views 본문

IT/study notes

[programming iOS 14] Views

Jupitor6245 2020. 9. 18. 02:01

View

- view는 동적으로 조작할 수 있다. code로. 

  view의 크기를 조절하거나 애니메이션을 넣을 수 있다.

 

- view는 responder 이기도 하다.

 

- view 는 subview를 가질 수 있다.

 

- view는 nib 파일에서 가져올 수도 있다.

 

- window 와 이 것이 가지고 있는 interface 들을 이어주는 것은 window의 root view controller 이다.

 

- iOS13부터, 앱의 window는 window scene에 의해 관리된다. (UIViewScene)

   iOS13 이전의 old architecture를 가진 앱을 iOS13 이후의 환경에 실행해도 여전히 old architecture를 가진다.

 

- 앱은 window를 속성으로 갖는 scene delegate를 가진다.

 

- new architecture app을 이전 환경에서 구동하게끔 해줄려면 3가지 일을 해야한다.

 

- app delegate는 window 속성을 통해 window를 retain, 즉 유지한다.

 

 

% 어떻게 앱이 launch 하는가 %

 

  - 앱은 최종적으로 UIApplicationMain , 단 하나의 function을 부르는 single call 로 이루어져 있다.

  - 이 function은 앱 구동에 필수적인 initial instance 들을 생성한다.

 

  - 어떻게 UIApplicationMain이 작동하는지는 architecture에 달려있다.

  [ iOS 13 이후의 최신 환경 ]

   1. UIApplication의 instance 생성 하고 유지. ->  UIApplication.shared

   2. app delegate의 instance 생성 및 유지 -> app delegate의 인스턴스를 application의 인스턴스의 delegate에 assign.

   3. UISceneSession , UIWindowScene, 그리고 window scene의 delegate역할을 할 인스턴스 생성.

   4. 스토리보드의 initial view cotroller 인스턴스 생성.

   5. UIWindow 인스턴스를 생성하고 window instance를 scene delegate의 window 속성에 assign.

   6. 아까 instantiate한 view controller를 window 의 rootViewController로 설정. 

   7. app의 interface를 나타나게 함 (makeKeyAndVisible)

 

 

 Storyboard를 안쓰는 경우 존재.

 

- window 를 참조하는 여러가지 방법 존재. 

 

- [주의] 여기서 생성하고 처음보여지는 window가 app의 유일한 window가 아님을 잊지 말라.

 

- self.View -> view controller의 mainview 참조.

 

Subview and Superview

 예전엔 불가능했지만 현재는 subview가 superview의 외부영역에 보여지는게 가능함.

 subview가 아니여도 다른 뷰 앞에 나타날 수 있음.

 

- view hierarchy 가 갖는 특성

 1. superview가 지워지면 subview가 지워짐

 2. 투명도 상속

 3. clipping

 4. memory 관점 -> responsible for releasing a subview

 5. superview의 크기가 달라질때 subview는 자동적으로 크기조정이 될 수 있음

 

code에서 view hierarchy를 확인하는 방법 존재, isDescendant(of:)

 

- view는 numeric tag를 가질 수 있음. -> viewWithTag(_:)로 상위에 view에 refer 될 수 있음?

 

- addSubView <-> removeFromSuperView

 

 - SuperView에서 subView를 떼어 내고 재사용하고 싶으면 변수에 저장할 것.

 

- view hierarcy에 대한 변화를 감지하는 함수가 있음 

  -> “willRemoveSubview(_:), didAddSubview(_:)
      willMove(toSuperview:), didMoveToSuperview
      willMove(toWindow:), didMoveToWindow”

- addSubView -> 마지막에 추가. append. -> 가장 마지막에 나타남.

 이걸 원하지 않을 경우, subView마다 index가 있음.

  -> insertSubview(_:at:)

 

- subView 한번에 지울 순 없고,  -> myView.subviews.forEach {$0.removeFromSuperview()}

 

Color

 - background color가 dynamic 하면 iOS가 Darkmode일때 색이 변함

 - UIColor를 dynamic하게 설정하는 방법.

 - iOS에서 기본적으로 제공하는 dynamic Color도 있음.

 - Color도 개인적으로 생성해서 사용가능

 

Visibility and Opacity

- isHidden, alpha, isOpaque

- alpha가 투명도

- isOpaque가 잘 이해가 안됨.

 

 

Frame

frame은 super view에 대한 coordinate system을 기준으로 한 rectangle의 두 꼭지점을 말한다.

 

e.g let v2 = UIView(frame:CGRect(41, 56, 132, 194))

 

 

Bounds and Center

- view는 실은 Frame을 절대적 위치로 사용하지 않고, center와 Bounds로만 위치를 설정한다.

왜냐하면 frame은 시시각각 바뀔 수 있지만 bounds 와 center는 transformation 등을 통해도 바뀌지 않기 때문.

 

frame은 parent view's coodinate system을 따르고, bounds 는 그 view의 coordinate system을 따른다.

 

        let v2 = UIView(frame:v1.bounds.insetBy(dx: 10, dy: 10))

       v2.bounds.size.height += 20

                 -> v2가 v1을 가림.

 

- superView의 Bounds를 재설정하면, subView의 위치도 바뀐다.

 

        v1.bounds.origin.x += 10

        v1.bounds.origin.y += 10

근데 이렇게 설정하면, subView가 오른쪽 아래가 아니라 왼쪽 위로 움직인다.

이게 이해가 안간다. 일단 그렇다고만 알고 있자.

그리고 신기하게 subview만 움직인다. 

 

NewSubview.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.bounds), CGRectGetHeight(self.view.bounds)); //Best 

       -> ????