programing

UIView 서브클래스를 위한 적절한 프랙티스

linuxpc 2023. 4. 21. 20:17
반응형

UIView 서브클래스를 위한 적절한 프랙티스

커스텀 UIView 베이스의 입력 제어에 임하고 있습니다만, 뷰의 설정을 위한 적절한 프랙티스를 확인하려고 합니다.Controller를 UIView Controller를 하는 은 매우 loadView 관련 ★★★★viewWill,viewDid메서드. 할 때 는 'UIView'입니다.`awakeFromNib,drawRect , , , , 입니다.layoutSubviews(셋업과 티어다운 콜백에 대해서 생각하고 있습니다.경우 를 저저로 layoutSubviews화면에는 아무것도 안 보여요.

원하는 높이와 너비가 맞는지 확인하는 가장 좋은 방법은 무엇입니까? (제 질문은 자동 레이아웃을 사용하는지 여부에 관계없이 적용됩니다만, 두 가지 답변이 있을 수 있습니다.)적절한 "베스트 프랙티스"는 무엇입니까?

애플은 서브클래스의 방법을 명확하게 정의했다.UIView를 참조해 주세요.

해 보세요., 이 을 봐 . 히히음음음음음 음initWithFrame: ★★★★★★★★★★★★★★★★★」layoutSubviews는 의 으로 하고 있습니다.UIView후자는 프레임과 서브뷰 레이아웃을 설정하는 것을 목적으로 하고 있습니다.

이 부분은 잊지 .initWithFrame:은, 「이러다」의 「이러다」의 「이러다」로 하고 있는 입니다.UIView프로그래밍적으로그 램 file 으, a, board 토 스또에경로),는하우드 ( are)는보드리 it you서 from파 a( story적일 loading if로니initWithCoder:사용할 수 있습니다.사용됩니다. And in 그리고...initWithCoder:프레임이 아직 계산되지 않았기 때문에 Interface Builder에서 설정한 프레임을 변경할 수 없습니다. 답변에서 제시된 바와 같이 전화하는 것이 좋습니다.initWithFrame:부에서initWithCoder:프레임 설정을 설정하려면프레임을 셋업하기 위해서.

'길'을 UIView 스토리보드에서, 당신은 또한 팁(또)을 .awakeFromNib의 초기화를 수 있는 은, 「Custom Frame and Layout Initializations」가 언제부터인가.awakeFromNib계층 내의 모든 뷰가 아카이브 해제 및 초기화되었음을 보증합니다.

의 문서(현재는 의 문서로 대체됨)에서 다음을 수행합니다.

다른 오브젝트에 대한 메시지는 wake From Nib 내에서 안전하게 전송할 수 있습니다.이때까지 모든 오브젝트가 아카이브 해제 및 초기화됩니다(물론 반드시 각성할 필요는 없습니다).

또한 자동 레이아웃을 사용하여 명시적으로 시야의 틀을 설정해서는 안 됩니다.대신 프레임이 레이아웃 엔진에 의해 자동으로 계산되도록 충분한 제약 조건 세트를 지정해야 합니다.

매뉴얼에서 직접:

덮어쓰기 방법

초기화

  • initWithFrame: 이 방법을 구현하는 것이 좋습니다.이 방법 외에 또는 이 방법 대신 커스텀 초기화 방법을 구현할 수도 있습니다.

  • initWithCoder: Interface Builder nib 파일에서 보기를 로드하고 보기를 사용자 정의 초기화해야 하는 경우 이 방법을 구현하십시오.

  • layerClass 뷰에서 백업 저장소에 다른 핵심 애니메이션 계층을 사용하도록 하려는 경우에만 이 방법을 구현하십시오.예를 들어 OpenGL ES를 사용하여 그림을 그리는 경우 이 메서드를 덮어쓰고 CAEAGLLayer 클래스를 반환합니다.

도면 및 인쇄

  • drawRect: 뷰에 커스텀 컨텐츠가 그려지는 경우는, 이 방법을 실장해 주세요.뷰가 사용자 정의 도면을 수행하지 않는 경우 이 방법을 재지정하지 마십시오.

  • drawRect:forViewPrintFormatter: 인쇄 중에 보기 내용을 다르게 그리려는 경우에만 이 방법을 구현하십시오.

제약

  • requiresConstraintBasedLayout 뷰 클래스에서 올바르게 작동하기 위해 제약 조건이 필요한 경우 이 클래스 메서드를 구현하십시오.

  • updateConstraints 뷰에서 서브뷰 사이에 커스텀 제약조건을 작성해야 하는 경우 이 방법을 구현합니다.

  • 뷰가 다른 뷰와 정렬되는 방법을 재정의하려면 다음 방법을 구현하십시오alignmentRectForFrame:.

레이아웃

  • sizeThatFits: 크기 조정 작업 중 뷰의 기본 크기를 보통과 다르게 하려면 이 방법을 구현하십시오.예를 들어, 이 방법을 사용하여 하위 보기를 올바르게 표시할 수 없을 정도로 보기가 축소되지 않도록 할 수 있습니다.

  • layoutSubviews 구속조건 또는 자동 크기 조정 동작보다 하위 뷰 레이아웃을 더 정확하게 제어해야 하는 경우 이 방법을 구현하십시오.

  • 서브뷰의 추가 및 삭제를 추적하기 위해 필요에 따라 이들 방법을 구현합니다didAddSubview:.

  • 뷰 계층에서 현재 뷰의 이동을 추적하기 위해 필요에 따라 이러한 방법을 구현합니다willMoveToSuperview:.

  • 필요에 따라서, 이러한 방법을 실장하고, 다른 창으로의 뷰의 이동을 추적합니다willMoveToWindow:.

이벤트 처리:

  • touchesBegan:withEvent:, touchesMoved:withEvent:, touchesEnded:withEvent:,touchesCancelled:withEvent:터치 이벤트를 직접 처리해야 하는 경우 이러한 방법을 구현하십시오( 제스처 기반 입력의 경우 제스처 인식자를 사용하십시오).

  • gestureRecognizerShouldBegin: 뷰에서 터치 이벤트를 직접 처리하고 연결된 제스처 인식자가 추가 작업을 트리거하지 않도록 하려면 이 방법을 구현하십시오.

이것은 구글에서 여전히 높은 위치에 있다.다음은 swift의 업데이트된 예입니다.

didLoad모든 커스텀 초기화 코드를 입력할 수 있습니다.다른 사람들이 언급했듯이didLoad를 통해 뷰가 프로그래밍 방식으로 작성되면 호출됩니다.init(frame:)또는 XIB 디시리얼라이저가 XIB 템플릿을 뷰에 Marge할 때init(coder:)

기타:layoutSubviews그리고.updateConstraints대부분의 뷰에 대해 여러 번 호출됩니다.이는 뷰의 경계가 변경될 때 고급 다중 경로 레이아웃 및 조정을 위한 것입니다.개인적으로 멀티패스 레이아웃은 CPU 사이클이 소모되어 모든 것이 골칫거리이기 때문에 가능하면 피하는 것이 좋습니다.또한 이니셜라이저를 무효화하는 경우는 거의 없기 때문에 이니셜라이저 자체에 제약 코드를 넣습니다.

import UIKit

class MyView: UIView {
  //-----------------------------------------------------------------------------------------------------
  //Constructors, Initializers, and UIView lifecycle
  //-----------------------------------------------------------------------------------------------------
  override init(frame: CGRect) {
      super.init(frame: frame)
      didLoad()
  }

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    didLoad()
  }

  convenience init() {
    self.init(frame: CGRectZero)
  }

  func didLoad() {
    //Place your initialization code here

    //I actually create & place constraints in here, instead of in
    //updateConstraints
  }

  override func layoutSubviews() {
     super.layoutSubviews()

     //Custom manually positioning layout goes here (auto-layout pass has already run first pass)
  }

  override func updateConstraints() {
    super.updateConstraints()

    //Disable this if you are adding constraints manually
    //or you're going to have a 'bad time'
    //self.translatesAutoresizingMaskIntoConstraints = false

    //Add custom constraint code here
  }
}

Apple의 문서에는 적절한 요약이 있습니다.이것은 iTunes에서 이용할 수 있는 스탠포드 무료 코스에서 충분히 다루어지고 있습니다.TL;DR 버전은 다음과 같습니다.

되어 있는 는 "서브뷰"에 .init방법들.뷰의 경우 두 가지 다른 점이 있습니다.init호출 가능한 메서드는 뷰가 코드 또는 니브/스토리보드에서 인스턴스화되는지 여부에 따라 달라집니다.가 하는 만의 글을 것입니다.setup 방법을 모두 합니다.initWithFrame: ★★★★★★★★★★★★★★★★★」initWithCoder:★★★★★★★★★★★★★★★★★★.

드로잉을 할 오버라이드 하고 요.drawRect:당신이 보기엔.그러나 커스텀 뷰가 대부분 서브뷰용 컨테이너인 경우에는 그럴 필요가 없습니다.

「」만 .layoutSubViews세로 방향인지 가로 방향인지에 따라 하위 보기 추가 또는 삭제 등의 작업을 수행할 경우.그렇지 않으면 그냥 내버려둘 수 있을 거예요.

layoutSubviews는 뷰 자체가 아닌 하위 뷰에 프레임을 설정하는 것을 의미합니다.

★★★의 UIView대표 컨스트럭터는 보통 다음과 같습니다.initWithFrame:(CGRect)frame in 「」로 설정합니다).initWithCoder:된 것을 할 수 다른 생성자를 지정하고 프레임을 설정할 수도 있습니다.

언급URL : https://stackoverflow.com/questions/15978370/proper-practice-for-subclassing-uiview

반응형