xib에서 IBDesignable을 위한 사용자 정의 보기를 정의할 때 NSBundle에 주의하십시오.

10799 단어 iOSSwiftXcode
xib에서 사용자 정의 보기를 정의하고 다른 xib/Storyboard에 불러와서 IBDesignable에 놓으려면 이 문장과 같이 진행할 수 있습니다.
Create an IBDesignable UIView subclass with code from an XIB file in Xcode

일.


xib에서 사용자 정의 보기를 만들고'파일 생성기'클래스에 클래스 이름을 지정합니다.

이.


사용자 정의 보기를 실현하는 클래스 (파일 소유자에 지정된 클래스)
nib에서 보기addSubview()를 불러옵니다. 이때 코드에서 온 초기화용 초기화기init(frame: CGRect)와nib에서 온 초기화용 초기화기가 모두 진행됩니다.
MyView.swift/Swift2
import UIKit

@IBDesignable class MyView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        loadFromNib()
    }

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

    private func loadFromNib() {
        // ここは UINib を使っても良い
        let v = NSBundle(forClass: self.dynamicType).loadNibNamed("MyView", owner: self, options: nil).first as! UIView
        addSubview(v)

        v.translatesAutoresizingMaskIntoConstraints = false
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|",
            options: NSLayoutFormatOptions(rawValue: 0),
            metrics: nil,
            views: ["view" : v]))
        addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|",
            options: NSLayoutFormatOptions(rawValue: 0),
            metrics: nil,
            views: ["view" : v]))
    }
}
MyView.swift#loadFromNib()
// Swift3

let v = Bundle(for: type(of: self)).loadNibNamed("MyView", owner: self, options: nil)?.first as! UIView
addSubview(v)


// Case1. SnapKit
v.snp.makeConstraints { (maker: ConstraintMaker) in
    maker.edges.equalTo(self)
}

// Case2. NSLayoutConstraint
v.translatesAutoresizingMaskIntoConstraints = false
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|",
                                              options: NSLayoutFormatOptions(rawValue: 0),
                                              metrics: nil,
                                              views: ["view" : v]))
addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|",
                                              options: NSLayoutFormatOptions(rawValue: 0),
                                              metrics: nil,
                                              views: ["view" : v]))

삼.


스토리보드 등 다른 nib에 UIVIEW의 템플릿을 배치한 뒤 2 제작한 반(이번에는 마이 비) 으로 명명했다.순조롭게 진행되면 빌딩이 자동으로 주행Designables Up to date해 외관을 반영한다.

참고: NSBundle은 mainBundle()를 사용하여 초기화하지 않습니다.

mainBundle()는 현재 실행 중인 응용 프로그램의 묶음을 반환하는 방법이지만 IBDesignable는 목표 응용 프로그램이 아니라 IBDesignables Agent Cocoa Touch라는 Xcode의 보조 프로그램 형식으로 실행되기 때문에 mainBundle()에서 얻은 묶음과는 다른 실례이다.(극단적으로 말하면 Interface Builder 자체가 iOS 에뮬레이터와 같다.)따라서 대신 클래스 이름에서 실례를 묶는 방법을 사용한다.self.dynamicType는 Objective-C가 말한 [self class]에 해당한다.
정확한 묶음을 얻다
NSBundle(forClass: self.dynamicType)
UINib 사용 시
// "bundle: nil" はメインバンドルを指す
UINib(nibName: "MyView", bundle: NSBundle(forClass: self.dynamicType))
구문: xib에서 사용자 정의 UIVIew를 만드는 방법

좋은 웹페이지 즐겨찾기