IBDesignable View Rendering agota el time de espera

He estado trabajando en una aplicación de forma intermitente durante unos meses, comenzando con la primera versión beta de XCode 6 / iOS 8. Una de mis funciones favoritas agregadas es la renderización en vivo, posible gracias a la label @IBDesignable en Swift.

No he podido get una sola cosa para renderizar en vivo. Pensé que debió ser porque era una versión beta, así que decidí esperar a que salga la versión completa para intentarlo de nuevo. Todavia faltaba Supuse entonces que podría haber artefactos de las versiones beta en mi código, así que lo deseché y comencé fresco. Todavía no funciona. Por supuesto, los errores son un poco más descriptivos ahora.

Aquí está mi código:

 import UIKit @IBDesignable class MyButton : UIButton { let UNPRESSED_COLOR = UIColor(networking: 221.0/256.0, green: 249.0/256.0, blue: 14.0/256.0, alpha: 1.0) let PRESSED_COLOR = UIColor(networking: 166.0/256.0, green: 187.0/156.0, blue: 11.0/256.0, alpha: 1.0) var buttonColorValue: UIColor let TEXT_COLOR = UIColor(networking: 72.0/256.0, green: 160.0/256.0, blue: 5.0/256.0, alpha: 1.0) requinetworking init(coder: NSCoder) { self.buttonColorValue = UNPRESSED_COLOR super.init(coder: coder) // Initialization code self.setTitleColor(TEXT_COLOR, forState: UIControlState.Normal) self.setTitleColor(TEXT_COLOR, forState: UIControlState.Highlighted) self.setTitleColor(TEXT_COLOR, forState: UIControlState.Selected) } override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { super.touchesBegan(touches, withEvent: event) buttonColorValue = PRESSED_COLOR self.setNeedsDisplay() } override func touchesEnded(touches: NSSet, withEvent event: UIEvent) { super.touchesEnded(touches, withEvent: event) buttonColorValue = UNPRESSED_COLOR self.setNeedsDisplay() } override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) { super.touchesCancelled(touches, withEvent: event) buttonColorValue = UNPRESSED_COLOR self.setNeedsDisplay() } override func drawRect(rect: CGRect) { buttonColorValue.setFill() let ctx = UIGraphicsGetCurrentContext() CGContextFillRect(ctx, rect) //UIBezierPath(roundedRect: rect, cornerRadius: 5.0).fill() } } 

Aquí están los errores que obtengo cuando bash build con uno de estos botones en mi guión gráfico:

 IB Designables: Failed to update auto layout status: Interface Builder Cocoa Touch Tool crashed IB Designables: Failed to render instance of MyButton: Rendering the view took longer than 200 ms. Your drawing code may suffer from slow performance. 

Como puede ver en mi código, originalmente quería que este button se networkingondeara. Supuse que este podría ser el motivo de este problema, aunque me sorprendió que Apple diseñara un algorithm de dibujo de rectángulo networkingondeado que era ineficiente. Cambié a simplemente establecer el color y dibujar el rectángulo tal como está. Todavía tenía problemas.

Me imagino (espero, de todos modos) que hay una pequeña cosa que estoy haciendo mal, porque he buscado en Google y no hay nadie más que parezca tener este problema. ¿Parece que podría ser algún tipo de bucle infinito?

No es algo que sea necesario para mí continuar, pero get la renderización en vivo para trabajar hará que el desarrollo sea mucho más rápido y fácil para mí, porque podré ver mis interfaces y probarlas sin tener que ejecutarlas.

Gracias de antemano a cualquier persona que tenga una pista remota sobre cómo resolver esto.

Al parecer, necesitaba anular init(frame: CGRect) junto con init(code: NSCoder) .

¡Lo tengo funcionando! Si alguien pudiera explicar por qué esto no funcionaba, sería genial. De lo contrario, estoy bien aquí.

Aunque esto podría no ser una respuesta útil, descubrí que después de search una solución para esto durante media hora, un simple cierre y reapertura de Xcode hizo el truco, ¡si aún no lo has intentado, dale una oportunidad!

Asegúrese de anular prepareForInterfaceBuilder para resolver esto.

 @IBDesignable class SomeView: UITableView { @IBInspectable var something: Int? { didSet { setup() } } requinetworking init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) setup() } override init(frame: CGRect, style: UITableViewStyle) { super.init(frame: frame, style: style) setup() } override func prepareForInterfaceBuilder() { super.prepareForInterfaceBuilder() setup() } func setup() { // do sth } } 

Tuve el mismo problema pero a una ojeada a este gran artículo. Resolvió mi problema.

http://nshipster.com/ibinspectable-ibdesignable/

En breve

Para get estas opciones en xcode

introduzca la descripción de la imagen aquí

Haga una propiedad como esta:

 @IBInspectable var cornerRadius: CGFloat = 0 { didSet { layer.cornerRadius = cornerRadius layer.masksToBounds = cornerRadius > 0 } } 

Para mí, este error se debió a una llamada de locking a una database sqlite (usando CoreData) en una de mis properties @IBInspectable.

Mi código originalmente consultó la database y luego usó dispatchAsync para establecer el valor de una label en function de los resultados de la consulta. Lo cambié para que la consulta también se lanzara en el bloque dispatchAsync . El error desapareció de inmediato.

Si alguien más está teniendo problemas con este error, sugiero revisar cualquier código que se ejecutaría durante la fase de layout (constructores o properties computadas marcadas con @IBInspetable). Si hay algún código de locking (operaciones de networking, acceso a la database, etc.), podría estar causando el error de time de espera. Espero que esto ayude.