[ios] Swift에서 UIView 서브 클래스에 대한 사용자 정의 초기화를 작성하는 방법

a 와 inita로 UIView서브 클래스를 만들고 싶다고 가정 해보십시오 .StringInt

서브 클래 싱하는 경우 Swift에서 어떻게해야 UIView합니까? 방금 사용자 정의 init()함수를 만들지 만 매개 변수가 String 및 Int이면 “init.r에서 반환하기 전에 super.init ()가 호출되지 않는다”고 알려줍니다.

그리고 전화 super.init()하면 지정된 이니셜 라이저를 사용해야한다고 들었습니다. 거기서 무엇을 사용해야합니까? 프레임 버전? 코더 버전? 양자 모두? 왜?



답변

init(frame:)버전은 기본 이니셜이다. 인스턴스 변수를 초기화 한 후에 만 ​​호출해야합니다. 이 뷰가 펜촉에서 재구성되는 경우 사용자 정의 이니셜 라이저가 호출되지 않고 대신 init?(coder:)버전이 호출됩니다. Swift는 이제 required의 구현이 필요하므로 init?(coder:)아래 예제를 업데이트하고 let변수 선언을 var선택적으로 변경했습니다 . 이 경우 awakeFromNib()나중에 또는 나중에 초기화합니다 .

class TestView : UIView {
    var s: String?
    var i: Int?
    init(s: String, i: Int) {
        self.s = s
        self.i = i
        super.init(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    }

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


답변

지정 및 필수에 대한 공통 초기화를 작성합니다. 편의상 나는 init(frame:)0 프레임으로 위임 합니다.

프레임이없는 것은 일반적으로 뷰가 ViewController의 뷰 안에 있기 때문에 문제가되지 않습니다. 사용자 정의보기는 슈퍼 뷰 호출시 layoutSubviews()또는 서브 뷰를 레이아웃 할 수있는 안전하고 좋은 기회를 얻습니다 updateConstraints(). 이 두 함수는 뷰 계층 전체에서 시스템에 의해 재귀 적으로 호출됩니다. 당신도 사용할 수 있습니다 updateContstraints()또는 layoutSubviews(). updateContstraints()먼저 호출 layoutSubviews()됩니다. 에서 updateConstraints()확인 슈퍼 호출하는 마지막 . 에서 먼저layoutSubviews() super를 호출하십시오 .

내가하는 일은 다음과 같습니다.

@IBDesignable
class MyView: UIView {

      convenience init(args: Whatever) {
          self.init(frame: CGRect.zero)
          //assign custom vars
      }

      override init(frame: CGRect) {
           super.init(frame: frame)
           commonInit()
      }

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

      override func prepareForInterfaceBuilder() {
           super.prepareForInterfaceBuilder()
           commonInit()
      }

      private func commonInit() {
           //custom initialization
      }

      override func updateConstraints() {
           //set subview constraints here
           super.updateConstraints()
      }

      override func layoutSubviews() {
           super.layoutSubviews()
           //manually set subview frames here
      }

}


답변

Swift의 iOS 9에서 수행하는 방법은 다음과 같습니다.

import UIKit

class CustomView : UIView {

    init() {
        super.init(frame: UIScreen.mainScreen().bounds);

        //for debug validation
        self.backgroundColor = UIColor.blueColor();
        print("My Custom Init");

        return;
    }

    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); }
}

다음은 예제가 포함 된 전체 프로젝트입니다.


답변

Swift에서 iOS에서 서브 뷰를 수행하는 방법은 다음과 같습니다.

class CustomSubview : UIView {

    init() {
        super.init(frame: UIScreen.mainScreen().bounds);

        let windowHeight : CGFloat = 150;
        let windowWidth  : CGFloat = 360;

        self.backgroundColor = UIColor.whiteColor();
        self.frame = CGRectMake(0, 0, windowWidth, windowHeight);
        self.center = CGPoint(x: UIScreen.mainScreen().bounds.width/2, y: 375);

        //for debug validation
        self.backgroundColor = UIColor.grayColor();
        print("My Custom Init");

        return;
    }

    required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented"); }
}


답변