@IBDesignableclassMyView:NibView{} // That's it! ✨Tiny Swift framework to reference nibs from anywhere - code, other nibs or storyboards ✨
| Capabilities | |
|---|---|
| ✨ | True rendering inside interface builder with @IBDesignable and @IBInspectable |
| 📏 | Calculates correct intrinsic content size |
| ♻️ | Referencing from other nibs and storyboards - keeping them small |
| ⌨️ | Loading from code with a simple .fromNib() |
| ⚙️ | Integrates as little or as much |
Play around with Example project 🕹️👈
Just subclass NibView and optionally add @IBDesignable attribute. That's it! ✨
@IBDesignableclassMyView:NibView{}⚠️ Usage If subclassing is not an option.
Implementing NibLoadable protocol and overriding a couple of functions will unleash the full power of referencing 💪:neckbeard:
To reference nibs only from code implement NibLoadable protocol:
classMyView:SomeBaseView,NibLoadable{
// 'nibName' defaults to class name. "MyView" in this case.
classvarnibName:String{return"MyCustomView"}}letmyView=MyView.fromNib()To reference nibs from interface builder (other nibs or storyboards) in addition to implementing NibLoadable override awakeAfter(using:) with a call to nibLoader - a helper struct from 'NibLoadable' protocol:
classMyView:SomeBaseView,NibLoadable{overridefunc awakeAfter(using aDecoder:NSCoder)->Any?{return nibLoader.awakeAfter(using: aDecoder, super.awakeAfter(using: aDecoder))}}To get real rendering and intrinsic content size from the nib - @IBDesignable attribute and some overrides are needed:
@IBDesignableclassMyView:SomeBaseView,NibLoadable{openoverridefunc awakeAfter(using aDecoder:NSCoder)->Any?{return nibLoader.awakeAfter(using: aDecoder, super.awakeAfter(using: aDecoder))}#if TARGET_INTERFACE_BUILDERoverrideinit(frame:CGRect){
super.init(frame: frame)
nibLoader.initWithFrame()}requiredinit?(coder aDecoder:NSCoder){
super.init(coder: aDecoder)}overridefunc prepareForInterfaceBuilder(){
super.prepareForInterfaceBuilder()
nibLoader.prepareForInterfaceBuilder()}overridefunc setValue(_ value:Any?, forKeyPath keyPath:String){
super.setValue(value, forKeyPath: keyPath)
nibLoader.setValue(value, forKeyPath: keyPath)}#endif}Drag NibView.swift file into your Xcode project and add the following line to your Cartfile:
github "Trafi/NibView"
dependencies: [
.package(url: "https://github.com/trafi/NibView.git", .upToNextMajor(from: "2.0.0"))
]
Drag the Sources folder and NibView.swift file into your Xcode project.

