IBDesignable视图渲染超时

从第一个XCode 6 / iOS 8 beta版本开始,我一直在开发和closures一个应用程序几个月。 我最喜欢的function之一是实时渲染,使用Swift中的@IBDesignable标签。

我没有能够得到一个单一的东西来生活渲染。 我想这一定是因为它是一个testing版本,所以我决定等待完整的版本出来再试一次。 它仍然失败。 然后我想,在我的代码中可能会有testing版的文物,所以我放弃了它,并开始新鲜。 它仍然不起作用。 当然,错误现在稍微描述一下。

这是我的代码:

 import UIKit @IBDesignable class MyButton : UIButton { let UNPRESSED_COLOR = UIColor(red: 221.0/256.0, green: 249.0/256.0, blue: 14.0/256.0, alpha: 1.0) let PRESSED_COLOR = UIColor(red: 166.0/256.0, green: 187.0/156.0, blue: 11.0/256.0, alpha: 1.0) var buttonColorValue: UIColor let TEXT_COLOR = UIColor(red: 72.0/256.0, green: 160.0/256.0, blue: 5.0/256.0, alpha: 1.0) required 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() } } 

以下是我在故事板中使用其中一个button创build的错误:

 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. 

正如你在我的代码中看到的,我最初想要这个button被四舍五入。 我认为这可能是这个问题的原因,但是让我吃惊的是,苹果会devise一个效率低下的圆angular矩形绘制algorithm。 我切换到简单的设置颜色,并按原样绘制矩形。 仍然有问题。

我想(无论如何),我有一件小事情,我做错了,因为我GOOGLE了,没有其他人似乎有这个问题。 似乎可能是某种无限循环?

这对我来说并不是必须要继续下去的,但是实时渲染工作会使开发速度更快,更容易,因为我将能够看到我的界面并testing它们,而无需运行它们。

在此先感谢任何人如何解决这个问题的远程线索。

显然我需要重写init(frame: CGRect)init(code: NSCoder)

得到它的工作! 如果有人可以解释为什么这不起作用,那会很好。 否则,我很好。

虽然这可能不是一个真正有用的答案,但是我发现在为这个半小时寻找一个解决scheme之后,一个简单的closures和重新打开的Xcode就完成了这个诀窍 – 如果你还没有尝试过这个方法,那就试一试吧!

确保你重写prepareForInterfaceBuilder来解决这个问题。

 @IBDesignable class SomeView: UITableView { @IBInspectable var something: Int? { didSet { setup() } } required 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 } } 

有同样的问题,但一看这个伟大的文章。 它解决了我的问题。

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

简而言之

在xcode中获取这些选项

在这里输入图像说明

做一个这样的属性:

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

对我来说,这个错误原来是由于我的一个@IBInspectable属性阻塞了对sqlite数据库(使用CoreData)的调用。

我的代码最初查询数据库,然后使用dispatchAsync根据查询结果设置标签的值。 我改变了它,以便查询也在dispatchAsync块中启动。 错误立即消失。

如果其他人遇到这个错误,我build议检查在devise阶段执行的任何代码(构造函数或用@IBInspetable标记的计算属性)。 如果有阻塞码(networking操作,数据库访问等),可能会导致超时错误。 希望这可以帮助。