Reutilice y renderice un xib en un guión gráfico.
Probado con Swift 2.2 y Xcode 7.3.1
1 ---- Cree una nueva UIView llamada 'DesignableXibView'
- Archivo> Nuevo> Archivo> Fuente> Clase Cocoa Touch> UIView
2 ---- Cree un archivo xib coincidente llamado 'DesignableXibView'
- Archivo> Nuevo> Archivo> Interfaz de usuario> Ver
3 ---- Establecer el propietario del archivo de la xib
- seleccione el xib
- seleccionar el propietario del archivo
- establezca la clase personalizada en 'DesignableXibView' en el Inspector de identidad.
- Nota: No establezca la clase personalizada de la vista en el xib. ¡Solo el propietario del archivo!
4 ---- Implementación de DesignableXibView
// DesignableXibView.swift
import UIKit
@IBDesignable
class DesignableXibView: UIView {
var contentView : UIView?
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
func xibSetup() {
contentView = loadViewFromNib()
// use bounds not frame or it'll be offset
contentView!.frame = bounds
// Make the view stretch with containing view
contentView!.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
// Adding custom subview on top of our view (over any custom drawing > see note below)
addSubview(contentView!)
}
func loadViewFromNib() -> UIView! {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: String(self.dynamicType), bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
return view
}
}
5 ---- Pruebe su vista reutilizable en un guión gráfico
- Abre tu guión gráfico
- Agregar una vista
- Establecer la clase personalizada de esa vista
- espera un segundo ... BOOM !!
¡NUEVO! respuesta actualizada con capacidad para renderizar directamente en el guión gráfico (¡y rápido!)
Funciona en Xcode 6.3.1
Cree una nueva UIView llamada 'ReuseableView'
Cree un archivo xib coincidente llamado 'ReuseableView'
Establecer el propietario del archivo de la xib
establezca la clase personalizada en 'ReusableView' en el Inspector de identidad.
Haga una salida de la vista en ReuseableView.xib a su interfaz ReuseableView.h
Agregue la implementación initWithCoder para cargar la vista y agregarla como una subvista.
Pruebe su vista reutilizable en un guión gráfico
¡Corre y observa!
fuente
UINib(nibName: nibName, bundle: nil).instantiateWithOwner(nil, options: nil)
que es más rápida que la versión NSBundle.@IBDesignable on the class.
tienes que implementarloinit(frame:)
, ¡pero aparte de eso, funciona bastante bien! supereasyapps.com/blog/2014/12/15/…1. Cree una nueva UIView llamada 'DesignableXibView'
2. Cree un archivo xib coincidente llamado 'DesignableXibView'
3. Establecer el propietario del archivo de la xib
Seleccione "DesignableXibView.xib"> "Propietario del archivo"> establezca "Clase personalizada" en 'DesignableXibView' en el Inspector de identidad.
4. Implementación de DesignableXibView
5 Pruebe su vista reutilizable en un guión gráfico
Abre tu guión gráfico
Agregar una vista
Establecer la clase personalizada de esa vista
fuente
DesignableXibView
. Cree el proyecto para ver los cambios.String(describing: type(of: self))
debería hacer esto de forma seguraLa función initWithCoder en swift 2 si alguien tiene problemas para traducirla:
fuente
Para cualquiera que intente adaptar la respuesta aceptada (por @Garfbargle) a Objective-C
Convertir
Swift
aObjective-C
no es suficiente para que funcione. He tenido dificultades para permitir la representación en vivo en Storyboard.Después de traducir todo el código, la vista está bien cargada cuando se ejecuta en el dispositivo (o simulador), pero la representación en vivo en Storyboard no funciona. La razón de esto es que usé
[NSBundle mainBundle]
mientras que Interface Builder no tiene acceso a mainBundle. Lo que tienes que usar en su lugar es[NSBundle bundleForClass:self.classForCoder]
. BOOM, ¡la renderización en vivo funciona ahora!Nota: si tiene problemas con el diseño automático, intente deshabilitarlo
Safe Area Layout Guides
en Xib.Para su comodidad, dejo mi código completo aquí, para que solo tenga que copiar / pegar (para todo el proceso, siga la respuesta original ):
BottomBarView.h
BottomBarView.m
Dime si encuentras algunos problemas, pero casi debería funcionar fuera de la caja :)
fuente
Si alguien está interesado, aquí está la versión Xamarin.iOS del código Paso 4 de @Garfbargle
fuente
Aquí está la respuesta que siempre ha querido. Puede crear su
CustomView
clase, tener la instancia maestra de la misma en un xib con todas las subvistas y salidas. Luego, puede aplicar esa clase a cualquier instancia en sus guiones gráficos u otros xibs.No es necesario jugar con el propietario del archivo, ni conectar puntos de venta a un proxy o modificar el xib de una manera peculiar, o agregar una instancia de su vista personalizada como una subvista de sí mismo.
Solo haz esto:
UIView
aNibView
(o deUITableViewCell
aNibTableViewCell
)¡Eso es!
Incluso funciona con IBDesignable para representar su vista personalizada (incluidas las subvistas de xib) en el momento del diseño en el guión gráfico.
Puede leer más sobre esto aquí: https://medium.com/build-an-app-like-lego/embed-a-xib-in-a-storyboard-953edf274155
Y puede obtener el marco de código abierto BFWControls aquí: https://github.com/BareFeetWare/BFWControls
Tom 👣
fuente