a 와 init
a로 UIView
서브 클래스를 만들고 싶다고 가정 해보십시오 .String
Int
서브 클래 싱하는 경우 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"); }
}